风格迁移的本质是一个域自适应问题,这句话在我阅读风格转移论文时频繁地出现,我自然对这句话的由来产生了兴趣。于是我去翻阅其引用的论文,最终找到了这句话的出处

如果将风格迁移中的风格看作域,那么这句话理解起来好像并不困难,我们平常说的数据集的域中的元素是一张图片,而在风格迁移中则是一个像素,一张图片中像素组成的整体风格便可看作一个域

Demystifying Neural Style Transfer这篇论文首次提出了这个概念,但是我在读完之后,发现他不是从问题出发,而是从现象出发去提出这个观点的,他解释了Image Style Transfer Using Convolutional Neural Networks这篇论文中Gram矩阵为何产生效果这件事,虽然关于风格迁移的本质到底为什么是域自适应问题我们还是不能得知,但是从目前看大多数的风格迁移方法都可以从这个角度去解释

Image Style Transfer Using Convolutional Neural Networks

这是一篇2016年由Gatys等人发表的一篇论文,他将神经网络与风格迁移相结合并获得了不错的结果,因而引起了广泛的关注,其方法如下

风格迁移的目标是获得一张图片xx^*,他具有给定的内容图片xcx_c中的内容,以及风格图片xsx_s中的风格,我们通过一个CNN从xx^*xcx_cxsx_s中分别提取特征FlRNl×Ml\mathbf F^l\in\mathbb R^{N_l\times M_l}PlRNl×Ml\mathbf P^l\in\mathbb R^{N_l\times M_l}SlRNl×Ml\mathbf S^l\in\mathbb R^{N_l\times M_l},其中NlN^l是网络第ll层中特征图的数量,MlM^l是对应层特征图的宽乘高的值

然后对xx^*使用以下loss进行优化

L=αLcontent+βLstyle\mathcal L=\alpha\mathcal L_{content}+\beta\mathcal L_{style}

α\alphaβ\beta是固定的权重,Lcontent\mathcal L_{content}使用平方差,且只计算某个指定的层

Lcontent=12i=1Nlj=1Ml(FijlPijl)2\mathcal L_{content}=\frac{1}{2}\sum_{i=1}^{N_l}\sum_{j=1}^{M_l}(F_{ij}^l-P_{ij}^l)^2

Lstyle\mathcal L_{style}由多个层的Lstylel\mathcal L_{style}^l组成

Lstyle=lwlLstylel\mathcal L_{style}=\sum_l w_l\mathcal L_{style}^l

而每层的style loss则是计算对应层特征图的Gram矩阵之间的差

Lstylel=14Nl2Ml2i=1Nlj=1Nl(GijlAijl)\mathcal L_{style}^l=\frac{1}{4N_l^2M_l^2}\sum_{i=1}^{N_l}\sum_{j=1}^{N_l}(G_{ij}^l-A_{ij}^l)

Gram矩阵GijlRNl×Nl\mathbf G_{ij}^l\in\mathbb R^{N^l\times N^l}则是将每张特征图向量化之后的内积,计算公式如下

Gijl=k=1MlFiklFjklG_{ij}^l=\sum_{k=1}^{M_l}F_{ik}^lF_{jk}^l

Al\mathbf A^lGij\mathbf G_{ij}计算方法类似,只是将FF替换为SS

Demystifying Neural Style Transfer

该篇论文对Image Style Transfer Using Convolutional Neural Networks中的方法进行了研究,发现匹配Gram矩阵可以被表述为最小化使用二阶多项式核的MMD(Maximum Mean Discrepancy)

推导过程如下

其中fk\mathbf f_{\cdot k}sk\mathbf s_{\cdot k}分别是Fl\mathbf F^lSl\mathbf S^l的第kk行,而核函数为k(x,y)=(xTy)2k(x,y)=(x^Ty)^2,因此上式可以写成

Lstylel=14Nl2Ml2k1=1Mlk2=1Ml(k(fk1,fk2)+k(sk1,sk2)2k(fk1,sk2))=14Nl2MMD2[Fl,Sl]\begin{aligned} \mathcal L_{style}^l &=\frac{1}{4N_l^2M_l^2}\sum_{k_1=1}^{M_l}\sum_{k_2=1}^{M_l}(k(\mathbf f_{\cdot k_1},\mathbf f_{\cdot k_2})+k(\mathbf s_{\cdot k_1},\mathbf s_{\cdot k_2})-2k(\mathbf f_{\cdot k_1},\mathbf s_{\cdot k_2}))\\ &=\frac{1}{4N_l^2}\mathbf {MMD}^2[\mathcal F^l,\mathcal S^l] \end{aligned}

MMD,最大平均差异,用来判断两个分布是否相同,当MMD为0时两个分布相同,值越大差异越大,最小化这个值就是使两个分布相近,相当于对齐两个域。

MMD可以选择不同的核函数,该论文中也选择了不同的核函数进行实验,实验结果表明不同的核函数会有不同的结果,但都有提取图片风格的作用

图片左侧就是不同的核函数,不同核函数有不同的效果,但很难说哪一种更好,更多是用户自己去判断

总结

这篇论文看完也算是解决了我之前关于CLIPstyler的一些疑惑吧,为什么单独整张图片的loss不管用而要去用patch loss,其实也是域对齐的问题,style transfer中域的元素应该是图片中的像素,而使用从整张图片中提取的特征去对齐文字特征肯定是效果不佳的,所以需要使用裁剪出的patch,使图片的域与文字对齐。CLIPstyler中只使用了encoder最后提取出的向量做对齐,如果可以了解一下CLIP中encoder的结构,说不定可以像上述方法一样使用多层提取出的特征

还有一个关于Style Transfer的疑问我一直困惑至今,那就是该如何去衡量一个方法的好坏

目前从结果来看好像并不是很可行,因为不同的结果之间好像并没有明确的高下之分,有一些方法会根据结果中的问题提出解决方案,但是究竟哪个更好还是在于用户在使用时更喜欢哪一个,而我感觉这也算风格迁移中的比较重要的一个问题,应找到一种方法去衡量结果好坏,或者就是使迁移的结果更加可控

我目前看的论文基本都是使用上面说到的这种域匹配的方法,添加一些创新以解决提出的一些问题,这一系列方法确实可以达到风格迁移的效果,但是在执行过程中,并没有考虑内容图片的结构,以及用户的需求,可控性并不强。举例来说,如果用户想对一张图片赋予梵高画作的风格,我们更应该考虑的其实有两点,首先是如果梵高过来画这张图应该是什么样的,以及用户想要的结果是什么样的。前者应该更加考虑图片中的语义结构,对比梵高画作中的语义结构,使他们更加相似,使最终结果更符合梵高的想法,后者应该使用户的想法可以参与进结果的生成,可以对结果进行更加细致的更改

有一篇ICCV2021的论文Manifold Alignment for Semantically Aligned Style Transfer应该是我看到过最符合上面两点的方法,但是他也是使用了对齐的方法,只不过对对齐的部分进行了一些操作,而且方法更加偏数学,之后汇报再详细说下这篇