简记pytorch实现Style transfer 思路及框架

--理论--

两张图与目标图的两个差异值:内容差异、风格差异。

1.内容差异:

两张图像对应像素点做差、平方、求和。

2.风格差异:

Gram矩阵计算风格的差异。Gram矩阵定义于特征图(每层网络得到的激活图feature map)。每个特征图的大小一般是 MxNxC 或者是 CxMxN 这种大小,C表示的时候厚度,MxN 表示的是一个矩阵的大小。

Gram矩阵的大小是有特征图的厚度决定的,等于 CxC,Gram矩阵的每一个元素,也就是 Gram(i, j) 等于先把特征图中第 i 层和第 j 层取出来,这样就得到了两个 MxN的矩阵,然后将这两个矩阵对应元素相乘、然后求和就得到了 Gram(i, j),同理 Gram 的所有元素都可以通过这个方式得到。 Gram 中每个元素都可以表示两层特征图的一种组合,可以定义为它的风格。风格的差异就是两幅图的 Gram 矩阵的差异,就像内容的差异的计算方法一样,计算一下这两个矩阵的差就可以量化风格的差异。

--实现--

1.数据类型

2.实现3个类


简记pytorch实现Style transfer 思路及框架_第1张图片


简记pytorch实现Style transfer 思路及框架_第2张图片


简记pytorch实现Style transfer 思路及框架_第3张图片

3.选择预训练的vgg网络

一个Sequential模块包含一个有序的子模块列表。 例如,vgg19.features包含按照正确的深度顺序排列的序列(Conv2d,ReLU,Maxpool2d,Conv2d,ReLU ...)。在我们的网络中以理想的深度添加我们的样式和内容损失模块,作为附加“透明”层。 为此,构建一个新的Sequential模块,按照正确的顺序添加来自vgg19的模块和我们的损失模块。

构建新的网络层级模块:

简记pytorch实现Style transfer 思路及框架_第4张图片

4.输入图像,运行梯度下降,减少内容与风格损失

使用L-BFGS算法来运行我们的梯度下降。 我们想简单地创建一个PyTorch L-BFGS优化器,将我们的图像作为变量进行优化。 但是optim.LBFGS将第一个参数作为需要渐变的PyTorch变量列表。 我们的输入图像是一个变量,但不是需要计算梯度的。 为了显示这个变量需要渐变,可以从输入图像构造一个Parameter对象。 然后,我们只是将包含此参数的列表提供给优化器的构造函数

5.设置闭包循环,循环次数

【论文】

创新点:这个问题通常在计算机视觉的一个分支中被称为nonphotorealistic渲染。 从概念上讲,最相关的是使用纹理转移来实现艺术风格转移的方法。但是,这些以前的方法主要依靠非参数技术来直接操纵图像的像素表示。 相比之下,论文提出使用深度神经网络对物体识别进行训练,在明确表示图像高级内容的特征空间中执行操作。

论文的工作提供了一种算法理解,即神经表示可以独立捕捉图像的内容以及它呈现的样式。

你可能感兴趣的:(简记pytorch实现Style transfer 思路及框架)