神经网络算法用于风格转化
深度神经网络是一个处理图片的强大算法,他可以将图片中的各种特征提取出来,浅层的网络层用于提取图片中的各个简单的特征,比如横线,曲线等等,网络深层提取图片中更高级的特征,如曲线,圆,各种复杂形状。基于网络的这种特征,我们可以提取一些风格图片(style image)的纹理特征,将这些纹理特征融合到我们的内容图片(content image)中。
如图中所示,图片在每一层网络在分别重构风格图片和内容图片,内容图片重构时的影响在低层的网络中有更好的表达(比如低层的图片a,b,c),网络越深就会经历更多降采样,如maxpooling,导致图片的像素降低如图片d e ,而风格图片的重构时都会在不同网络层中,表现出不同程度的风格特征(纹理特征),在实际应用中,会取不同网络层的重构结合在一起,用来代表图片的风格,比如可能会取conv1_1,那边表现出来的就是a图片中的形式,同理:
conv1_1 conv2_1 对应b图片
conv1_1 conv2_1 conv3_1 对应c图片,
conv1_1 conv2_1 conv3_1 conv4_1 对应d图片,
conv1_1 conv2_1 conv3_1 conv4_1 conv5_1 对应e图片
可以看出重构的风格图片在更深层的网络上,表现出更为复杂的纹理特征和颜色特征,这都是因为卷积网络随着网络深度的增加,获得的特征、卷积的感受野和纹理的复杂都在增加。
在合成图片时,就可以用合成的图片来吻合上面获得的风格图片,进行我们熟悉的反向传播来迭代图片,让合成的图片更吻合风格图片的内容。图片风格是多维度的,包含了网络结构中不同网络层的特征重构。
当然,可以选取不同层的特征来合成图片,以获得不同的视觉体验:在选取低层网络来构成风格时,合同图片表现出比较局部的特征(图片更像是一块块,一点点,一条条线组成的,),而选取高层网络时,合成图片会更加平滑,连续,如下图所示。
该算法在数学表达层面上,把内容误差和风格误差区分开来,形成两个独立的不同的表达式。由上图也可以看出,风格图片和内容图片不是能够完美的融合,他们之间都会有一定的权重比例,可以从图片矩阵的列看出,内容图片的权重增加时,合成图片中内容图片的成分会增加。
在算法层面,我们会计算同一层网络上,不同kernel提取的特征之间的相关性来表示风格图片的纹理结构,这也就是图片的风格。
算法实现
算法的实现是基于经典卷积网络VGG-Network,包含16个卷积层和5个池化层,这里不需要任何全连接层(我们只需要提取图片的特征,而不需要通过全连接层来做分类或者识别,而且原文作者发现,在图像合成时,使用average pooling layer会让梯度更好的传播,而且会得到更好的图片,所以建议使用average pooling layer)。
对一个卷积网络,第
l
l
层有个filter,这个
Nl
N
l
个卷积核的大小为
Ml
M
l
,这里的
Ml
M
l
的大小为该filter输出的长*宽,所以该
l
l
层的输出可以表示为一个矩阵,我们用
Flij
F
i
j
l
表示第
i
i
个filter的位置上的输出(这里filter的输出可以理解成已经把二维的filter输出扁平化为一行向量,矩阵
Fl
F
l
可以看做是该
l
l
层所有filter输出的集合,一行代表一个filter的输出,大小等于长*宽),内容图片和合成图片
x⃗
x
→
在
l
l
上的输出分别为,
Fl
F
l
他们之间的内容误差可以表示为
该误差函数关于合成图像输出的导数为
从第一张图中可以看到,这里 l l 的取值不一样,会导致我们得到的也不一样,在反向传播过后生成的图像 Fl F l 也会不一样。
对于风格误差,会用到Gram Matrix,这个矩阵可以表示不同kernel之间的特征向量映射(vectorised feature map)的相关性, Gl∈RNl∗Nl G l ∈ R N l ∗ N l ,其中 Nl N l 是 l l 层上filter的数量,那么Gram Matrix中的位置上的元素定义为:
其中 Flik,Fljk F i k l , F j k l 表示 l l 层上第个filter,和第 j j 个filter输出图像对应位置上的元素,对应位置上的元素相乘之后求和得到Gram Matrix对应位置上的值。
那么风格图像 a⃗ a → 和合成图像 x⃗ x → 对应在 l l 层上的风格表示为和 Gl G l ,那么 l l 层上的Style Loss为:
即两个图像在 l l 层上的Gram Matrix矩阵相减后的平方和,再乘上相关系数。
那么总的style loss就是:
其中 wl w l 是不同网络层上的权重。
Style Loss El E l 关于生成图像在l层上的激活的导数为:
低层网络的导数,用反向传播能很容易的求解。上文第一张图中,就用风格表达式重构了几种风格。
最终,我们需要优化的loss函数就是Content Loss 和 Style Loss的总和。
其中 p⃗ p → 表示内容图片, a⃗ a → 表示风格图片, x⃗ x → 表示合成图片。 α α 和 β β 分别表示了content loss和style loss的权重,他们的比值映像合成图像的视觉体验(可以参考上文第二图)。有了目标函数,就用反向传播算法,将目标函数一步步优化,使得合成的图片达到想要的视觉效果。
总结
这篇论文阐述了一种图片的合成算法,将一张内容图片(content image)和风格图片(style image)合成我们想要的图片,算法从内容图片中提取内容,利用了content loss(在某一个相同网络层上输出的内容图片和合成图片作差),而从风格图片中提取风格则利用GramMatrix,它是一个表示相关性的矩阵,通过同一层上不同filter之间的相关性来表示相应的风格,而且一般情况下需要用多个网络层输出GramMatrix,使得风格更加饱满,GramMatrix组成style loss。 最后我们的目标函数是content loss + style loss,当然这两项都有相应的权重以调整合成图像的视觉效果。利用优化算法,将目标函数减小,得到最终的合成图像。