作者:BYREAD315794103 | 来源:互联网 | 2023-09-16 22:15
更多内容可关注我的知乎专栏:https:zhuanlan.zhihu.comikerpeng下面要介绍的这几种生成模型,主要集中在两种任务当中。一种是风格转换,另一种是跨域数据之间
更多内容可关注我的知乎专栏:https://zhuanlan.zhihu.com/ikerpeng
下面要介绍的这几种生成模型,主要集中在两种任务当中。一种是风格转换,另一种是跨域数据之间的转换(Cross-Domain Image-to-image)。使用的网络结构主要是自动编码器以及GAN。
StarGAN : yunjey/StarGAN
StarGAN将一个数据集上面学习到的知识转移到另一个数据集上面。如图所示:
输入单张图像,同时输入你想要得到的表情类别。于是该算法就给你生成这样的图片。值得注意的是在输入数据的域(domain)当中不存在这些表情的数据,而这些表情完全是从另一个数据域当中学习到的。
这篇文章最大的特点是使用单个的生成器实现了多个数据域当中的转换。并且生成的图片的质量相当的高。具体来说明该网络的优势。假设你有来至于4个不同的域的数据集,想要实现他们相互之间的转换,那么需要至少的训练12个生成器。然后,这篇文章巧妙的将 域的标签也作为输入,于是只需要单个的生成器就可以实现不同数据之间的转换:
如图所示,其中的G表示的生成器,其中的不同数字表示的是数据集的域的标号。图的左边是传统的方法,需要12个生成器,而右边表示的就是是StarGAN的算法,这里将域的编号也输入要网络当中,实现各个数据集之间的转换只需要一个生成器。
具体来看一下网络的结构。如上图所示, StarGAN当中还是包括了一个判别器(G)和一个生成器(D)。如图中的(b)所示,这个G的输入是一张图片和一个目标域的编号(实际训练当中使用的是一个掩码),由此生成一张图片Fake image A。那么图片A可以从两个方面来优化调整网络:一方面,把这张图片加上输入图片的域(original domain)作为G的输入,生成另一张图片B,这个过程可以看作是一个重构的过程,那么重构的误差要最小;另一个方面,生成的骗倒判别器。也是两个方面要骗倒才好:一方面是真伪,另一方面是域的标签。这样损失函数也就很清楚了。1. 对抗误差L_adv,也就是一般性的GAN的损失函数;2. 重构误差L_rec,只和G相关,为了增加重构图像的质量;3. 域的分类损失,L_cls。因此,我们可以得到如下的损失函数分别对分类器以及判别器进行训练更新。
UNIT:无监督的 Image-to-image translation :mingyuliutw/UNIT
这篇文章解决的还是不同数据集之间的生成转换的问题,作者将其定义为一个知道边缘概率密度要学习联合概率密度的问题。显然这是一个有无限解得问题。那么为了解决这个问题,作者给出了不同的数据空间共享同一个隐空间的假设,将问题转化为求解一个隐含空间的问题。文章结合了变分自编码器和GAN,构建了一个无监督的不同数据集之间的生成网络。得到的效果如图所示:
该算法可以实现不同场景的转换,例如上图的图像中,实现了从白天到夜晚的场景的转换。此外类似于季节的变换,交通标志的变换等等。可以看出该算法可以对自动驾驶进行攻击!
显然很多的任务都可以归结为一个image-to-image的问题。例如,超分辨率的问题,给图画上色的问题,图像风格传输问题。根据是否存在图像对,这个任务又可以分为监督问题和无监督问题。监督问题相对简单,就是在配对的情况下,用神经网络拟合出一个映射关系;无监督问题相对比较的困难,但是显然存在更多的应用场景。而本文的算法就是一个无监督的问题。
如图所展示的是该算法在人物的外貌方面的改变,包括头发的颜色,人物的表情,穿戴物品生理特征等等的改变。人物和所使用的风格处于两个不同的数据集,不存在配对的图象对。但是本文的无监督的效果也非常的逼真。那么来看一下算法的原理。
如图所示,左边的图(a)是算法的核心思想。作者认为来至于两个不同的数据集的数据可以被映射到同一个隐含空间。于是作者设计了一个包含了VAE的GAN网络,如右边的(b)所示,来自于不同数据域的数据,通过不同的自编码网络将数据映射到一个隐含层空间,而从隐含层到不同数据域的重构采用的是两个不同的对抗网络的生成器部分;对于两种数据类型的网络,显然输出4种不同类型的网络。最后判别器对重构的结果进行判断,判断其真实的数据源,由此来判断生成的数据的质量,同时通过损失更新网络参数。
因此,整个网络结构由六个部分构成。其损失函数自然应该包括VAE 和GAN 应该有的损失函数,如下面的左边四项;此外作者还加入了另外两项,所谓的循环一致性(cycle consistency)。
那么我们重点看看这个循环一致性。为什么要加入这两项呢?因为如果把G生成的数据再一次作为输入给到VAE,那么再一次通过G得到的输出应该和原图(生成它的那个图)保持一致,如其中的两个负号项所表示的;实际上,这个过程便形成了一个环。当然生成的Z也应该在隐空间当中,如其中的KL散度所表示的。
当然个人觉得其中的第一项多余~
MUNIT:NVlabs/MUNIT
这篇文章实际上就是上一篇文章的扩展,这种扩展被称作是多模态数据之间的转换。UNIT认为不同的数据集可以共享同一个隐空间,而MUNIT更进一步,他认为他们能够共享的这个空间叫做内容空间(content),而同时他们应该存在着一种彼此差异的空间,他将这个称作风格空间(style)。如下图所示:
从第一个数据域当中采集到一个样本为豹,它实际上可以被分解为两个部分:内容部分以及风格部分。如果我比较完美的完成了上述的分解,那么,从上述结果的内容空间当中采样,同时从另一个数据空间构成的风格空间采样,结合二者进行重构,我们是不是就能够得生成另一个空间的数据呢?并且这也是一种无监督的算法,具有更好的应用场景。我们来看一下生成的一些结果:
完成的任务的种类也非常地多实现得效果也非常的好。如上图所示,MUNIT可以实现从轮廓到着色的过程;同时也可以实现风景图像的季节变换。这里所生成的图像都是原来的数据库当中不存在的图像。我们还是从算法层面看一下是如何实现的。
如图所示,左边是在同一个数据域当中的分解和重构。这里同样还是两个自编码器,但是不同以往的是,编码的过程中通过两部分网络映射到隐空间,因此隐空间中被分解为内容和风格两个部分的特征;因此,在解码的时候便是从这两个部分进行重构。再来看右边的部分,它表示的是在不同的数据域之间的变换。1数据域当中的数据x1分解得到内容部分c1,那么采样2数据域当中的风格s2,二者结合重构出一个数据x1->2,那么应该满足的约束条件,也就是我们的损失函数是什么呢?主要应该有两点:1. 重构出来的数据x1->2 应该尽量的接近2数据域当中的分布;2. 如果通过再对数据x1->2 进行编码(也就是输入到),得到的内容以及风格部分应该尽量的接近输入。因此我们得到如下的损失函数,最大化函数来更新D网络参数,最小化函数来更新E和G网络。除了隐空间的分解之外,本质上和UNIT没太大区别 。
在模型的损失函数当中,除了GAN应该有的(上述表达式当中的前两项) 对抗损失函数之外,还应该保证图像的重构也非常的准确(上述表达式当中的第三项)。另外,假设我从1数据域使用2的风格生成了一张图像,那么把该图像再一次将这个图片输入到2的编码器,输出的内容应该和1数据当中的内容相似,输出的风格应该和2数据当中的相似(上述表达式当中的最后两项)。
其中,编码部分通过两个编码器对图像的内容和风格分别进行编码,分别编成64D和8D的向量。而在解码部分实际上你会发现图像的重构主要还是来自于内容部分,而风格部分通过一个全连接得到256D的向量,这个向量被用来‘指导’图像重构过程当中的上采样。这个论文,尤其是这个自编码器和风格传输的任务越来越接近了,而且界限也不是那么清晰了。你可以想像将该图片之输入到内容网络部分,使用另一张图片作为风格网络部分的输入,这个重构会得到什么样的结果呢?如果增加风格网络的权重呢?
Photorealistic image stylization: NVIDIA/FastPhotoStyle
如果你早期关注图像的风格传输这个领域,那你对于下面的这个结果一定不陌生。图中的
A表示的是输入的原始图像,其余图像的左下角表示的是想要学习到的风格,BCD当中的大图表示的就是最终的效果。这就是两三年前的效果,在当时还是引起了不小的轰动的。但是如果我们今天再来看这些结果感觉还是差的比较多的。
如果我们用作者甚至前面几个任务当中的概念来解释这个问题,那就是并没有将内容和风格在隐空间当中分离开来,导致风格的传输不仅传递了风格,甚至将一些内容传递了过去。并且部分的掩盖了原来的内容。上面的效果感觉就像是一幅模糊不清的油画。当然,也不乏有很强的艺术气息。而这篇文章当中的风格传输被称作是:Photorealistic 的风格传输。也就是输出的效果更加的逼真,接近于真实的相片。那我们来看一些生成的结果:
你被吓倒了吗? 我是真的被吓到了。这里的第一列表示的是想要得到的风格,第二列表示的是内容图片。而最右边的那一栏就是风格传输的结果。真是被惊艳到了。感慨风格传输居然到了这种程度了。那我们还是来看一下是怎么实现的。
最开始的算法采用的是Gram矩阵来代替风格的方式,这种方式显然是比较粗暴的。而后来出现了一些通过匹配输出和输入的梯度来微调输出的结果。而这一篇文章是这样做的。
实际上本文就是从NIPS2017的文章WCT上面改进的。文章主要的思想是这样的:采用一个自编码器来完成这个风格转换的任务;其中的编码器E采用VGG-19并且固定网络参数,然后来训练一个对称的解码器D。损失函数则是保证重构的图像接近于输入内容Ic,同时对重构的图像提特征风格要接近风格输入Is。表达式当中的两项分别对内容和风格进行约束。
内容部分的约束项不难理解,但是WCT算法采用什么来衡量风格呢?该算法在特征空间对输入求解协方差矩阵,实际上仍然类似于Gram矩阵的做法。而本文只有稍微的不同:作者使用unpooling层代替了D当中的上采样层,此外在对应的层还加入了一个pooling的掩码。这个掩码记录了原来的获得最大值的位置。并且为了消除原来的人工痕迹,作者还做了后续的平滑网络。
还是先看WCT是怎么做的:先后输入风格图片Is以及内容图片Ic,通过编码器E得到对应的特征Hs和Hc。然后对于内容和风格的特征图都求解协方差矩阵,然后构成两个分别和内容以及风格相关的矩阵Ps 和Pc,然后对内容进行转换。转换后的结果Hcs,通过解码器D进行重构,得到的结果通过上述的损失函数对解码器D进行更新。具体的其中的各个量表示为:
其中:
注意其中协方差矩阵的指数的符号。其中的E 表示的就是分别通过
得到的特征向量构成的矩阵。本质上和最开始的nerual style transfer 当中的Gram矩阵还是一个东西。因此,在损失函数当中,除了要加入重构的图像保持和原图的相似约束之外,还需要加入对风格的约束。也就是这个类似于Gram矩阵的项:
在继承了WCT的算法的基础上,本文还对风格的转换过程进行了平滑。平滑的目的主要是以下的两个方面:1. 保证领域内具有相同内容的像素点保持同样的风格;2. 平滑后的结果也不能和以上风格转化的步骤相差太大。平滑的部分主要是为了保证最终的平滑结果和上个阶段的输出风格结果接近,同时也保证相邻的像素点的颜色也能够接近。
以上~