Neural Style Transfer

风格转移

这几天看了一篇风格转移的论文,这里大致介绍下论文的内容,并且推到下论文中出现的公式。

Neural Style Transfer

基本思想

有两张图片,我们关注一张图片的内容(Content)记为C,一张图片的风格(Style)记为S,想要生成一张图片包含C的内容和S的风格,记为G。

那么如何获取图片的C和S那?论文使用训练好的VGG net解决这一问题。

文中使用VGG net的中间层来表示C:对于一张input_image,中间某一输出层shape为height×width×channel,将其reshape成(channel×(heightwidth))。这样便得到了C,简单的理解是使用训练好的VGG net对图片进行再编码。为公式推导方便我们记为FN×M,N为特征图的数量,M为特征图的大小。

对于S的表示略微复杂:在VGG net的某一层,得到了该层的feature maps,计算这些feature maps的特征相关性feature correlations,就可以得到这一层的“风格表示”,最终的S是多个层的“风格表示”的线性组合。

怎么计算feature correlations那?文中介绍了使用Gram Matrix的方法。

Glij=kFlikFljk
从定义可以看出,Gram阵是对称阵,我们公式推导会多次用到这一性质。

loss定义

论文中定义的Loss是对ContentLoss和StyleLoss进行加权求和。

Ltotal=αLcontent+βLstyle
其中αβ是超参数 ![NST2.png](../images/NST2.png)

ContentLoss

为公式推到方便,先来定义几个符号

p: 原始图像

x: 生成图像

l: VGG net的第l

Fl: 原始图像在VGG net第l层的内容特征表示

Pl: 生成图像在VGG net第l层的内容特征表示

ContentLoss定义为

Lcontent(p,x,l)=12i,j(FlijPlij)2
误差对l层每一**值的偏导
LcontentFlij=(FlPl)ij0if Flij>0if Flij<0
这一步偏导好求,就是当Flij<0时偏导是0,文中没有做解释

StyleLoss

a: 原始图像

x: 生成图像

l: VGG net的第l

Al: 原始图像在VGG net第l层的风格特征表示

Gl: 生成图像在VGG net第l层的风格特征表示

l层的StyleLoss定义为

El=14N2lM2li,j(GlijAlij)2
TotalStyleLoss定义为
Lstyle(a,x)=l=0LwlEl
误差对l层每一**值的偏导
ElFlij=1N2lM2l((Fl)T(GlAl))ji0if Flij>0if Flij<0
接下来是推导过程
ElFlij=ElGlGlFlij=m,nNElGlmnGlmnFlij
考虑这个式子GlmnFlijmi,ni时,上式为0 当m=i,ni时,上式为Fnjmi,n=i时,上式为Fmjm=i,n=i时,上式为Fij
m,nNElGlmnGlmnFlij=n,niNElGlinFnj+m,miNElGlmiFmj+2ElGliiFij
n,niNElGlinFnj+ElGliiFij=2[(Gi1Ai1)F1j+(Gi2Ai2)F2j++(GiNAiN)FNj]
m,miNElGlmiFmj+ElGliiFij=2[(G1iA1i)F1j+(G2iA2i)F2j++(GNiANi)FNj]
利用Gram矩阵的对称性得
n,niNElGlinFnj+ElGliiFij=m,miNElGlmiFmj+ElGliiFij
ElFlij=1N2lM2lkN(GlAl)ikFlkj=1N2lM2l((GlAl)Fl)ij=1N2lM2l((Fl)T(GlAl))ji

论文实现

link

Acknowledgement

Image Style Transfer Using Convolutional Neural Networks by Gatys et al. CVPR 2016

Neural Transfer with PyTorch

原文链接

https://jiweibo.github.io/Neural-Style-Transfer/