这是本文的Pytorch实施,由Leon A. Gatys,Alexander S. Ecker和Matthias Bethge撰写的艺术风格的神经算法。该代码基于贾斯汀·约翰逊(Justin Johnson)的神经风格。
该论文提出了一种算法,用于使用卷积神经网络将一个图像的内容与另一个图像的样式相结合。这是一个示例,将星空之夜的艺术风格映射到斯坦福校园的夜间照片:
将不同图像的样式应用于相同的内容图像可获得有趣的结果。在这里,我们从论文中复制了图2,该图2以各种样式为德国的Tubingen提供了一张照片:
以下是将各种艺术品的风格应用于金门大桥的这张照片的结果:
该算法允许用户权衡样式和内容重建项的相对权重,如本示例所示,我们将毕加索(Picasso)1907年自画像的样式移植到Brad Pitt:
通过在提取样式功能之前调整样式图像大小,我们可以控制从样式图像传输的艺术特征的类型;您可以使用-style_scale标志来控制此行为。在下面,我们看到了三个例子,这些例子是以星空之夜的风格渲染金门桥。从左到右, -style_scale为2.0、1.0和0.5。
您可以使用多个样式图像来融合多种艺术风格。
顺时针从左上方顺时针方向:“星空之夜” +“尖叫”,“尖叫” +“构图VII”,“裸体裸体” +“ coptosing vii”和“坐在裸体” +“裸体” +“星空之夜”
使用多个样式图像时,您可以控制它们混合的程度:
如果添加flag -original_colors 1则输出图像将保留原始图像的颜色。
依赖性:
可选依赖性:
安装依赖项后,您需要运行以下脚本才能下载VGG模型:
python models/download_models.py
这将下载原始的VGG-19型号。原始的VGG-16型号也将下载。默认情况下,使用原始VGG-19模型。
如果您的内存GPU较小,那么使用NIN Imagenet模型会更好,并给出稍差但可比的结果。您可以从BVLC Caffe ModelZoo获取有关模型的详细信息。运行download_models.py脚本时,下载了NIN模型。
您可以在“安装指南”中找到Ubuntu和Windows的详细安装说明。
基本用法:
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
要使用多个样式图像,请通过这样的逗号分隔列表:
-style_image starry_night.jpg,the_scream.jpg 。
请注意,图像路径不应包含~字符来表示您的主目录;相反,您应该使用相对路径或完整的绝对路径。
选项:
-image_size :生成图像的最大侧长(以像素为单位)。默认值为512。-style_blend_weights :将多种样式图像样式混合的权重作为逗号分隔的列表,例如-style_blend_weights 3,7 。默认情况下,所有样式图像都同样加权。-gpu :使用GPU的零索引ID;对于CPU模式集-gpu到c 。优化选项:
-content_weight :加权内容重建项多少。默认值为5E0。-style_weight :加权样式重建术语多少。默认值为1E2。-tv_weight :总变化(电视)正则化的重量;这有助于平滑图像。默认值为1E-3。设置为0以禁用电视正则化。-num_iterations :默认值为1000。-init :生成生成图像的方法; random或image之一。默认值是random ,它使用纸张中的噪声初始化; image初始化内容图像。-init_image :用用户指定的图像替换初始化图像。-optimizer :要使用的优化算法; lbfgs或adam ;默认值为lbfgs 。 L-BFG倾向于给出更好的结果,但使用更多的内存。切换到亚当将减少记忆使用量;使用亚当时,您可能需要使用其他参数来获得良好的结果,尤其是样式的重量,内容重量和学习率。-learning_rate :与Adam Optimizer一起使用的学习率。默认值为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,则输出图像将保留内容图像的颜色。-model_file :VGG CAFFE模型的.pth文件的路径。默认值是原始的VGG-19型号;您也可以尝试原始的VGG-16型号。-pooling :要使用的合并层的类型; max或avg之一。默认值为max 。 VGG-19型号使用最大池层,但是论文提到,用平均池层代替这些层可以改善结果。我无法使用平均合并获得良好的结果,但是选择在这里。-seed :可以指定可重复结果的整数值。默认情况下,此值对于每个运行都是随机的。-multidevice_strategy :使用多个设备时拆分网络的图层索引列表。有关更多详细信息,请参见Multi-GPU缩放。-backend : nn , cudnn , openmp或mkl 。默认为nn 。 mkl需要英特尔的MKL后端。-cudnn_autotune :使用Cudnn后端时,将此标志传递以使用内置的Cudnn Autotuner为您的体系结构选择最佳的卷积算法。这将使第一次迭代稍慢一点,并且可能需要更多的内存,但可能会大大加快Cudnn后端的速度。 问题:该程序耗尽内存并死亡
解决方案:尝试减小图像大小: -image_size 256 (或较低)。请注意,不同的图像尺寸可能需要-style_weight和-content_weight的非默认值才能获得最佳结果。如果您在GPU上运行,也可以尝试使用-backend cudnn运行以减少内存使用量。
问题: -backend cudnn比默认NN后端慢
解决方案:添加标志-cudnn_autotune ;这将使用内置的Cudnn自动持有器选择最佳的卷积算法。
问题:获取以下错误消息:
Missing key(s) in state_dict: "classifier.0.bias", "classifier.0.weight", "classifier.3.bias", "classifier.3.weight". Unexpected key(s) in state_dict: "classifier.1.weight", "classifier.1.bias", "classifier.4.weight", "classifier.4.bias".
解决方案:由于与图层位置混合在一起,较旧的型号需要修复与较新版本的Pytorch兼容。随附的donwload_models.py脚本将在下载模型后自动执行这些修复程序。
默认情况下, neural-style-pt使用nn后端进行卷积和L-BFG进行优化。这些可以带来良好的结果,但都可以使用很多内存。您可以减少以下记忆使用量:
-backend cudnn以使用cudnn后端。这仅在GPU模式下工作。-optimizer adam以使用ADAM代替L -BFG。这应该大大减少内存使用情况,但可能需要调整其他参数以取得良好的结果;特别是您应该使用学习率,内容重量和样式的体重。这应该在CPU和GPU模式下起作用。-image_size 256以生成默认大小一半的图像。在默认设置的情况下,神经风格的PT在我的系统上使用了约3.7 GB的GPU内存;切换到Adam和Cudnn将GPU内存足迹降低到约1GB。
速度可能会因后端和优化器而异。以下是在带有不同设置的Tesla K80上使用-image_size=512运行500次迭代的时间:
-backend nn -optimizer lbfgs :117秒-backend nn -optimizer adam :100秒-backend cudnn -optimizer lbfgs :124秒-backend cudnn -optimizer adam :107秒-backend cudnn -cudnn_autotune -optimizer lbfgs :109秒-backend cudnn -cudnn_autotune -optimizer adam :91秒这是GTX 1080上的相同基准:
-backend nn -optimizer lbfgs :56秒-backend nn -optimizer adam :38秒-backend cudnn -optimizer lbfgs :40秒-backend cudnn -optimizer adam :40秒-backend cudnn -cudnn_autotune -optimizer lbfgs :23秒-backend cudnn -cudnn_autotune -optimizer adam :24秒您可以使用多个CPU和GPU设备来处理更高分辨率的图像;网络的不同层将在不同的设备上计算。您可以控制哪些GPU和CPU设备与-gpu标志一起使用,并且可以控制如何使用-multidevice_strategy标志在设备上拆分图层。
例如,在具有四个GPU的服务器中,您可以给出flag -gpu 0,1,2,3以按该顺序进行GPU 0、1、2和3的处理; by also giving the flag -multidevice_strategy 3,6,12 you indicate that the first two layers should be computed on GPU 0, layers 3 to 5 should be computed on GPU 1, layers 6 to 11 should be computed on GPU 2, and the remaining layers should be computed on GPU 3. You will need to tune the -multidevice_strategy for your setup in order to achieve maximal resolution.
如莱昂·A·盖蒂斯(Leon A. Gatys ) ,亚历山大·S·埃克(Alexander S.
这是在带有八个Tesla K80 GPU的服务器上生成的4016 x 2213图像:
用于生成此图像的脚本可以在此处找到。
图像用白噪声初始化,并使用L-BFG进行了优化。
我们使用conv1_1 , conv2_1 , conv3_1 , conv4_1和conv5_1层和内容重建使用conv4_2层执行样式重建。与本文一样,五种样式的重建损失具有相等的权重。
如果您发现此代码对您的研究有用,请使用提供的引用引用。