AnimeGAN 论文阅读笔记

2,039 阅读8分钟

封面

本文首发于个人博客:xerrors.fun/anime-gan-n…

欢迎访问更多文章:xerrors.fun


首先看摘要

In this paper, a novel approach for transforming photos of real-world scenes into anime style images is proposed, which is a meaningful and challenging task in computer vision and artistic style transfer. The approach we proposed combines neural style transfer and generative adversarial networks (GANs) to achieve this task. For this task, some existing methods have not achieved satisfactory animation results. The existing methods usually have some problems, among which significant problems mainly include: 1) the generated images have no obvious animated style textures; 2) the generated images lose the content of the original images; 3) the parameters of the network require the large memory capacity. In this paper, we propose a novel lightweight generative adversarial network, called AnimeGAN, to achieve fast animation style transfer. In addition, we further propose three novel loss functions to make the generated images have better animation visual effects. These loss function are grayscale style loss, grayscale adversarial loss and color reconstruction loss. The proposed AnimeGAN can be easily end-to-end trained with unpaired training data. The parameters of AnimeGAN require the lower memory capacity. Experimental results show that our method can rapidly transform real-world photos into highquality anime images and outperforms state-of-the-art methods.

本文提出了一种将真实场景的照片转换为动画风格的新方法,这是计算机视觉和艺术风格转换领域中一个有意义和挑战性的任务。我们所提出的方法结合了神经风格转换和生成对抗网络(GANs)来实现这一任务。对于这一任务,现有的一些方法并没有取得令人满意的转换效果。现有的方法通常存在一些问题,其中重要的问题主要包括:1)生成的图像没有明显的动画风格纹理;2)生成的图像丢失了原始图像的内容;3)网络参数要求较大的内存容量。在本文中,我们提出了一种新型的轻量级生成对抗网络,称为AnimeGAN,以实现快速的动画风格转换。此外,我们进一步提出了三种新颖的损失函数,使生成的图像具有更好的动画视觉效果。这些损失函数是灰度样式损失、灰度对抗损失和颜色重建损失。提出的 AnimeGAN 可以很容易地与未配对的训练数据进行端到端的训练。AnimeGAN的参数对内存的要求较低。实验结果表明,我们的方法可以快速地将真实照片转换为高质量的动画图像,并优于最先进的方法。

简而言之,目前业界有人在做,但是都不行,有几个小问题要解决,通过提出来新的网络、新的损失函数,目前做到了最好。

1. Introduction

各个算法的不足之处

论文认为目前的算法都存在以下几个问题。这也确实是目前这个领域的通病,每一篇论文几乎都在考虑解决这几个问题:

These important problems mainly include: 1) the generated images have no obvious animated style textures; 2) the generated images lose the content of the original photos; 3) a large number of the parameters of the network require more memory capacity.

  1. 生成的图像没有明显的动画风格纹理;
  2. 生成的图像丢失了原照片的内容信息;
  3. 网络参数过大,对内存容量要求更高;

作者提出了哪些解决方案

为了解决这些问题,作者提出了一个新的轻量级 GAN 网络,更小更快。

The proposed AnimeGAN is a lightweight generative adversarial model with fewer network parameters and introduces Gram matrix to get more vivid style images.

论文提出的 AnimeGAN 是一个轻量级的生成对抗模型,具有较少的网络参数,并引入了Gram矩阵来生成更生动的风格图像。为了生成更好的视觉效果的图像,提出了三个损失函数:灰度样式损失、颜色重建损失和灰度对抗损失。在生成网络中,「灰度风格损失」和「颜色重建损失」使生成的图像具有更明显的动漫风格,并保留了照片的颜色。识别网络中的「灰度对抗损失」使生成的图像具有鲜明的色彩。在鉴别器网络中,我们也使用了 CartoonGAN 提出的促进边缘的对抗损失(edge-promoting adversarial loss)来保留清晰的边缘。

另外,为了使生成的图像具有原始照片的内容,引入了预先训练好的 VGG19 作为感知网络,获得生成的图像和原始照片的深度感知特征的L1丢失。

我的理解:跟 CartoonGAN 使用的方法类似,通过预训练模型可以更好的提取图片的高维信息,这样可以在风格不同的情况之下比较两个照片的差别,毕竟两个图像的风格即使不一样,但是高维的语义信息是一样的。这也就是为什么这几个网络不需要像 Cycle GAN 和 Dual GAN 一样需要同时训练两个模型来保证模型的正常收敛。

