Pytorch:基于卷积神经网络的图片风格迁移

之前一直觉得图片风格迁移挺好玩的,最近就花了点时间了解一下,简单记录一下思路。

选取的论文是首次提出利用卷积神经网络实现风格迁移的论文
论文下载:Image Style Transfer Using Convolutional Neural Networks
代码实现:基于pytorch实现

1、发展介绍

Pytorch:基于卷积神经网络的图片风格迁移
  在纹理合成和风格迁移研究的时代,计算机图形学是发展较好的,顾名思义,计算机图形学就是为了就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

  而计算机图形学作为电子游戏先从电子游戏说起,为了让电子游戏里面的人物变得有血有肉,所以伴随着显卡的诞生,由于显卡超强的计算能力,就让神经网络和深度学习提取,有神经网络发展到卷积神经网络,卷积神经网络有着能够更好提取图像特征的优势,让深度学习的图像分类网络火起来,也是基于卷积神经网络的优势,是否能够将卷积神经网络和图像纹理合成从而实现风格迁移。

2、风格迁移

2.1 风格迁移的难点

其实说到风格迁移,最主要的两个成分就是图像内容图像风格
     难点             解决方法
如何将图片内容和图片风格分离-------卷积神经网络VGG19
如何描述图像风格--------------------卷积特征层的Gram矩阵(后面描述gram矩阵)

2.2 风格迁移的内容和风格特征选取

Pytorch:基于卷积神经网络的图片风格迁移
从上方的style reconstruction可以看出,随着层数的增加,根据提取的特征所还原出来的图像纹理更加丰富,更接近真实风格图片,所以用多层特征融合的风格来定义风格损失函数。

从上方的style reconstruction可以看出,随着层数的增加,还原出来的图像有些失真,那是因为高层提取的特征是一些更加复杂更高维度的特征,它丢失了图像的细节信息,比如像素,纹理。颜色等等。但还是保留的房子的形状的高级信息,所以用高层的内容特征来定义内容损失函数。

2.3、风格迁移算法

Pytorch:基于卷积神经网络的图片风格迁移
Pytorch:基于卷积神经网络的图片风格迁移
可以从下方看出,风格迁移是有三张图像,一张风格图像(左边),一张生成图像(中间),一张内容图像(右边)。风格图像和内容图像使我们事先加载进去,而生成图像是最后输出的风格迁移图像,其实在程序中初始化即可。

风格迁移算法有两个特征表示,一个内容特征,一个风格特征,我们的目的就是让total loss 越小越好,也就是内容损失函数和风格损失函数越小越好。那如何来定义两个损失函数呢?

2.3.1 风格损失函数的定义

为什么Gram矩阵能够来描述图像的风格呢?
Gram矩阵的定义:
Pytorch:基于卷积神经网络的图片风格迁移
他其实是关于一组向量內积的矩阵。因为向量內积能够用来衡量两者之间的相关程度。在风格迁移这里,表示的如下:
Pytorch:基于卷积神经网络的图片风格迁移
关于生成图像的不同特征层之间內积。对角线表示的是不同特征层各自的信息,非对角线元素表示的是不同特征层之间的相关信息,所以Gram矩阵能够描述图像具有哪些特征和不同特征之前的相关程度,因此,是有助于把握整个图像的大体风格。

Pytorch:基于卷积神经网络的图片风格迁移
 -------------------------------------------------------------------------------------------------------------
Pytorch:基于卷积神经网络的图片风格迁移
             表示的在某一层的风格损失(系数是为了防止图像风格损失和图像内容相差太大)
 ------------------------------------------------------------------------------------------------------------
Pytorch:基于卷积神经网络的图片风格迁移
              为每一层分配权重,得到总的风格损失
 ------------------------------------------------------------------------------------------------------------

2.3.2 内容损失函数的定义

对于两幅图片的内容,我们能够很自然的想到直接图像的像素做差即可。那是因为在现实生活中,如果两幅图片仅有几个像素的差点我们人眼肯定分辨不出来,从而认为两幅图像是相似的。

Pytorch:基于卷积神经网络的图片风格迁移
内容损失函数就是直接利用生成图片提取的特征和内容图像提取到的内容特做差即可。描述了两者图像在内容上的差异。
定义好了内容损失函数和风格损失函数,我们直接对总的损失函数进行迭代优化,使生成图像不断更新,在逐步降低总的损失函数时,生成图像会越来越像我们所期待的将风格和内容融合在一起的迁移图像。

2.3、总结

借以这篇论文了解风格迁移,其实就是利用卷积神经网络提取内容特征和风格特征,让生成图像不断迭代使得损失函数不断减小的过程。
创新:
1、 首次将内容特征和风格特征独立的分开
2、 引入Gram矩阵来定义风格的差异性
不足:
1、 迭代速度慢:每一次迭代的时候,都需要将生成图像,内容图像,风格图像放入模型进行计算两个损失函数,在不断进行优化,导致速度很慢。
2、**不能实时处理:**加入有A、B两张内容图像,都需要转为了C类风格,那么我们只有将A放进去迭代生成风格迁移图像,再讲B放进去迭代生成相应的风格迁移图像,因此,哪怕是同样的风格,每张图片都要进行复杂的迭代,而没有一个端到端的图像生成网络。