风格迁移到快速风格迁移——基于深度学习中的TensorFlow

使用VGG深度学习网络进行风格迁移和快速风格迁移


什么是图像风格迁移?
给定一个内容图片A和一个风格图片B,能够生成一张有着和A内容一样而风格却更像B的一张图片C。
例如:
内容图片A如下:
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第1张图片
风格图像B如下:
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第2张图片
最后生成图片C如下:
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第3张图片
具体的理论有兴趣的同学可以看下A Neural Algorithm of Artistic Style这篇论文,我这里给一个翻译好的文件链接 [译] A Neural Algorithm of Artistic Style

下面就是一些具体实现的步骤
1.获取预训练的VGG-19模型
VGG网络在2014年的 ILSVRC localization and classification 两个问题上分别取得了第一名和第二名。VGG网络非常深,通常有16-19层,如果自己训练网络模型的话很浪费时间和计算资源。这里要用到的VGG19模型就是在imagenet数据集上预训练的模型。
VGG19结构图如下:
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第4张图片

我们要从预训练的模型中,获取卷积层部分的参数,用于构建我们自己的模型。VGG19中的全连接层舍弃掉,这一部分对提取图像特征基本无用。

要注意的是,我这里提取出来的VGG参数全部是作为constant(即常量)使用的,也就是说,这些参数是不会再被训练的,在反向传播的过程中也不会改变。

2.感知损失函数
首先先放一张论文中的图:
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第5张图片
2.1内容损失
内容重构。我们可以通过从一个已知特定层的网络的响应重构输入图片来可视化CNN中不同处理层的信息。我们重构了输入图像从VGG的‘conv1 1’ (a), ‘conv2 1’ (b), ‘conv3 1’ ©, ‘conv4 1’ (d) and ‘conv5 1’ (e)。发现从较低层重构的几乎可以称完美 (a,b,c)。在网络的较高层,具体的像素值信息在更高层次的内容被保存的时候丢失了(d,e)。

各个卷积层本质上已经是对图片进行了特征提取,且高阶的层包含了内容信息,低阶的层包含了纹理的信息,各个特种层之间的相关关系表达了风格信息

图像风格转换算法的成功,在生成图像领域,产生了一个非常重要的idea,那就是可以将卷积神经网络提取出的feature,作为目标函数的一部分,通过比较待生成的图片经过CNN的feature值与目标图片经过CNN的feature值,使得待生成的图片与目标图片在语义上更加相似(相对于Pixel级别的损失函数)。
于是我们选择conv4 2和conv5 2作为计算内容损失的VGG层。
在这里插入图片描述
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第6张图片
2.2风格损失

将风格图片输入网络,计算风格图片在网络指定层(比如[‘conv1_1’,’conv2_1’,’conv3_1’,’conv4_1’,’conv5_1’])上的输出值。
对于风格重建的损失函数,首先要先计算Gram矩阵:
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第7张图片
产生的feature_map的大小为CjHjWj,可以看成是Cj个特征,这些特征两两之间的内积的计算方式如上。
两张图片,在loss网络的每一层都求出Gram矩阵,然后对应层之间计算欧式距离,最后将不同层的欧氏距离相加,得到最后的风格损失。
在这里插入图片描述
最终用于训练的损失函数为内容损失和风格损失的加权和:
在这里插入图片描述
另外,输入层要设置为Variable,我们要训练的就是这个。最开始输入一张噪音图片,然后不断地根据内容loss和风格loss对其进行调整,直到一定次数后,该图片兼具了风格图片的风格以及内容图片的内容。当训练结束时,输入层的参数就是我们生成的图片。
上面就是普通的风格迁移,具体的代码实现我这里给上一篇不错的CSDN上的博客风格迁移代码详解,上面的代码讲解的很好,另外如果用的是CPU的Tensorflow,迁移的会很慢大概30分钟迁移一张图片,但是如果用Tensorflow-gpu速度就会提升很多,在1050ti显卡上迁移一张图片大概2分钟。普通的风格迁移如此之慢,怎么可以加快迁移速度呢,就是下面我要写的快速风格迁移,快速风格迁移是由Perceptual Losses for Real-Time Style Transfer and Super-Resolution(Stanford University)这篇论文引出,我这里也提供一个论文翻译版本[译] Perceptual Losses for Real-Time Style Transfer and Super-Resolution(Stanford University)
图像风格转换算法将图片生成以生成的方式进行处理,如风格转换,是从一张噪音图(相当于白板)中得到一张结果图,具有图片A的内容和图片B的风格。而Perceptual Losses则是将生成问题看做是变换问题。即生成图像是从内容图中变化得到。

下面这个网络图是论文的精华所在。图中将网络分为Transform网络和Loss网络两种,在使用中,Transform网络用来对图像进行转换,它的参数是变化的,而Loss网络,则保持参数不变,Transform的结果图,风格图和内容图都通过Loss Net得到每一层的feature激活值,并以之进行Loss计算。
风格迁移到快速风格迁移——基于深度学习中的TensorFlow_第8张图片
从风格迁移到快速风格迁移,我的看法(个人之见)普通风格迁移用了别人训练好的VGG19来快速提出特征来节约时间,而快速风格迁移直接用训练好的模型的损失函数参数,由于不用去修改LOSS网络的参数,而这个是最费时间的,使得迁移图片的速度大大提升,我这里迁移一张1000*1000的图片大概10S(#吃惊)。具体的代码实现我这里提供知乎上一位大佬的文章何之源《21个项目玩转深度学习——基于TensorFlow的实践详解》,有兴趣的小伙伴赶紧去试试吧。

学识浅薄,文中如有纰漏错误之处,还请诸位大佬斧正,万分感谢!

参考
1.A Neural Algorithm of Artistic Style
2.Perceptual Losses for Real-Time Style Transfer and Super-Resolution(Stanford University)
3.TensorFlow练手项目三:使用VGG19迁移学习实现图像风格迁移
4.深度学习实践:使用Tensorflow实现快速风格迁移

你可能感兴趣的:(保存个人学习心得,学习过程)