0 有用
3 下载

艺术风格融合的神经网络算法实现

文件列表(压缩包大小 30.05M)

免费

概述

项目描述

这是 Leon A. Gatys,Alexander S. Ecker和Matthias Bethge撰写的论文“基于神经网络的艺术风格处理”的基于Torch的实现。 此文章提出了一种使用卷积神经网络将一幅图像的内容与另一幅图像的样式相结合的算法。这是一个将《星夜》的艺术风格映射 到斯坦福大学校园夜间照片的示例 : 将不同图像的样式应用于相同的内容图像可获得有趣的结果。

内容/风格权衡

该算法允许用户权衡样式和内容重建术语的相对权重,如本示例所示,在该示例中,将毕加索1907年自画像的样式移植到了布拉德·皮特照片上:

风格量表

通过在提取样式特征之前调整样式图像的大小,可以控制从样式图像转移来的艺术特征的类型。你可以使用该-style_scale标志控制此操作。下面会看到三个以“星夜”风格渲染金门大桥的示例。从上到下分别-style_scale是2.0、1.0和0.5。

样式插值

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

转印风格但不彩色

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

项目设置

基础:

  • torch7
  • loadcaffe

可选依赖项:

对于CUDA后端:

CUDA 6.5+ cunn

对于cuDNN后端:

cudnn.torch

对于OpenCL后端:

cltorch clnn 安装依赖项后,需要运行以下脚本来下载VGG模型:

sh models/download_models.sh

此操作将下载原始的VGG-19模型。Leon Gatys提供了他们论文中使用的VGG-19模型的修改版本;这也将被下载。默认情况下,使用原始的VGG-19模型。 如果你的内存GPU较小,则使用NIN Imagenet模型会更好,但效果稍差。你可以从BVLC Caffe ModelZoo获得有关模型的详细信息,并可以从NIN-Imagenet下载文件。 可以在安装指南中找到有关Ubuntu的详细安装说明。

用法

基本用法:

th neural_style.lua -style_image <image.jpg> -content_image <image.jpg>

NCL模型对OpenCL的使用(这需要下载NIN Imagenet模型文件)

th neural_style.lua -style_image examples/inputs/picasso_selfport1907.jpg -content_image examples/inputs/brad_pitt.jpg -output_image profile.png -model_file models/nin_imagenet_conv.caffemodel -proto_file models/train_val.prototxt -gpu 0 -backend clnn -num_iterations 1000 -seed 123 -content_layers relu0,relu3,relu7,relu12 -style_layers relu0,relu3,relu7,relu12 -content_weight 10 -style_weight 1000 -image_size 512 -optimizer adam

要使用多个样式的图像,需要传递以逗号分隔的列表,如下所示:

-style_image starry_night.jpg,the_scream.jpg。

注意,图像路径不应包含~表示主目录的字符;应该改用相对路径或完整的绝对路径。

选项:

  • 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。来自andersbll / neural_artistic_style的想法。

输出选项:

  • 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.txtVGG Caffe模型文件的路径。
  • model_file:.caffemodelVGG 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后端的速度。

经常问的问题

生成的图像具有饱和伪像:

解决方案:将image包更新为最新版本:luarocks install image

在没有GPU的情况下运行会提示错误消息,提示cutorch找不到

解决方案:-gpu -1在仅CPU模式下运行时 传递标志

程序内存不足并死亡

解决方案:尝试减小图像尺寸:(-image_size 256或更小)。需要注意的是不同的图像大小可能会需要非默认值-style_weight,并-content_weight以获得最佳效果。如果在GPU上运行,则也可以尝试使用-backend cudnn来减少内存使用。

得到以下错误消息:

models/VGG_ILSVRC_19_layers_deploy.prototxt.cpu.lua:7: attempt to call method 'ceil' (a nil value) 解决方案:将nn软件包更新为最新版本:luarocks install nn

收到一条错误消息,错误paths.extname

解决方案:将torch.paths软件包更新为最新版本:luarocks install paths

NIN Imagenet模型无法给出良好的结果。

