风格转移
这几天看了一篇风格转移的论文,这里大致介绍下论文的内容,并且推到下论文中出现的公式。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/6f92d28009254b9f24c42c51cca7433b.png)
基本思想
有两张图片,我们关注一张图片的内容(Content)记为C,一张图片的风格(Style)记为S,想要生成一张图片包含C的内容和S的风格,记为G。
那么如何获取图片的C和S那?论文使用训练好的VGG net解决这一问题。
文中使用VGG net的中间层来表示C:对于一张input_image,中间某一输出层shape为
height×width×channel
,将其reshape成
(channel×(height∗width))
。这样便得到了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)=12∑i,j(Flij−Plij)2
误差对
l
层每一激活值的偏导
∂Lcontent∂Flij=⎧⎩⎨(Fl−Pl)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=14N2lM2l∑i,j(Glij−Alij)2
TotalStyleLoss定义为
Lstyle(a→,x→)=∑l=0LwlEl
误差对
l
层每一激活值的偏导
∂El∂Flij=⎧⎩⎨⎪⎪⎪⎪1N2lM2l((Fl)T(Gl−Al))ji0if Flij>0if Flij<0
接下来是推导过程
∂El∂Flij=∂El∂Gl∂Gl∂Flij=∑m,nN∂El∂Glmn∂Glmn∂Flij
考虑这个式子
∂Glmn∂Flij
当
m≠i,n≠i
时,上式为0 当
m=i,n≠i
时,上式为
Fnj
当
m≠i,n=i
时,上式为
Fmj
当
m=i,n=i
时,上式为
Fij
∴∑m,nN∂El∂Glmn∂Glmn∂Flij=∑n,n≠iN∂El∂GlinFnj+∑m,m≠iN∂El∂GlmiFmj+2∂El∂GliiFij
又
∵∑n,n≠iN∂El∂GlinFnj+∂El∂GliiFij=2[(Gi1−Ai1)F1j+(Gi2−Ai2)F2j+⋯+(GiN−AiN)FNj]
∵∑m,m≠iN∂El∂GlmiFmj+∂El∂GliiFij=2[(G1i−A1i)F1j+(G2i−A2i)F2j+⋯+(GNi−ANi)FNj]
利用Gram矩阵的对称性得
∑n,n≠iN∂El∂GlinFnj+∂El∂GliiFij=∑m,m≠iN∂El∂GlmiFmj+∂El∂GliiFij
∴∂El∂Flij=1N2lM2l∑kN(Gl−Al)ikFlkj=1N2lM2l((Gl−Al)Fl)ij=1N2lM2l((Fl)T(Gl−Al))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/