斯坦福大学的一篇基于感知损失函数的实时风格转换和超分辨重建论文理解,暂时只对实时风格转换部分做了理解,记录如下,如有问题,欢迎指正。
这篇论文解决了之前Gatys等人实现的风格转换费时比较久的问题。训练了一个网络,其中直接包含前向生成部分,等模型训练好了可以直接用于生成转换图片。这个网络与之前Gatys的图像生成对比:效果是差不多(个人觉得有些地方稍差点:感觉物体大部分分割比gatys的要稍差点,有些比Gatys的稍好,总体觉得Gatys的分割要好点),但是速度却比Gatys的提升数百倍,达到3个数量级。
整个网络模型
风格转换部分主要用了上面的网络模型,这个模型可以分为两部分,左边是图像转换网络,右边是损耗网络。其超分辨率重建也是采用上面的网络模型,只是具体内部的图像转换网络部分稍有区别。
上图中间有3个变量,一个是转换出来用于输出的图片y,一个是Style target ys,另一个是Conten Target yc。这里对风格迁移变换yc = 输入图像X,ys就是输入的风格图片,就是y是content Target和Style Target的结合。作为超分辨率模型,这里的yc是高分辨率图片,y是输出的高分辨率图像,style Target用不到。
这篇论文使用了感知损失函数来训练网络的,我们在图像中之前经常会使用逐像素比较的损失函数,即输出图像和真实图像每像素颜色空间的距离,使这个距离最小,这个方法其实一直存在弊端,譬如两张基本一样的图像,就是两张图片每个像素相差1,基本视觉效果以及图片结构等等都是一致的,但是其计算出来的损耗函数却是比较大的。
这里提到的感知损失函数就是通过预训练CNN中提取的高层次的图像特征来求差(特征重建损失函数),这个部分的损耗函数求解方法和Gatys的方法基本是一致的。在风格重建时,越高层特征,粒度越粗。内容重建时,越底层的特征,重建效果越好。由内容和风格部分的损耗合成。
损耗函数计算:内容的损耗函数都是由生成图片在高层上的特征激活值与实际内容图像在当前层上的特征激活值之间的距离差平方。风格的损耗函数是由生成图片每层上的特征与实际风格图像在当前层上的风格特征之间的距离差平方的累加和。注意这里:内容损耗只算了一层(比较高层的),而风格损耗函数是算了所有层上的差异平方和,和上图一一对应,计算内容损耗的只是relu3_3,而风格损耗是每层的激励值都进行计算。也可参考下图,这张图是Gatys的论文中的方法。除此之外还有一项总变差,主要是用于保证输出图像的空间平滑性,避免高频噪声的。
Image Transform Net
Image Transform Net的输入是要转换的图像,输出是转换好的图像,在模型训练好之后,用于生成风格迁移的只是这部分的网络。具体这部分的网络模型图如下。
图像变换网络总体也属于一个残差网络。一共是由3个卷积层、5个残差块、3个卷积层构成。这里没有用到池化等操作进行采用,在开始卷积层中(第二层、第三层)进行了下采样,在最后的3个卷积层中进行了上采样,这样最直接的就是减少了计算复杂度,另外还有一个好处是有效受区域变大,卷积下采样都会增大有效区域。5个残差块都是使用相同个数的(128)滤镜核,每个残差块中都有2个卷积层(3*3核),这里的卷积层中没有进行标准的0填充(padding),因为使用0填充会使生成出的图像的边界出现严重伪影。为了保证输入输出图像大小不改变,在图像初始输入部分加入了反射填充。
这里的残差网络不是使用何凯明的残差网络(卷积之后没有Relu),而是使用了Gross and Wilber的残差网络 。后面这种方法验证在图像分类算法上面效果比较好。
上面是一个残差网络和等效的非残差网络的结构,两个结构得到相似的损耗函数,但是使用残差网络的速度更大。
《Instance Normalization: The Missing Ingredient for Fast Stylization》论文中讨论了使用实例归一化替代批归一化能够显著提升前馈的风格迁移模型的质量。作者这里在图像转换的残差网络中使用的是批归一化,若使用实例归一化代替,那么前馈的风格迁移网络模型的质量会不会更好呢?只是个人估计。
Loss Network
采用16层的VGG模型,这个网络是直接采用ImageNet或者其它数据集进行图像分类的,先预训练好的。
执行时间:
GPU一般小于1s,CPU运行需要几秒。
补充:
计算损耗函数时,若内容损耗前的权重相对于风格损耗前的权重越大,则内容越明显,若内容前的权重相对很小,则风格越明显,小到一定程序将看不出内容,显示的结果会是比较杂乱的风格图。
疑问点:(已基本理解)
Gatys论文中的VGG模型是预训练好的,里面的权值不更新,只是通过梯度下降,不停的更改输入来达到使损耗值最小,斯坦福这篇论文中的Loss Network的VGG-16的权重是预先训练好,不需要训练了,计算损失函数训练只是为了训练前面的图像转换模型,而这个模型是采用SGD的方法更新权重,不知道理解是否正确?
代码地址 github
torch https://github.com/jcjohnson/fast-neural-style
tensorflow https://github.com/lengstrom/fast-style-transfer
参考资料
1.http://www.cnblogs.com/wangxiaocvpr/p/6298179.html
2.http://cs.stanford.edu/people/jcjohns/papers/eccv16/JohnsonECCV16Supplementary.pdf
3.http://jiqizhixin.com/article/1623
4.论文翻译:http://www.jianshu.com/p/b728752a70e9
5.http://www.tuicool.com/articles/7fu6vm6
6.Image style transfer using convolutional neural networks
http://blog.csdn.net/stdcoutzyx/article/details/53771471