其他增强:

  1. 在生成器上执行一个初始化训练,只使用内容丢失Lcon(G, D)对生成网络G进行预先训练,使 AnimeGAN 的训练更容易和更稳定, CartoonGAN 提出的。(没搞懂为什么)
  2. 带有 1×1 卷积核的最后一个卷积层不使用归一化层,并且后面使用的是tanh非线性激活函数。(没搞懂为什么)
  3. 各个模块中使用的激活函数都是 LReLU。

2. Our Method

接下来从网络的架构、损失函数和训练三个方面进行详细的介绍。

网络架构

在看 AnimeGAN 之前,先看一下 CartoonGAN 的模型,PyTorch 实现

CartoonGAN 的模型

AnimeGAN 可以说是在 CartoonGAN 上面进行的改进,PyTorch 实现

生成器的网络可以看作是编解码器网络,标准卷积、深度可分离卷积、残差网络、上采样和下采样模块。

从后面的表述中可以看到这篇论文是大量借鉴了 CartoonGAN 的思想,并在此之上进行了改进,避免了出现棋盘方格纹理;下图是 CartoonGAN 论文中的实验结果,可以清晰的看到出现了方格纹理。

损失函数

首先是对于训练数据的处理,TODO

生成器损失函数主要分为四个部分(公式图片),不同的损失有不同的权重系数,作者所采用的是 300、1.5、3、10:

L(G,D)=ωadvLadv(G,D)+ωconLcon(G,D)+ωgraLgra(G,D)+ωcolLcol(G,D)L(G, D)=\omega_{a d v} L_{a d v}(G, D)+\omega_{\operatorname{con}} L_{c o n}(G, D)+\omega_{g r a} L_{g r a}(G, D)+\omega_{\operatorname{col}} L_{c o l}(G, D)
  1. 对抗损失(adv),是生成器 G 中影响动画转换过程的对抗性损失。
  2. 内容损失(con),是帮助生成的图像保留输入照片内容的内容丢失。
  3. 灰度风格损失(gra),使生成的图像在纹理和线条上具有清晰的动漫风格。
  4. 颜色重建损失(col),使生成的图像具有原照片的颜色。

对于内容丢失和灰度风格丢失,使用预先训练好的VGG19作为感知网络,提取图像的高级语义特征。它们表示为(此公式的图片):

Lcon(G,D)=EpiSdata(p)[VGGl(pi)VGGl(G(pi))1]Lgra(G,D)=EpiSdata(p),ExiSdata(x)[Gram(VGGl(G(pi)))Gram(VGGl(xi))1]\begin{array}{c} L_{c o n}(G, D)=E_{p_{i} \sim S_{d a t a}(p)}\left[\left\|V G G_{l}\left(p_{i}\right)-V G G_{l}\left(G\left(p_{i}\right)\right)\right\|_{1}\right] \\ L_{g r a}(G, D)=E_{p_{i} \sim S_{d a t a}(p)}, E_{x_{i} \sim S_{d a t a}(x)}\left[\| \operatorname{Gram}\left(V G G_{l}\left(G\left(p_{i}\right)\right)\right)\right. \\ \left.-\operatorname{Gram}\left(V G G_{l}\left(x_{i}\right)\right) \|_{1}\right] \end{array}

关于颜色的提取与转换,作者首先将 RGB 通道转换为 YUV 通道,然后对不同通道使用不同的损失计算方法(听着是个好点子),如公式

Lcol(G,D)=EpiSdata (p)[Y(G(pi))Y(pi)1+U(G(pi))U(pi)H+V(G(pi))V(pi)H]\begin{array}{r} L_{c o l}(G, D)=E_{p_{i} \sim S_{\text {data }}(p)}\left[\left\|Y\left(G\left(p_{i}\right)\right)-Y\left(p_{i}\right)\right\|_{1}+\left\|U\left(G\left(p_{i}\right)\right)-U\left(p_{i}\right)\right\|_{H}+\left\|V\left(G\left(p_{i}\right)\right)-V\left(p_{i}\right)\right\|_{H}\right] \end{array}

这里使用了 Huber Loss,不知道是什么?

最终的生成器损失函数 L(G) 可以表示为(此公式的图片):

