艺术风格转换的火把实现
neural-style的Python项目详细描述
神经型pt
这是本文的pytorch实现,是一种艺术风格的神经算法。 作者:利昂·A·盖茨、亚历山大·S·埃克和马蒂亚斯·贝奇。该代码基于justin johnson的神经风格。
本文提出了一种将一幅图像的内容与另一幅图像的风格结合起来的算法 卷积神经网络。下面是一个例子,它描绘了 繁星之夜 在斯坦福大学校园的夜间照片上:
< div >将不同图像的样式应用于相同的内容图像可以得到有趣的结果。 在这里,我们从报纸上复制了图2,这是一张德国图宾根人的照片。 款式多样:
< div >以下是将各种艺术品的风格应用于 金色的门桥:
< div >内容/风格折衷
算法允许用户为了权衡样式和内容重建术语的相对权重, 如本例所示,我们将毕加索1907年的自画像移植到brad pitt:
< div >样式比例
通过在提取样式特征之前调整样式图像的大小,我们可以控制艺术的类型
从样式图像传输的功能;可以使用-style_scale
标志控制此行为。
下面我们看到三个以星夜风格渲染金门大桥的例子。
从左到右,-style_scale
是2.0、1.0和0.5。
多样式图像
您可以使用多个样式图像来混合多种艺术样式。
从左上角顺时针方向看:"繁星之夜"+"尖叫声","TH"E尖叫"+"组合七", "裸体坐姿"+"构图七"和"裸体坐姿"+"星夜"
< div >样式插值
使用多样式图像时,可以控制它们的混合程度:
< div >转移样式但不转移颜色
如果添加标志-原始颜色1
则输出图像将保留原始图像的颜色。
设置:
依赖关系:
可选依赖项:
- 对于CUDA后端:
- CUDA 7.5或以上
- 对于CUDNN后端:
- CUDNN V6或以上
安装依赖项后,需要运行以下脚本才能下载VGG模型:
python models/download_models.py
这将下载原始的vgg-19模型。 原始的vgg-16模型也将被下载。默认情况下,使用原始VGG-19型号。
如果你有一个较小的内存gpu,那么使用nin imagenet模型会更好,并给出稍差但可比较的结果。您可以从bvlc-caffe-model zoo获取模型的详细信息。运行download\u models.py
脚本时,将下载nin模型。
用法
基本用法:
python neural_style.py -style_image <image.jpg> -content_image <image.jpg>
NIN型号的CUDNN使用:
python neural_style.py -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet.pth -gpu 0 -backend cudnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 500 -image_size 512 -optimizer adam
而在"毕加索布拉德皮特的模特儿毕加索布拉德皮特的模特儿" src="https://warehouse-camo.cmh1.psfhosted.org/50500E98D8FA927E5b0F6B6B51D747499B5EF46D/68747474707332222222F17272727267676767676767676767676767757575757265727272656F6E7474656E747465362E747272727236367272726767676767676772726262626267727272626262626262625772626262626262626262626262626267676767676767676767676767676767676767747个07574732F7069745F70696361736F5F6E696E5F6375646E6E2E706E67" />
要使用多种样式的图像,请传递一个逗号分隔的列表,如下所示:
-style_image starry_night.jpg,the_scream.jpg
请注意,指向图像的路径不应包含表示主目录的~
字符;而应使用相对的
路径或完全绝对路径。
选项:
-图像大小:生成图像的最大边长(以像素为单位)。默认值为512。
-样式混合权重:混合多样式图像样式的权重,作为 逗号分隔的列表,例如
-style_blend_weights 3,7
。默认情况下,所有样式图像 重量相等。-gpu
:要使用的gpu的零索引id;对于cpu模式,将-gpu
设置为-1。
优化选项:
-content_weight
:内容重建项的权重。默认值为5e0。-style_weight
:样式重建项的权重。默认值为1e2。-tv-weight
:总变化(tv)正则化的权重;这有助于平滑图像。 默认值为1e-3。设置为0可禁用电视正则化。-迭代次数:默认值为1000。
-init
:生成生成图像的方法;random或image
之一。 默认值为random
它使用与论文中一样的噪声初始化;图像代码> 使用内容图像初始化。
-优化器
:要使用的优化算法;要么lbfgs
要么adam
;默认值为lbfgs
。 l-bfgs倾向于给出更好的结果,但使用更多的内存。切换到adam将减少内存使用; 使用adam时,可能需要使用其他参数才能获得良好的结果,特别是 风格权重、内容权重和学习率。-学习率:与ADAM优化器一起使用的学习率。默认值为1e1。
输出选项:
-输出图像
:输出图像的名称。默认为out.png
-print iter
:打印每一次迭代的进度。设置为0将禁用打印。-保存iter
:每隔次保存iter
迭代保存图像。设置为0将禁用保存中间结果。
图层选项:
-content_layers
:用于内容重建的层名称的逗号分隔列表。 默认值为relu4_2
-style_layers
:用于样式重建的层名称的逗号分隔列表。 默认值为relu1、relu2、relu3、relu4、relu5。
其他选项:
-样式缩放:从样式图像提取特征的缩放。默认值为1.0。
-原始颜色
:如果设置为1,则输出图像将保留内容图像的颜色。-model_file
:vgg caffe模型的.pth
文件的路径,该文件已转换为pytorch。 默认为原始VGG-19型号;您也可以尝试原始VGG-16型号。-池
:要使用的池层类型;是max
或avg
之一。默认值为max
。 vgg-19模型使用最大池层,但是论文提到用平均值替换这些层 合并层可以改善结果。使用平均池我没能得到好的结果,但是 选项在这里。-后端:
nn
,cudnn
或mkl
。默认值为nn
。mkl
需要英特尔的mkl后端。-cudnn_autotune
使用cudnn后端时,传递此标志以使用内置cudnn autotuner来选择 最适合您的体系结构的卷积算法。这将使第一次迭代稍微慢一点,并且可以 占用更多内存,但可能会显著加快CUDNN后端的速度。
常见问题
问题:程序内存不足并死机
解决方案:尝试减小图像大小:-图像大小256
(或更低)。注意,不同的图像大小可能
需要-style_weight
和-content_weight
的非默认值才能获得最佳结果。
如果在GPU上运行,也可以尝试使用-backend cudnn
运行以减少内存使用。
问题:-后端cudnn
比默认nn后端慢
解决方案:添加标志-cudnn_autotune
;这将使用内置的cudnn autotuner来选择最佳卷积算法。
问题:获取以下错误消息:
state中缺少键"classifier.0.bias","classifier.0.weight","classifier.3.bias","classifier.3.weight"。状态中的意外键"classifier.1.weight"、"classifier.1.bias"、"classifier.4.weight"、"classifier.4.bias"。
解决方案:由于与层位置混淆,较旧的型号需要修复程序才能与较新版本的pytorch兼容。其中包括donwload_models.py
下载模型后,脚本将自动执行这些修复。
内存使用量
默认情况下,神经风格pt
使用nn
后端进行卷积,使用l-bfgs进行优化。这些都有很好的效果,但都会占用大量的内存。您可以通过以下方法减少内存使用:
- 使用CUDNN:添加标志
-后端CUDNN
以使用CUDNN后端。这只能在GPU模式下工作。 - 使用adam:添加标志
-优化器adam
以使用adam而不是l-bfgs。这应该非常重要 减少内存使用,但可能需要调整其他参数以获得良好的结果;特别是您应该 玩玩学习速度、内容权重和风格权重。 这应该可以在CPU和GPU模式下工作。 - 缩小图像大小:如果以上技巧还不够,可以缩小生成图像的大小;
传递标志
-图像大小256
以生成默认大小一半的图像。
在默认设置下,神经风格的pt在我的系统上使用大约3.7gb的gpu内存;切换到adam和cudnn会将gpu内存占用减少到大约1gb。
速度
根据后端和优化器的不同,速度可能有很大的不同。 下面是在特斯拉K80上运行500次不同设置的迭代的时间:
-后端nn-优化器lbfgs
:117秒-后端nn-优化器adam
:100秒-后端cudnn-优化器lbfgs
:124秒-后端cudnn-优化器adam
:107秒-后端cudnn-cudnn_autotune-优化器lbfgs
:109秒-后端cudnn-cudnn_autotune-优化器adam
:91秒
以下是GTX 1080的相同基准:
-后端nn-优化器lbfgs
:56秒-后端nn-优化器adam
:38秒-后端cudnn-优化器lbfgs
:40秒-后端cudnn-优化器adam
:40秒-后端cudnn-cudnn_autotune-优化器lbfgs
:23秒-后端cudnn-cudnn_autotune-优化器adam
:24秒
实施细节
图像用白噪声初始化,并使用L-bfgs进行优化。
我们使用conv1_1
、conv2_1
、conv3_1
、conv4_1
和conv5_1
层执行样式重建。
以及使用conv4_2层进行内容重建。如文中所述,五种类型的重建损失
重量相等。
引文
如果您发现此代码对您的研究有用,请引用:
@misc{ProGamerGov2018,
author = {ProGamerGov},
title = {neural-style-pt},
year = {2018},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/ProGamerGov/neural-style-pt}},
}