艺术风格转换的火把实现

neural-style的Python项目详细描述


神经型pt

这是本文的pytorch实现,是一种艺术风格的神经算法。 作者:利昂·A·盖茨、亚历山大·S·埃克和马蒂亚斯·贝奇。该代码基于justin johnson的神经风格。

本文提出了一种将一幅图像的内容与另一幅图像的风格结合起来的算法 卷积神经网络。下面是一个例子,它描绘了 繁星之夜 在斯坦福大学校园的夜间照片上:

< div >

将不同图像的样式应用于相同的内容图像可以得到有趣的结果。 在这里,我们从报纸上复制了图2,这是一张德国图宾根人的照片。 款式多样:

< div >

以下是将各种艺术品的风格应用于 金色的门桥:

< div >
< div >
< div >

内容/风格折衷

算法允许用户为了权衡样式和内容重建术语的相对权重, 如本例所示,我们将毕加索1907年的自画像移植到brad pitt:

< div >
< div > 在这一点上,我们都会注意到这一点,我们也会注意到这一点,我们的地址是:DD414D6C0696C06985F3683D13C7396C6D9D7FCD79BDF/6874747474707332222222222F172726267676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767706974745F70696361736F5F636F6E74656E745F315F7374796C655F3130302E706E67" />

样式比例

通过在提取样式特征之前调整样式图像的大小,我们可以控制艺术的类型 从样式图像传输的功能;可以使用-style_scale标志控制此行为。 下面我们看到三个以星夜风格渲染金门大桥的例子。 从左到右,-style_scale是2.0、1.0和0.5。

< div >

多样式图像

您可以使用多个样式图像来混合多种艺术样式。

从左上角顺时针方向看:"繁星之夜"+"尖叫声","TH"E尖叫"+"组合七", "裸体坐姿"+"构图七"和"裸体坐姿"+"星夜"

< div >

样式插值

使用多样式图像时,可以控制它们的混合程度:

< div >

转移样式但不转移颜色

如果添加标志-原始颜色1则输出图像将保留原始图像的颜色。

< div >

设置:

依赖关系:

可选依赖项:

安装依赖项后,需要运行以下脚本才能下载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

请注意,指向图像的路径不应包含表示主目录的~字符;而应使用相对的 路径或完全绝对路径。

选项

优化选项

输出选项

图层选项

其他选项

常见问题

问题:程序内存不足并死机

解决方案:尝试减小图像大小:-图像大小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进行优化。这些都有很好的效果,但都会占用大量的内存。您可以通过以下方法减少内存使用:

在默认设置下,神经风格的pt在我的系统上使用大约3.7gb的gpu内存;切换到adam和cudnn会将gpu内存占用减少到大约1gb。

速度

根据后端和优化器的不同,速度可能有很大的不同。 下面是在特斯拉K80上运行500次不同设置的迭代的时间:

以下是GTX 1080的相同基准:

实施细节

图像用白噪声初始化,并使用L-bfgs进行优化。

我们使用conv1_1conv2_1conv3_1conv4_1conv5_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}},
}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将Scanner对象作为构造函数参数传递给UserInterface类   spring未能启动bean“subtocolWebSocketHandler”;嵌套的例外是java。lang.IllegalArgumentException:没有处理程序   Java EE应用程序中后台服务的多线程Java线程(设置守护进程和优先级)?   java Pull to refresh返回列表的第一个位置   无法将comparator类转换为java。可比的   java将json从servlet传递到dojo   JavaHibernate:将子类实例转换为超类实例   java警告调用servlet类时非法反射访问   java静态变量值   java@Entity和@embeddeble之间有什么区别   java将作业配置导入公共作业配置类(注释配置)   sql公共表表达式(以values语句开头)在java中给出错误   java在ImageJ中使用ImageProcessor   java PostgreSQL executeBatch()会随着时间的推移而变慢   java在安卓中以表格形式排列sqllite表数据?   java中SVG的swing定制呈现   java删除与另一个实体映射的实体   java何时/如何添加ListView适配器,使用back按钮恢复它?(片段)   java为什么IBinder和Binder之间的类型转换不是非法的?   java在方法参数列表中使用ArrayList或List