概述
最近对图像风格迁移这种技术突然非常感兴趣,大概是之前读到了一篇关于对抗生成网络生成逼真人脸的论文文献,于是对这种技术很是好奇,大致了解了一下这个领域。我大致将其分为三个研究领域:
- 基于传统的机器学习的图像风格迁移。这个时代的图像风格迁移基于一个共同的思路:分析某一种风格的图像建立属于它的数学模型或者统计模型,再对待改变的图像改变其统计分布,使其更好的契合建立的模型。(这种听起来就好原始啊,感觉一定很难,暂时没找到基于这种方法进行的图像风格迁移,留待以后进行补充吧。)
- 基于卷积神经网络的图像风格迁移。这一概念最早于2015年提出在
《A neural algorithm of artistic style》
这篇文章中。它的具体实现思路是:输入原始内容图像、原始风格图像,利用网络分别学习属于他们的特征,在还原原始内容图像的时候,使用经过卷积层学习到的原始风格图像的特征,这样就可以在还原一张图像的时候使其具有另外一张图像的风格了。(这篇博客里主要记录基于这种方法的原理理解和实现流程。) - 基于对抗生成网络的图像风格迁移。这个应该是时下比较流行的一种方法,这种方法不同于卷积神经网络的图像风格迁移的一点在于:它不在是输入一张图像学习其风格,而是可以输入一整类的图像,从这些图像中学习它们的共同特征,并基于这些特征生成尽可能与这些图像相似的图像。这个应该在下一篇文章里研究吧。
基于神经网络的图像风格迁移
基于这里其实可以将这个过程细化为3个小的步骤;
1. 利用内容损失还原图像内容
2. 利用风格损失还原图像风格
3. 结合内容损失和风格损失,完成图像风格迁移
利用内容损失还原图像内容
基于这篇文章《A neural algorithm of artistic style》
中的实现方法可以在《21个项目玩转深度学习》这本书中找到。
这里实现利用的是常用的VGGNet,先选取一幅原始图像,经过VGGNet计算后得到各个卷积层的特征。接下来根据这些卷积层的特征,还原对应的这种特征的图像。
数学符号不会敲啊。。。(我直接记录书上的图片吧)
利用内容损失还原图像内容
上面讲到的是基于图像内容损失来还原原始图像内容的,那么如何表示一张图像的风格呢?这里使用卷积层特征的Gram矩阵。
利用风格损失,就可以还原出图像的风格了。
结合内容损失和风格损失,完成图像风格迁移
书上的图挺模糊的,后面我再贴自己做的图吧。
快速图像风格迁移原理
TensorFliow实现快速图像风格迁移
这部分数据共包括两个文件夹 chapter_7 和 chapter_7_data 两个数据集。
这里我使用的是 python3.6版本和TensorFlow1.13.1版本,并且要提前安装pyyaml库。
pip install pyyaml
使用预训练模型
这部分代码中提供了7个预训练的模型:wave.ckpt-done、cubist.ckpt-done、denoised_starry.skpt-done、mosaic.ckpt-done、scream.ckpt-done、feathe