风格迁移系列-Image Style Transfer Using Convolutional Neural Networks
论文Image Style Transfer Using Convolutional Neural Networks
概述及相关工作
图像风格迁移任务,可以概括为把一张图像的纹理信息加到另一种图像上,而保持该图像的语义内容(比如,图像是一张狗的照片)不变。变换的难点在于如何明确的表征图像的语义信息,从而允许把图像的‘content’与‘style’二者分割开来。
风格迁移有时可以认为是纹理迁移。而纹理迁移的目的是在目标图像上合成源图像中存在的纹理,同时保持目标图像的语义信息。该领域存在很多非参(non-parametric)的方法,通过采样(sampling)源图像的纹理像素来实现。
但是,非参的采样方法只利用了图像的低层(low-level)特征,这造成了该类方法的局限。理想状态,风格迁移算法应该能够抽取图像的语义内容,再进行纹理合成。如此,那么搜要的任务就是如何独立的为图像的语义内容和纹理风格建模。这时CNN就派上用场了。
基于CNN的方法
CNN中由低到高的各个层其实是能表示图像不同层级的信息的,如
输入图像给CNN,网络不同的层有不同的feature map,实验用不同层的特征重建图像。(重建过程:使用梯度下降,最小化初始白噪声与输入图像/风格在CNN层中特征的距离)对于‘Content Reconstructions’,可以看到,用高层feature map重建的图像,失去了很多像具体的像素级信息,但依然保存了内容信息。
基于此,作者提出了’A Neural Algorithm of Artistic Style‘,利用CNN计算的特征来处理和操纵自然图像的内容和风格。
Content representation
首先,如何表征图像的内容?假设CNN第 l 层的通道数为Nl ,每通道的特征数为Ml ,其中Ml=HxW(feature map的高与宽)。那么用给一个矩阵Fl就可以表示图像在这层的特征,Fli,j表示第l层i通道第j个特征点。
用p表示真实图像,x表示生成的图像,定义loss为:
梯度反向传播可以依据:
具体要使用CNN的哪一层呢?选择技巧是,高层的特征会抓取图像更高级的内容信息,比如物体及其位置,但是不会限制图像的像素级值。从图1中也可以看到使用不同层的区别。
Style representation
然后,如何表征图像的风格信息?这里不同于内容表征直接使用feature map的值,而是经过变换的Gram矩阵G:
风格的表征,一般要融合多个层的层上的特征,这样才能得到稳定的、多尺度的图像表征。风格的loss表示为:
wl为不同层的权重参数。
梯度的反向传播计算为:
style transfer算法
实现风格迁移时,联合最小化内容与风格两种损失。
算法流程可以看图:
s1,分别计算并存储特征图的style特征,风格图的conten的特征;
s2,初始化一个随机白噪声,使用相同的网络,计算其style特征及conten特征。
s3,计算两种特征的loss
s4,反向传播loss,更新优化白噪声(所以,这里更新的是输入的白噪声,不是网络的参数)
s5,重复2~4,知道loss收敛
结果
展示一下效果图:
可调参数
模型中,有一下可以简单调节的参数,根据需要尝试调整可以得到不同的效果。
1.content loss与style loss比值α/β
理解起来很直观,看一下效果
2.content表征使用不同的层
在CNN中,越高的层中,特征越抽象。低层特征,能更多的匹配像素级信息;高层特征,不限制像素级的信息,只保留高级的语义信息。
3.初始值
初始值可以是白噪声,也可以使用原风格图或内容图。以为算法是一个迭代寻优的过程,生成结果差异不大。但是需要注意,只有初始值使用随机噪声,才能得到多样性结果。
4.照片风格迁移
该算法可以实现真实照片间的风格迁移,并不限于艺术画。
不足与讨论
首先,算法耗时,生成每张图像都要经过网络的前向与后向传播,迭代多次才可。
其次,对于高分辨率的图像,计算量增大,更耗时。
还有,作者说,把图像的‘内容’与‘风格’分开,是一个未定的问题。合成图像的质量目前也没有量化的标准,只能是‘看起来’。