风格迁移(Style Transfer)
如何将艺术风格量化? 基于深度学习的风格迁移是个很有趣也很浪漫的领域
Texture Synthesis Using Convolutional Neural Networks
2015a, Gatys
- 将图片输入预训练好的神经网络(VGG-19)中, 生成每层的特征
- 将灰度图同样输入预训练好的神经网络中,生成每层的特征
- 计算每层特征的Gram矩阵,计算两张图片对应层的Gram矩阵的平方误差,再将每层的误差按权求和,获得损失函数
- 计算损失函数对灰度图每个像素的梯度,进行梯度下降,最终得到输出图。这里进行梯度下降的不是模型参数,而是输入像素。这也是Deep Dream的主要思路。
其中最重要的贡献是定义了纹理,即特征图的Gram矩阵。网络第$l$层的纹理误差为
$$ E_{l}(S, \hat{X}) = \frac{1}{4C_{in}^2C_{out}^2}\sum\limits_{i,j}(G_{ij} - \hat{G}_{ij})^2 $$
其中$S$是需要学习的纹理(Texture Style)的图片,$\hat{X}$代表了需要生成的图片,总误差就是各层误差的加权和:
$$ \mathcal{L}_{style}(S, \hat{X}) = \sum\limits_{l}w_{l}E_{l} $$
计算Gram矩阵的方法如下。Gram矩阵可以视为有偏的协方差矩阵
A Neural Algorithm of Artistic Style
2015b, Gatys 本文增加了计算内容相似性的部分。内容相似性就是特征图的平方误差。 $$ \mathcal{L}_{content}(P, \hat{X}) = \frac{1}{2}\sum\limits_{i,j}(F_{ij} - \hat{F}_{ij})^2 $$ 其中$P$代表了需要渲染的图片,$\hat{X}$代表了需要生成的图片,$F_{ij}$和$\hat{F}_{ij}$代表了他们在某一层的特征图。总的损失是内容和风格损失的加权和: $$ \mathcal{L}(P, S, \hat{X}) = \alpha\mathcal{L}_{content}(P, \hat{X}) + \beta\mathcal{L}_{style}(S, \hat{X}) $$ 其中alpha和beta可以使用L-BFGS训练
Perceptual Losses for Real-Time Style Transfer and Super-Resolution
Mar 2016, Justin Johnson 以上方法生成一张图是通过梯度下降的方法,也就是一次训练过程,耗时较长,计算资源消耗也大。本工作将生成图片的过程变成了一次inference,降低了计算量,提升了速度。
本文对风格和内容损失有更现代的定义:
Feature Reconstruction Loss
网络$j$层对应的content loss $$ \mathcal{L^{j}_{content}}(y, \hat{y}) = \frac{1}{C_{j}H_{j}W_{j}} \Vert \phi_{j}(y) - \phi_{j}(\hat{y}) \Vert^{2}_{2} $$
Style Reconstruction Loss
网络$j$层对应的style loss $$ \mathcal{L^{j}_{style}}(y, \hat{y}) = \frac{1}{C_{j}H_{j}W_{j}}\Vert G^{\phi}_{j}(y) - G^{\phi}_{j}({\hat{y}}) \Vert^{2}_{F} $$
本文使用一个resnet来学习生成图片的变换,而将内容和风格损失作为损失函数,其计算方式通过一个固定参数的VGG16来生成。去掉风格损失之后还可以作为超分辨率模型使用。此外3.3节还提到了两个额外的损失函数,Pixel Loss和Total Variation Regularization。后者在风格迁移任务中也被使用到。
Fast Patch-based Style Transfer of Arbitrary Style
Dec 2016, Tian Qi Chen 实现了任意风格任意图片的迁移,
Style Swap
- Content图片产生特征图$\phi(C)$
- Style图片产生特征图$\phi(S)$
- 用$\phi(S)$做卷积核扫过$\phi(C)$,寻找最相似的