Neural Style创造属于你的“星空”
文章首发于公众号:1024程序开发者社区
Neural Style是输入一张代表内容的图片和一张代表风格的图片,深度学习网络会输出一张融合了这个风格和内容的新作品。按照惯例,先上效果“星空版的大雁塔”。
1.模型原理介绍
作者anishathalye使用TensorFlow实现了Neural Style,并将其开源放在了GitHub上。目前为止获得了4千多个星。链接为https://github.com/anishathalye/neural-style。
Neural Style的核心思想如下图所示:
要融合两张图片的风格和内容,在训练网络时首先要定义其损失函数。一部分为内容损失函数,将content图片和一张随机生成的图片,都经过卷积网络进行特征变换,获取某些层级输出的特征变换结果,要求二者的差异最小。另一部分为风格损失函数,定义为任意两种特征的相关性。
综上,将内容图片为C,模板图片为S,融合的图片为G。内容损失函数定义为J(C,G),风格损失函数定义为J(S,G),总的损失函数为:
J(G)=αJ(C,G)+βJ(S,G)
这里的CNN的模型用的是Vgg,一共有16个卷积层,加上3个全连接层,一共19层,因此称为VGG-19模型。模型结构如下图所示:
说的比较概略,有兴趣的童鞋可以研究原文,调用来玩玩也是好的嘛!
2.环境搭建和实验
该项目支持TensorFlow的CPU和GPU两种版本,GPU需要有支持的显卡,而CPU上速度会慢很多。
实验用电脑:i7处理器,8G内存,NVIDIA GeForce960,2G显存,属于非常平民的装备。进行一次实验1000次迭代,耗时20min左右,CPU版本没有尝试。
要配置GPU版本的TensorFlow,需要安装以下元素(本文配置为例):
Python3.5.2
cuda_9.0.176_win10
cudnn-9.0-windows10-x64-v7.1
接着安装相关的包,参考项目requirement.txt中的要求,
搭建好环境后,下载源码,源码主要包含了四个文件:neural_style.py、stylize.py、vgg.py、imagenet-vgg-verydeep-19.mat。
neural_style.py:外部接口函数,定义了函数的主要参数以及部分参数的默认值,需在命令行中使用。
stylize.py:核心代码,包含了训练、优化等过程。
vgg.py:定义了网络模型以及相关的运算。
imagenet-vgg-verydeep-19.mat:预训练好的VGG19模型,项目中有下载链接。PS:一般电脑训练19层难度太大了。
运行的语句为:
python neural_style.py --content <content file> --styles <style file> --output <output file>
在对应位置填上content file自己的图片,style file要学习的图片,output file输出图片名,默认的迭代次数1000次,可自行进行修改。运行过程如图所示:
3.其他实验效果
除文章开头的效果图外,本文还做了如下实验:
3.1雨中漫步的姑娘
3.2呐喊猫
关注公众号回复“星空”获取论文,送海量学习资源~
1024程序开发者社区的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里就技术问题进行交流,还没有加入的小伙伴可以扫描下方“社区物业”二维码,让管理员帮忙拉进群,期待大家的加入。