Deep Photo Style Transfer
基于Gatys等人的神经风格转换(NST)方法适用于艺术品风格,在真实照片上会由于“低级噪声”的影响产生像手绘的局部空间扭曲的效果。
这篇论文的贡献之一就在于成功抑制了图像扭曲,将风格变换约束在色彩空间的局部仿射变换中。
如图1所示,给定一个style图像(a)和一个内容图像(b),NST算法©成功地传输了颜色,但也引入了失真,使输出看起来像一幅画,这在照片风格转换中是不可取的。相比之下,我们的结果(d)在保持输出的逼真性的同时,也同样很好地传递了参考风格图像的颜色。在右边(e),我们显示了(b), ©和(d)的3个插值(按照这个顺序)放大比较结果。
其次对变换过程中由于输入图像和参考图像的内容不同而导致的不相关内容不在预期范围内的变换的出现提供了解决方案。比如,一个输入图像的天空内容比较少,风格变换可能会忽略掉内容上的差异而导致天空风格“溢出”到图像的其他部分,即天空用了地面的风格。
如图2 所示,给定一幅内容图像(a)和一幅风格图像(e), Gatys等人NST算法的(b)和Li等人CNNMRF算法的©的结果与我们的结果(d)相比,由于强畸变而呈现伪影。NST计算风格图像的全局统计,风格图像容易产生纹理不匹配,如对应关系(f)所示,如输出图像中从参考样式图像映射到建筑物的部分天空。CNNMRF计算风格图像的最近邻搜索,风格图像往往具有多对一的映射,如对应关系(g)所示,例如,参见建筑物。相比之下,我们的结果(d)防止了扭曲,并正确匹配纹理,如对应(h)所示。
NST(Imagestyle transfer using convolutional neural networks)的基本算法如下:
L t o t a l = ∑ l = 1 L α l L c l + Γ ∑ l = 1 L β l L s l L_{total} = \sum^L_{l=1} \alpha_l L^l_c + \Gamma\sum^L_{l=1}\beta_l L^l_s Ltotal=l=1∑LαlLcl+Γl=1∑LβlLsl
L c l = 1 2 N l D l ∑ i , j ( F l [ O ] − F l [ I ] ) i , j 2 L^l_c = \frac{1}{2N_l D_l}\sum_{i,j}(F_l[O]-F_l[I])^2_{i,j} Lcl=2NlDl1i,j∑(Fl[O]−Fl[I])i,j2
L s l = 1 2 N l 2 ∑ i , j ( G l [ O ] − G l [ S ] ) i , j 2 { L}^l_s = \frac{1}{2N^2_l}\sum_{i,j}(G_l[O]-G_l[S])^2_{i,j} Lsl=2Nl21i,j∑(Gl[O]−Gl[S])i,j2
其中, L L L 是卷积层数量, l l l 表示网络中第 l l l 层。每一层都有 N l N_l Nl 个卷积核,每个卷积核生成大小为 D l D_l Dl 的feature map, 其中 D l D_l Dl是高度乘以特征图的宽度。 F l [ ⋅ ] ∈ R N l × D l F_l [ \cdot ]\in {\Bbb R}^{N_l \times D_l} Fl[⋅]∈RNl×Dl 为特征矩阵,(i,j)表示其坐标,矩阵 G l [ ⋅ ] = F l [ ⋅ ] F l [ ⋅ ] T ∈ R N l × D l G_l[\cdot] = F_l [ \cdot ]F_l [ \cdot ]^T\in {\Bbb R}^{N_l \times D_l} Gl[⋅]=Fl[⋅]Fl[⋅]T∈RNl×Dl 定义为向量化特征图之间的内积,即Gram矩阵。 α l \alpha_l αl 和 β l \beta_l βl 的配置层预设的权重, Γ \Gamma Γ 是用来平衡内容(Eq. 2)和样式(Eq. 3)权重的参数。
无论是NST还是这篇文章提到的方法,都是使用预训练的VGG19模型,关于内容重建部分,都选择conv4_2(这一层的 α l = 1 \alpha_l = 1 αl=1 , 其他层的 α l = 0 \alpha_l = 0 αl=0 )的内容表示,所以Eq. 1可以重写为
L t o t a l = L c + Γ ∑ l = 1 L β l L s l { L}_{total} = { L}_c + \Gamma\sum^L_{l=1}\beta_l{ L}^l_s Ltotal=Lc+Γl=1∑LβlLsl
Eq. 2重写为
L c = 1 2 N D ∑ i , j ( F [ O ] − F [ I ] ) i , j 2 { L}_c = \frac{1}{2N D}\sum_{i,j}(F[O]-F[I])^2_{i,j} Lc=2ND1i,j∑(F[O]−F[I])i,j2
在NST论文中,关于 L t o t a l { L}_{total} Ltotal 的表示如Eq .6,其与Eq .4 只是符号表示上不同
L t o t a l = α L c o n t e n t + β L s t y l e L s t y l e ( a ⃗ , x ⃗ ) = ∑ l = 0 L w l E l { L}_{total} = \alpha{ L}_{content} + \beta{ L}_{style} \qquad { L}_{style}(\vec{a},\vec{x}) = \sum^L_{l=0}w_lE_l Ltotal=αLcontent+βLstyleLstyle(a,x)=l=0∑LwlEl
以上NST算法原始公式,下面是这篇文章的创新之处
该部分的目的是最大程度保留内容图像的结构,从而避免产生空间扭曲。
文章策略是不直接对输出图像添加约束,而是对内容图像的变换添加约束。虽然我们使用VGG19中较低层重建图像内容,但在该过程中不可避免会产生信息丢失,反映在输出图像上就是图像失真。因此我们添加惩罚图像失真的项来保证这一过程。
论文A Closed Form Solution to Natural Image Matting的拉普拉斯抠图算法已经演示了如何表示灰度抠图,我们在输入图像RGB通道的局部仿射合并上构建拉普拉斯抠图算法。它们描述了一个最小二乘惩罚函数,该函数可以用一个只依赖于输入图像 I I I 的矩阵 M I M_I MI 表示的标准线性系统最小化。(如需更详细的推导,请参阅原文。注意, 给定一个输入图像 I I I 有 N N N 个像素, M i = N × N M_i = N\times N Mi=N×N )。我们将 V c [ O ] Vc[O] Vc[O] 命名为通道 c c c 中输出图像 O O O 的矢量化版本 ( N × 1 ) (N \times 1) (N×1) ,并定义了以下正则项。
L m = ∑ c = 1 3 V c [ O ] T M I V C [ O ] { L}_m = \sum^3_{c=1} V_c[O]^T M_IV_C[O] Lm=c=1∑3Vc[O]TMIVC[O]
d m d V c [ O ] = 2 M I V c [ O ] \frac{d_m }{dV_c[O]} = 2M_IV_c[O] dVc[O]dm=2MIVc[O]
使用类似遮罩的方法
L s + l = ∑ c = 1 C 1 2 N l , c 2 ∑ i , j ( G l , c [ O ] − G l , c [ S ] ) i , j 2 { L} ^l_{s+} = \sum^C_{c=1}\frac{1}{2N^2_{l,c}}\sum_{i,j} (G_{l,c}[O] - G_{l,c}[S])^2_{i,j} Ls+l=c=1∑C2Nl,c21i,j∑(Gl,c[O]−Gl,c[S])i,j2
F l , c [ O ] = F l [ O ] M l , c [ I ] F l , c [ S ] = F l [ S ] M l , c [ S ] F_{l,c}[O] = F_l[O]M_{l,c}[I] \qquad F_{l,c}[S] = F_l[S]M_{l,c}[S] Fl,c[O]=Fl[O]Ml,c[I]Fl,c[S]=Fl[S]Ml,c[S]
其中 C C C 为语义分割掩码中的通道数, M l , c [ ⋅ ] M_{l,c}[·] Ml,c[⋅] 为层 l l l 中分割掩码的通道 c c c , G l , c [ ⋅ ] G_{l,c}[·] Gl,c[⋅] 为对应于 F l , c [ ⋅ ] F_{l,c}[·] Fl,c[⋅] 的Gram矩阵。我们对掩码进行下采样,使之与卷积神经网络每一层的feature map的大小相等。
此处的语义分割掩码(semantic segmentation mask)是指对style中的不同标签做分割,每个通道表示一个标签的掩码,标签部位表示为白色,背景部分表示黑色。【例如,style图中有车和楼房,则通道1表示车的掩码,车部位是白色,其余部位是黑色, F l , 1 F_{l,1} Fl,1 则只有车部位,其余部位全是黑色,;通道2表示楼房的掩码,楼房部位是白色,其余部位是黑色, F l , 2 F_{l,2} Fl,2 只有楼房信息,其余部位是黑色 。】
M l , c [ I ] M_{l,c}[I] Ml,c[I] 和 M l , c [ S ] M_{l,c}[S] Ml,c[S] 的通道数 C C C 应该相同,并且由于最终的输出收到我们正则化项的约束,所以分割不需要像素级精确,例如,“湖”和“海” 是等价的。
个人猜测(没看源码): 转移的风格在通道中应该是对应的,比如 M l , 1 [ S ] M_{l,1}[S] Ml,1[S] 是车的风格, M l , 1 [ I ] M_{l,1}[I] Ml,1[I] 就应该是使用车风格的内容。
将这三个要素结合在一起,形成了照片级风格转换:
L t o t a l = ∑ l = 1 L α l L c l + Γ ∑ l = 1 L β l L s + l + λ L m { L}_{total} = \sum^L_{l=1} \alpha_l { L}^l_c + \Gamma \sum^L_{l=1}\beta_l{ L}^l_{s+} + \lambda { L}_m Ltotal=l=1∑LαlLcl+Γl=1∑LβlLs+l+λLm
使用与训练的VGG19模型,选择conv4_2(这一层的 α l = 1 \alpha_l = 1 αl=1 , 其他层的 α l = 0 \alpha_l = 0 αl=0 )的内容表示,和conv1_1 conv2_1, conv3_1, conv4_1 conv5_1(这些层的 β l = 1 5 \beta_l = \frac 15 βl=51 , 其他层的 β l = 0 \beta_l = 0 βl=0 )的方式表示, Γ = 1 0 2 , λ = 1 0 4 \Gamma = 10^2, \lambda= 10^4 Γ=102,λ=104 。
源代码:https://github.com/luanfujun/deep-photostyletransfer
参考:
深度卷积神经网络图像风格变换 Deep Photo Style Transfer
图像抠图闭合方案 A Closed Form Solution to Natural Image Matting