L(G)=ωadvEpiSdata(p)[(G(pi)1)2]+ωconLcon(G,D)+ωgraLgra(G,D)+ωcolLcol(G,D)\begin{array}{r} L(G)=\omega_{a d v} E_{p_{i} \sim S_{d a t a}(p)}\left[\left(G\left(p_{i}\right)-1\right)^{2}\right]+\omega_{c o n} L_{c o n}(G, D) \\ +\omega_{g r a} L_{g r a}(G, D)+\omega_{c o l} L_{c o l}(G, D) \end{array}

鉴别器使用的损失函数,除了引入 CartoonGAN 提出的促进边缘的对抗损失,使 AnimeGAN 生成的图像具有清晰的重现边缘外,还采用了一种新型的灰度对抗损失,防止生成的图像以灰度图像的形式显示。最后,鉴别器的损失函数表示如此公式的图片:

L(D)=ωadv[EaiSdata(a)[(D(ai)1)2]+EpiSdata(p)[(D(G(pi)))2]+ExiSdata(x)[(D(xi))2]+0.1EyiSdata(y)[(D(yi))2]]\begin{array}{r} L(D)=\omega_{a d v}\left[E_{a_{i} \sim S_{d a t a}(a)}\left[\left(D\left(a_{i}\right)-1\right)^{2}\right]+E_{p_{i} \sim S_{d a t a}(p)}\left[\left(D\left(G\left(p_{i}\right)\right)\right)^{2}\right]\right. \\ \left.+E_{x_{i} \sim S_{d a t a}(x)}\left[\left(D\left(x_{i}\right)\right)^{2}\right]+0.1 E_{y_{i} \sim S_{d a t a}(y)}\left[\left(D\left(y_{i}\right)\right)^{2}\right]\right] \end{array}

关于促进边缘的对抗损失

在 CartoonGAN 的论文中是这样描述的:在以前的 GAN 框架中,判别器 D 的任务是弄清楚输入图像是从生成器生成的还是从真实图像得到的。但是,我们观察到,仅训练判别器 D 来区分生成的图像和真实的卡通图像不足以将照片转换为卡通图像。这是因为卡通图像的重要特征是清晰边缘的呈现,但是这些边缘信息在整个图像中所占的比例通常很小。因此,没有清晰再现的边缘但阴影正确的输出图像可能会骗过判别器。

所以要使判别器十分注重边缘。因此将进行了边缘平滑的卡通图像也送入判别器D中,如公式所示:公式图片

Ladv(G,D)=EciSdata (c)[logD(ci)]+EejSdata (e)[log(1D(ej))]+EpkSdata (p)[log(1D(G(pk)))]\mathcal{L}_{a d v}(G, D)=\mathbb{E}_{c_{i} \sim S_{\text {data }}(c)}\left[\log D\left(c_{i}\right)\right]+\mathbb{E}_{e_{j} \sim S_{\text {data }}(e)}\left[\log \left(1-D\left(e_{j}\right)\right)\right]+\mathbb{E}_{p_{k} \sim S_{\text {data }}(p)}\left[\log \left(1-D\left(G\left(p_{k}\right)\right)\right)\right]

训练细节

提出的 AnimeGAN 可以很容易与未配对的训练数据进行端到端的训练。由于 GAN 模型是高度非线性的,在随机初始化的情况下,优化很容易被困在局部最优解。CartoonGAN 建议,对生成器的预训练有助于加速 GAN 的收敛。因此,只使用内容损失函数Lcon(G, D)对生成网络 G 进行预训练。对一个 epoch 进行初始化训练,学习率设置为0.0001。在 AnimeGAN 的训练阶段,生成器和鉴别器的学习率分别为0.00008和0.00016。AnimeGAN的 epochs 是100,batch size 设置为4。Adam 优化器用来最小化总损失。AnimeGAN 使用 Tensorflow 在 Nvidia 1080ti GPU 上进行训练。

没看懂的:

  1. 文中提到很多 NST 算法都是基于Gram矩阵的匹配统计,从预训练的卷积网络中提取深度特征。没看懂什么意思。
  2. Huber Loss 是什么?

均方误差和绝对值误差的结合。

  1. ablation experiment 是什么?

俗话说就是控制变量法。

参考资料

1. AnimeGAN: a novel lightweight GAN for photo animation | pdf | Tensorflow | PyTorch

2. AnimeGAN v2 | Xin Chen and Gang Liu | TensorFlow | PyTorch

4. CartoonGAN | pdf | Pytorch | Pytorch2 | Tensorflow

5. 一文读懂 YUV 的采样与格式

6. 深入理解深度可分离卷积 - GiantPandaCV