阅读笔记:Image Style Transfer Using Convolutional Neural Networks

引用文献:Image Style Transfer Using Convolutional Neural Networks

 注:本文所有内容均出自原文,仅处于学习研究目的,感谢原作者,侵删


    这是关于深度学习进行图像渲染的读书报告的第一篇。既然是第一篇,那么当然要首先介绍一下使用卷积神经网络进行风格传递的鼻祖论文,也就是标题所述论文。论文的渲染流程图如图1所示,其可以用一句话进行概括:使用任一图像作为初始图像,通过适当的损失函数加以引导,通过梯度下降(L-BFGS)的方式,在不断的迭代中,生成越来越符合损失函数描述的结果图像。

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

图一:由任意图像通过梯度下降的方式生成渲染结果的流程图

在掌握了生成结果图像的总体思路后,根据流程图,我们现在不明确的地方有三:

(1)      如何选定初始图像

(2)      损失函数如何确定

(3)      如何据损失函数更新初始图像,获得更加符合损失函数描述的更新后图像

对于问题(1),理论上来说,输入任意一张图像作为输入,在经历足够次数的反向传播迭代更新后,其都可以生成一幅在一定程度上满足我们需求的渲染图片,即风格满足风格图像,内容满足内容图像的结果图片;但在具体实施时,使用不同的初始图像往往会得到不同的结果图像,并且这些结果图像的质量好坏往往取决于输入的初始图像;在这里,原文作者使用的是将白噪声图像作为输入,在经过一定次数的反向传播更新后,得到结果图像,其过程见图2。

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

图二:通过反向传播迭代更新白噪声图像的方式生成最终渲染图像的流程示意,最后一行左边为内容图像,右边为风格图像;值得注意的是作者这里省略了迭代次数为零时的白噪声初始图像。图片引自:Image Style Transfer Using Convolutional NeuralNetworks的展示文档,http://web.cs.ucdavis.edu/~yjlee/teaching/ecs289g-fall2016/wenjian.pdf

对于问题(2),即作者使用的用于合并内容和风格的引导损失函数,是全文的重中之重,也是初始图像得以通过梯度下降反向传播迭代更新的方式生成最终的渲染图像的根本原因,在这里我们将详细展开进行讲解。

a.      内容图像建模

内容图像建模的目标是:给定关于内容图像Ic的损失函数Lc,我们将初始的白噪声图I0按照梯度下降的方式以最小化Lc为目标进行迭代n次,得到结果图像Icn,则只要n足够大,我们有Icn约等于Ic。关于这个过程的直观说明见图3。在这里,作者选择的Lc是向量的平方误差函数,其具体的计算方式为:

           假定有两张待计算Lc的图像IA和IB,设它们的维度相等,设它们的高为h、宽为w、通道数为chn。则我们可以将IA展开成一维的列向量VA,其长度为w*h*chn,对应地,我们可以将IB按照相同的方式展开成列向量VB。那么,我们有:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

b.      风格图像建模

风格图像建模的目标是:给定关于风格图像Is的损失函数Ls,我们将初始的白噪声图I0按照梯度下降的方式以最小化Ls为目标进行迭代n次,得到结果图像Isn,设关于图像风格的表征函数为Style(M),其中M为任意图像,则只要n足够大,我们就有Style(Isn)约等于Style(Is)。关于这个过程的直观说明见图4。在这里,作者选用的Style(M)Gram矩阵,其详细介绍见文末,在这里我们首先定义,对于矩阵M,有:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

其中GM)的计算方式为:

假定矩阵I的宽为w、高为h、通道数为chn,如果我们将I展开成为如下2维矩阵:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

其中FiI的第i通道展开成的长度为w*h的列向量,则我们有:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

然后,对于任意两幅图像IA和IB我们定义衡量之间差异的距离,即图像风格之间差异的函数E,假定IA、IB的高、宽、通道数都为hwchn,则我们有:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

E即为我们关于图像IA和IB的风格度量函数。

c.      风格内容损失合并

ab中,我们已经对图像的风格差异和内容差异进行了建模,那么,我们现在的问题是,假设存在三幅图像,分别是内容图像Ic、风格图像Is和重建结果图像Io(当然,它是通过反向传播使损失函数最小化生成的,我们现在只是假设它已经存在),那么应该满足什么样的条件呢?很显然,一个直观的想法是让它满足下式:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

其中alpha、beta是控制是更偏向于内容图像还是更偏向于风格图像的参数。

d.      在卷积神经网络中进行风格、内容损失函数的计算及合并。

我们都知道,由于pooling的存在,卷积神经网络中有许多不同尺度的层,而在不同尺度的层上,其输入图像对应的特征图所代表的含义是不同的,例如在序号低的卷积层,如conv1-1conv2-1中,特征图代表的可能是图像的低阶特征,如图像的边缘、纹理、颜色等,在序号高的卷积层,如conv5-1中,特征图代表的可能是图像的结构信息。因此,我们可以将卷积神经网络看做是一个“更高级的图像金字塔”,经过前向传播后,其将我们的输入图像在各个尺度上进行了分解;而在传统的图像处理方法中,使用图像金字塔进行由粗到细的图像处理操作又一直是被广泛应用的技术手段,因此,在这里作者同样将图片在卷积神经网络中各个尺度的表征进行了考量,这样考量的结果就是风格损失函数和内容损失函数是由多个不同尺度上卷积层的响应图分别计算其损失后再合并得到,其通式如下:
阅读笔记:Image Style Transfer Using Convolutional Neural Networks

其中Lci、Lsi是在某一卷积层convi-?中的内容和风格损失函数。这里”?”的数值可以自己指定,非常灵活,但是总体差别不是很大。

对于问题(3),即作者如何通过设计好的Ltotal损失函数对白噪声图像进行迭代更新生成最终图像,我们可以看一看算法的实际总体运行流程图,如图6所示:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

6:算法实际反向传播计算流程示意图,引用自Image Style Transfer Using Convolutional Neural Networks的展示文档,http://web.cs.ucdavis.edu/~yjlee/teaching/ecs289g-fall2016/wenjian.pdf

在这里对流程图内容以及参数做简要说明,左边第一行(红色方框包裹)为风格图像,这一行展示的是风格图像在VGG-19中进行前向传播的过程,AL表示的是由风格图像a在卷积层L按(2)中方法计算得到的Gram矩阵。左边第二行(绿色方框包括)为当前输入网络进行风格迁移的图像(初始时为白噪声,随着迭代次数增加逼近最终结果)。其在前向传播过程中同样要计算其特征图的Gram矩阵GL,左边第三行(蓝色方框包裹)为内容图像,其进行前向传播时不进行额外计算。

在前向传播以及相关必要的计算完成后,算法进入到反向传播更新的阶段,在这里关于风格的误差的反向传播过程如图6中青色方框所示:在不同层计算得到的风格误差EL会通过链式法则反向传播到x(观察紫色方框中的双向箭头可知链式法则的路径),同理金色方框所示是关于内容的损失函数通过链式法则反向传播的过程。

Gram矩阵

假设存在矩阵I,其可以表示为如下形式:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

其中ik为矩阵Ik列构成的列向量。则我们有:

阅读笔记:Image Style Transfer Using Convolutional Neural Networks

Gram矩阵表征的实际上是矩阵中不同列向量之间的关系,而作者认为图像的纹理信息就隐藏在这些列向量的关系之中。(详细讨论见:https://www.zhihu.com/question/49805962