解决方案:确保-proto_file选择了正确的。还要确保为-content_layers和-style_layers设置了正确的参数。(请参阅上面的OpenCL使用示例。)

-backend cudnn比默认的NN后端慢

解决方案:添加标志-cudnn_autotune;这将使用内置的cuDNN自动调谐器选择最佳的卷积算法。

内存使用情况

默认情况下,neural-style将nn后端用于卷积,将L-BFGS用于优化。这些可以提供良好的结果,但是都可以占用大量内存。可以使用以下方法减少内存使用量:

使用cuDNN

添加标志-backend cudnn以使用cuDNN后端。这仅适用于GPU模式。

Use ADAM

添加标志-optimizer adam以使用ADAM代替L-BFGS。这将显着减少内存使用量,但可能需要调整其他参数才能获得良好结果。特别是,应该考虑学习率,内容权重,样式权重,并考虑使用梯度归一化。这些在CPU和GPU模式下均应工作。

缩小图像尺寸:

如果以上技巧还不够,可以缩小生成图像的尺寸;传递标志-image_size 256以生成默认大小一半的图像。 在默认设置下,neural-style的系统使用约3.5GB的GPU内存。切换到ADAM和cuDNN可以将GPU内存占用减少到大约1GB。

速度

速度会因后端和优化器而有很大差异。以下是-image_size=512在具有不同设置的Maxwell Titan X上运行500次迭代的一些时间:

  • backend nn -optimizer lbfgs:62秒
  • backend nn -optimizer adam:49秒
  • backend cudnn -optimizer lbfgs:79秒
  • backend cudnn -cudnn_autotune -optimizer lbfgs:58秒
  • backend cudnn -cudnn_autotune -optimizer adam:44秒
  • backend clnn -optimizer lbfgs:169秒
  • backend clnn -optimizer adam:106秒

以下是在CUDA 8.0 RC上具有cuDNN 5.0的Pascal Titan X上的相同基准:

  • backend nn -optimizer lbfgs:43秒
  • backend nn -optimizer adam:36秒
  • backend cudnn -optimizer lbfgs:45秒
  • backend cudnn -cudnn_autotune -optimizer lbfgs: 30秒
  • backend cudnn -cudnn_autotune -optimizer adam:22秒

多GPU缩放

可以使用多个GPU处理更高分辨率的图像。网络的不同层将在不同的GPU上进行计算。可以控制与该-gpu标志一起使用的GPU ,还可以控制如何使用该-multigpu_strategy标志在GPU之间拆分层。 例如,在具有四个GPU的服务器中,可以赋予该标志-gpu 0,1,2,3以依次处理GPU 0、1、2和3。通过提供标志,-multigpu_strategy 3,6,12指示应该在GPU 0上计算前两层,应该在GPU 1上计算第3至5层,应该在GPU 2上计算第6至11层,其余的应该在GPU上计算3.你需要调整-multigpu_strategy 设置以达到最大分辨率。 如Leon A.Gatys,Alexander S.Ecker,Matthias Bethge,Aaron Hertzmann和Eli Shechtman的论文《控制神经风格转移中的感知因素》所述,可以通过将多GPU处理与多尺度生成相结合来在高分辨率下获得非常高质量的结果。 。 这是在带有四个Pascal Titan X GPU的服务器上生成的3620 x 1905图像:

实施细节

图像以白噪声初始化并使用L-BFGS优化。 执行使用风格重建的conv1_1,conv2_1,conv3_1,conv4_1,和conv5_1层和使用内容重建conv4_2层。与本文一样,五种风格的重构损失具有相等的权重。

引文

如果你认为此代码对你的研究有用,请引用:

@misc{Johnson2015,
  author = {Johnson, Justin},
  title = {neural-style},
  year = {2015},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/jcjohnson/neural-style}},
}

转载自:https://github.com/jcjohnson/neural-style

理工酷提示:

如果遇到文件不能下载或其他产品问题,请添加管理员微信:ligongku001,并备注:产品反馈

评论(0)

0/250