风格迁移网络

生成网络与损失网络

快速风格迁移的网络结构包含两个部分。一个是生成网络(Transformation Network),一个是损失网络(Loss Network)。生成网络是将输入图像进行风格迁移后输出,损失网络用以计算生成图像的内容损失和风格损失。

对于生成网络,本质上是一个卷积神经网络,但不采用池化层,取而代之的是用步幅卷积或微步幅卷积做网络内的上采样或下采样。神经网络有五个残差块组成,除了最末的输出层以外,所有的非残差卷积层都跟着一个空间性的Instance NormalizationRELU的非线性层(Instance Normalization正则化是用来防止过拟合,RELU防止梯度消失)。最末层使用一个缩放的Tanh来确保输出图像的像素在[0,255]之间。除了第一层和最后一层采用9x9的卷积核(kernel),其他所有卷积层都用3x3的卷积核。

损失网络φ定义内容损失(content loss)和一个风格损失(style loss),分别衡量内容和风格上的差距。对于每一张输入的图片x我们有一个内容目标yc一个风格目标ys,对于风格转换,内容目标yc是输入图像x,输出图像y,应该把风格ys结合到内容x=yc上。系统为每一个目标风格训练一个网络,为确保所用到的损失函数能更好的衡量图片感知及语义上的差距,需要使用一个预先训练好用于图像分类的CNN,这个CNN已经学会感知和语义信息编码,这正是图像风格转换系统的损失函数中需要做的。所以使用了一个预训练好用于图像分类的网络φ,来定义系统的损失函数。之后使用同样是深度卷积网络的损失函数来训练我们的深度卷积转换网络。损失网络虽然也是卷积神经网络(CNN),但是参数不做更新,只用来做内容损失和风格损失的计算,训练更新的是前面的生成网络的权值参数。所以从整个网络结构上来看输入图像通过生成网络得到转换的图像,然后计算对应的损失,整个网络通过最小化内容和风格损失不断地更新前面的生成网络权值。

在求损失的过程,从预训练好的损失网络中提取高级特征,使用感知损失函数代替逐像素损失函数。在训练的过程中,感知损失函数比逐像素损失函数更适合用来衡量图像之间的相似程度。

(1)内容损失

内容的损失计算用VGG计算得到的高级特征来表示,因为VGG模型本来是用于图像分类的,所以一个训练好的VGG模型可以有效的提取图像的高级特征(内容)。计算的公式如下:

                                           

如果较低的层的特征损失最小,往往能够生成在视觉上和y不太能区分的图像。用一个特征损失来训练我们的图像转换网络能让输出非常接近目标图像y,但也并不是让它们完全的匹配。

(2)风格损失

内容损失惩罚了输出的图像(当它偏离了目标y时),所以同样的,我们也希望对输出的图像去惩罚风格上的偏离:颜色,纹理,共同的模式等方面。为了达成这样的效果,一些研究者定义出了Gram矩阵。在卷积神经网络中,每个特征图的大小一般是 MxNxC这种大小,MxN表示的是一个矩阵的大小,C表示厚度,通俗说就是有CMxN 这样的矩阵叠在一起。

首先Gram矩阵的大小是由特征图的厚度决定的,等于CxC。首先把特征图中第i层和第j层取出来,得到了两个MxN的矩阵,然后将这两个矩阵对应元素相乘然后求和得到Gram(i,j)。这样 Gram 中每个元素都可以表示两层特征图的一种组合,就可以定义为它的风格。然后风格的差异就是两幅图的 Gram 矩阵的差异,与内容的差异的计算方法一样,通过这两个矩阵的差就可以量化风格的差异。

训练阶段:选定一张风格图片。训练过程中,将数据集中的图片输入网络,生成网络生成结果图片y,损失网络提取图像的特征图,将生成图片y分别与目标风格图片ys和目标输入图片(内容图片)yc做损失计算,根据损失值来调整生成网络的权值,通过最小化损失值来达到目标效果。

执行阶段:给定一张图片,将其输入已经训练好的生成网络,输出这张图片风格转换后的结果。

2.2 实现效果

我厦的颂恩楼,结合各种风格,效果如下:

风格迁移网络_第1张图片

风格迁移网络_第2张图片

其他建筑与风格结合效果如下所示:

图2-1 单风格迁移网络

风格迁移网络_第3张图片

上面的效果发现,原图的颜色被风格图改变,我们可以尝试不改变原来图像的颜色,只迁移风格图的纹理,得到效果如下所示:

图2-2 迁移纹理不迁移颜色

通过python的flask,制作出GUI界面如下:

风格迁移网络_第4张图片

通过控件来改变各种风格的结合,以及每个风格的比例:

风格迁移网络_第5张图片

图2-4 多风格迁移界面设计(左边风格选择,右边为输出)

你可能感兴趣的:(学习笔记,项目笔记)