一、缘起
这两天在设计一个网页,需要使用同一风格的图片来渲染氛围,当然作为一只懒狗是懒得动手一张一张画的,于是就想到了风格迁移,找了下GitHub,发现了Neural-Style这个项目,就决定是它了!
这张是官方的例子,更多请移步原项目
二、安装
该项目是基于Leon A. Gatys, Alexander S. Ecker, 和 Matthias Bethge撰写的论文《A Neural Algorithm of Artistic Style》论文,使用lua语言基于torch实现的,所以在安装之前首先要安装torch7和loadcaffe这两个必装的依赖,其他关于使用GPU进行计算的CUDA、cunn等等,由于我是在虚拟机里面跑的,只能使用CPU进行计算,就不再介绍了
我使用的环境是Ubuntu19,虚拟机运行
1.安装torch7
torch7的GitHub项目主页:戳我
torch7官网:戳我
首先将torch7的项目代码clone下来
git clone https://github.com/torch/distro.git ~/torch --recursive
完成后从进入~/torch文件夹
cd ~/torch;
然后执行下面的命令安装依赖:
bash install-deps;
需要注意的是,这里需要将install-deps文件修改一下,不然会报错导致安装失败:
装了vscode的话可以直接code install-deps
将其打开,然后Ctrl + H
打开替换,将该文件中所有的python-software-properties
替换为software-properties-common
,然后保存在执行上面的命令即可,这里没记错的话出去注释只需要修改两处即可
没装vscode的话可以直接vi install-deps
找到需要修改的地方修改即可
这个安装可能需要一段时间,此时可以来杯咖啡了
依赖安装完成后,执行下面的命令安装torch:
./install.sh
安装最后一步输入yes即可
不出意外的话,torch已经安装好了,命令行输入th
命令验证,如果出现的是下面这个样子,即是安装成功:
$ th
______ __ | Torch7
/_ __/__ ________/ / | Scientific computing for Lua.
/ / / _ \/ __/ __/ _ \ | Type ? for help
/_/ \___/_/ \__/_//_/ | https://github.com/torch
| http://torch.ch
th>
2.安装loadcaffe
loadcaffe的GitHub项目主页:戳我
安装loadcaffe的前提是已经安装了torch,loadcaffe安装没有需要的依赖,只需要安装protobuf(百度翻译原型,觉着不太准确,附上参考),命令行执行下面的命令:
sudo apt-get install libprotobuf-dev protobuf-compiler
然后执行下面的命令来安装 loadcaffe:
luarocks install loadcaffe
这里要注意的是,如果你的系统以前已经安装过torch,那么这一步会报错,你需要将~/torch/install/bin
目录添加进环境变量:
PATH=$PATH:~/torch/install/bin
到了这一步依赖已经安装完毕了,接下来就是安装neural-style了
3.安装neural-style
neural-style的GitHub项目主页:戳我
首先将项目克隆下来:
git clone https://github.com/jcjohnson/neural-style.git
完毕后进入项目目录,执行下面的命令来下载所需要的VGG模型:
sh models/download_models.sh
将近一个G的大小,又是一段漫长的等待
下载完毕后,就可以开始使用它来生成自己的风格迁移图片了
三、使用
先来介绍基本用法:
th neural_style.lua -style_image <image.jpg> -content_image <image.jpg>
例如我使用example文件夹中皮尔特·克里斯蒂安·窦曼森的作品《The shipwreck》的去生成我一张壁纸的风格迁移图片:
可以使用下面的命令来生成,-gpu -1
标记的意思是不使用GPU而使用CPU来进行生成,因为我是在VMware里面跑的,没办法使用主机GPU,所以加上了这个标记
th neural_style.lua -style_image examples/inputs/shipwreck.jpg -content_image ~/Pictures/ivan-torres-376149-unsplash.jpg -gpu -1
运行后将会生成十张图片,效果从差到好,这里我只放上第一、五张和最后生成的第十张供参考:
第一张:
第五张:
第十张:
基本使用就说到这里了,下面是一些高级选项:
选项:
-
-image_size
:生成的图像的最大边长(以像素为单位)。默认值为512。 -
-style_blend_weights
:用于混合多个样式图像的样式的权重,以逗号分隔的列表形式显示,例如-style_blend_weights 3,7
。默认情况下,所有样式图像的权重均相等。 -
-gpu
:要使用的GPU的零索引ID;对于CPU模式设置-gpu
为-1。
优化选项:
-
-content_weight
:衡量内容重建术语的权重。默认值为5e0。 -
-style_weight
:衡量样式重建术语的权重。默认值为1e2。 -
-tv_weight
:总差异(TV)规范化的权重;这有助于使图像平滑。默认值为1e-3。设置为0禁用电视正则化。 -
-num_iterations
:默认为1000。 -
-init
:生成生成图像的方法;一个random
或image
。默认值是random
使用本文中的噪声初始化;image
用内容图像初始化。 -
-optimizer
:要使用的优化算法;任一lbfgs
或adam
; 默认值为lbfgs
。L-BFGS往往会提供更好的结果,但会占用更多内存。切换到ADAM将减少内存使用量。使用ADAM时,您可能需要使用其他参数才能获得良好的效果,尤其是样式权重,内容权重和学习率;您可能还需要在使用ADAM时对梯度进行归一化。 -
-learning_rate
:与ADAM优化器一起使用的学习率。默认值为1e1。 -
-normalize_gradients
:如果存在此标志,则来自每一层的样式和内容渐变将被L1归一化。
输出选项:
-
-output_image
:输出图像的名称。默认值为out.png
。 -
-print_iter
:每次print_iter
迭代打印进度。设置为0以禁用打印。 -
-save_iter
:每次save_iter
迭代保存图像。设置为0将禁用保存中间结果。
图层选项:
-
-content_layers
:用逗号分隔的图层名称列表,用于内容重建。默认值为relu4_2
。 -
-style_layers
:用逗号分隔的图层名称列表,用于样式重建。默认值为relu1_1,relu2_1,relu3_1,relu4_1,relu5_1
。
其他选择:
-
-style_scale
:从样式图像中提取要素的比例。默认值为1.0。 -
-original_colors
:如果将此设置为1,则输出图像将保留内容图像的颜色。 -
-proto_file
:deploy.txt
VGG Caffe模型文件的路径。 -
-model_file
:.caffemodel
VGG Caffe模型文件的路径。默认为原始VGG-19型号;您也可以尝试本文中使用的归一化VGG-19模型。 -
-pooling
:要使用的池化层的类型;一个max
或avg
。默认值为max
。VGG-19模型使用最大池化层,但是本文提到用平均池化层替换这些层可以改善结果。使用平均池无法获得良好的结果,但是这里有一个选项。 -
-backend
:nn
,cudnn
,或clnn
。默认值为nn
。cudnn
需要 cudnn.torch并可能减少内存使用。clnn
需要cltorch和clnn -
-cudnn_autotune
:使用cuDNN后端时,传递此标志以使用内置cuDNN自动调谐器为您的体系结构选择最佳卷积算法。这将使第一次迭代慢一些,并可能占用更多的内存,但可能会大大加快cuDNN后端的速度。
本篇文章对neural-style的介绍就到这里,对源码有兴趣的师傅可以移步GitHub研究
参考资料
- https://askubuntu.com/questions/422975/e-package-python-software-properties-has-no-installation-candidate
- http://torch.ch/docs/getting-started.html#_
- https://github.com/szagoruyko/loadcaffe/issues/48