Neural Style Transfer

Neural Style Transfer

概述

计算机视觉新流行的一种算法:Neural Style Transfer。卷积神经网络的出现带来的对图像特征,特别是抽象特征的提取,使得风格和内容的分离成为了可能。

原理

首先来看看架构图:

img

从架构图可以看到,input有三个:\(y_s\)风格图片,\(y_c\)内容图片,还有一个生成图片。在更新过程中,CNN网络参数被更新,输出图片也会被更新。

至于损失函数,则为: \[ J(G) = \alpha J_{content} + \beta J_{style} \] alpha和beta的主要作用是平衡风格和内容的博弈。

具体的内容损失函数的计算: \[ J_{content} = || a^{[l][c]} - a^{[l][g]} || ^ 2 \] 在CNN的某一层,我们拿到内容图和输出图的feature map,计算其损失函数(相近度),损失函数越低越好。

难点在于风格的损失函数,我们怎么定义风格呢?所谓风格,应该是在某一层feature map,所有channels之间的correlation。我们用一个gram matrix来描述一张图片所有的channels之间的correlation相关性。

而gram matrix则是,假设某个feature map有多个channels,两两channels之间某个长宽位置固定的点相乘,然后计算所有位置相乘之后求和。最后就可以得到一个矩阵。我们就用这个矩阵来表示style。

我们对输出图和style图都取gram matrix,然后计算: \[ J_{style} = || M^{[l][s]} - <^{[l][g]} || ^ 2 \] 虽然我们可以只取一层求损失函数,但为了使得风格更加饱满,我们可以在每一层都计算损失函数,最后求和: \[ J_style(S, G) = \sum_{\lambda} \lambda^{t} J^{t}(S, G) \]

Problme

  • 风格迁移可能需要很多forward和backward的传到,速度非常慢;

解决方法是,另外训练一个神经网络来执行风格迁移。