【论文总结】深度网络算法用于风格转化

神经网络算法用于风格转化

原文:A Neural Algorithm of Artistic Style

深度神经网络是一个处理图片的强大算法,他可以将图片中的各种特征提取出来,浅层的网络层用于提取图片中的各个简单的特征,比如横线,曲线等等,网络深层提取图片中更高级的特征,如曲线,圆,各种复杂形状。基于网络的这种特征,我们可以提取一些风格图片(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 层有Nl 个filter,这个Nl 个卷积核的大小为Ml ,这里的Ml 的大小为该filter输出的长*宽,所以该l 层的输出可以表示为一个矩阵FlRNlMl ,我们用Fijl 表示第i 个filter的j 位置上的输出(这里filter的输出可以理解成已经把二维的filter输出扁平化为一行向量,矩阵Fl 可以看做是该l 层所有filter输出的集合,一行代表一个filter的输出,大小等于长*宽),内容图片p 和合成图片xl 上的输出分别为Pl ,Fl 他们之间的内容误差可以表示为

(3)Lcontent(p,x,l)=12i,j(FijlPijl)2

该误差函数关于合成图像输出的导数为
(4)LcontentFijl={(FlPl)ij    if   Fijl>00     if     Fijl<0

从第一张图中可以看到,这里l 的取值不一样,会导致我们得到的Pl 也不一样,在反向传播过后生成的图像Fl 也会不一样。
对于风格误差,会用到Gram Matrix,这个矩阵可以表示不同kernel之间的特征向量映射(vectorised feature map)的相关性,GlRNlNl ,其中Nll 层上filter的数量,那么Gram Matrix中的位置i,j 上的元素定义为:
(5)Gijl=kFiklFjkl

其中Fikl,Fjkl 表示l 层上第i 个filter,和第j 个filter输出图像对应位置k 上的元素,对应位置上的元素相乘之后求和得到Gram Matrix对应位置上的值。
那么风格图像a 和合成图像x 对应在l 层上的风格表示为AlGl ,那么l 层上的Style Loss为:
(6)El=14Nl2Ml2i,j(GijlAijl)2

即两个图像在l 层上的Gram Matrix矩阵相减后的平方和,再乘上相关系数。
那么总的style loss就是:
(7)Lstyle(a,x)=l=0LwlEl

其中wl 是不同网络层上的权重。
Style Loss El 关于生成图像在l层上的激活的导数为:
(8)ElFijl={1Nl2Ml2((Fl)T(GlAl))ji    if   Fijl>00     if     Fijl<0

低层网络的导数,用反向传播能很容易的求解。上文第一张图中,就用风格表达式重构了几种风格。
最终,我们需要优化的loss函数就是Content Loss 和 Style Loss的总和。
(9)Ltotal(p,a,x)=αLcontent(p,x)+βLstyle(a,x)

其中p 表示内容图片,a 表示风格图片,x 表示合成图片。αβ 分别表示了content loss和style loss的权重,他们的比值映像合成图像的视觉体验(可以参考上文第二图)。有了目标函数,就用反向传播算法,将目标函数一步步优化,使得合成的图片达到想要的视觉效果。

总结

这篇论文阐述了一种图片的合成算法,将一张内容图片(content image)和风格图片(style image)合成我们想要的图片,算法从内容图片中提取内容,利用了content loss(在某一个相同网络层上输出的内容图片和合成图片作差),而从风格图片中提取风格则利用GramMatrix,它是一个表示相关性的矩阵,通过同一层上不同filter之间的相关性来表示相应的风格,而且一般情况下需要用多个网络层输出GramMatrix,使得风格更加饱满,GramMatrix组成style loss。 最后我们的目标函数是content loss + style loss,当然这两项都有相应的权重以调整合成图像的视觉效果。利用优化算法,将目标函数减小,得到最终的合成图像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章