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

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

原文: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 l 层有Nl个filter,这个 Nl N l 个卷积核的大小为 Ml M l ,这里的 Ml M l 的大小为该filter输出的长*宽,所以该 l l 层的输出可以表示为一个矩阵FlRNlMl,我们用 Flij F i j l 表示第 i i 个filter的j位置上的输出(这里filter的输出可以理解成已经把二维的filter输出扁平化为一行向量,矩阵 Fl F l 可以看做是该 l l 层所有filter输出的集合,一行代表一个filter的输出,大小等于长*宽),内容图片p和合成图片 x⃗  x → l l 上的输出分别为Pl, Fl F l 他们之间的内容误差可以表示为

Lcontent(p⃗ ,x⃗ ,l)=12i,j(FlijPlij)2(3) (3) L c o n t e n t ( p → , x → , l ) = 1 2 ∑ i , j ( F i j l − P i j l ) 2

该误差函数关于合成图像输出的导数为
LcontentFlij={(FlPl)ij    if   Flij>00     if     Flij<0(4) (4) ∂ L c o n t e n t ∂ F i j l = { ( F l − P l ) i j         i f       F i j l > 0 0           i f           F i j l < 0

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

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

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

其中 wl w l 是不同网络层上的权重。
Style Loss El E l 关于生成图像在l层上的激活的导数为:
ElFlij={1N2lM2l((Fl)T(GlAl))ji    if   Flij>00     if     Flij<0(8) (8) ∂ E l ∂ F i j l = { 1 N l 2 M l 2 ( ( F l ) T ( G l − A l ) ) j i         i f       F i j l > 0 0           i f           F i j l < 0

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

其中 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,当然这两项都有相应的权重以调整合成图像的视觉效果。利用优化算法,将目标函数减小,得到最终的合成图像。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值