艺术往往超越了人类的存在。回顾整个人类的历史进程,我们可以发现艺术的重要性,艺术品往往都是一个人实现表达自我对世界认知的一种手段。
传奇画物毕加索曾经说过:
“It took me four years to paint like Raphael, but a lifetime to paint like a child.”
大多数艺术创作都遵循某种模式—— 一种令人愉悦并激发我们创造性的艺术风格模式。
当我们在观察某件艺术品时,如果我们试着注意它的颜色主题变化,或者里面的笔触,我们可以从中看到某种艺术风格模式浮现出来。通常人类善于潜意识地识别这些风格模式。
现在,在神经网络的帮助下,识别并重建这种风格模式的能力也得到了快速发展。
在本文中,我们将构建一个轻量级的PyTorch版神经风格转换实现,如上所示,我们可以通过五个简单的步骤来将流行艺术风格转换到任何图像上。上图中,左侧为我们的内容图像,中间为我们的风格图像,最右侧为我们生成的新的艺术照,它不仅包含左侧内容图像的内容,同时具备中间风格图像的艺术风格.
闲话少说,我们直接开始吧.
Neural style transfer (NST) 是一种新的技术手段,它接受两张图像作为输入: 内容图像和艺术风格图像,生成的目标图像会将内容图像的内容进行保留,风格会替换为艺术风格图像一样的艺术风格.
该算法的核心思想为分别从内容和风格图像中提取相应的内容和风格特征,并将这两种特征重新组合生成目标图像,之后通过不断迭代重建目标图像,依据是生成的目标图像需要和内容图像具有相同的内容,和艺术风格图像具有相同的艺术风格.
我们使用预先训练好的卷积神经网络(本文为VGG19)来提取图像特征。
我们观察到网络的浅层输出,主要为表示颜色和纹理等低级特征(style)。
同样我们观察网络后几层的输出往往代表更高层次的特征(content)——例如,猫的眼睛和耳朵等。
我们首先将我们的内容图像,通过VGG19前向传播,然后将网络后面的卷积层(conv4_2)的输出进行采样,当作我们提取到的内容特征。
接着我们将我们的风格图像, 通过VGG19前向传播,在网络的前段到中段的卷积层进行多次采样,当作我们提取到的浅层特征. (conv1_1, conv2_1, conv3_1, conv4_1, conv5_1),
上述特征图需要经过Gram 矩阵转换进行编码后,作为我们的风格特征.
我们的目标是合成一个输出图像,这个图像由第一个图像的内容和另一个图像的风格样式组成。为此,我们计算以下损失函数:
- content loss : 从内容图像提取到的conv4_2 和 从生成图像提取到的conv4_2 之间的L2距离
- style loss: 从风格图像对应的五个浅层特征图的输出 和 从生成图对应的五个浅层特征图的输出 之间的L2距离之和
- variation loss: 用于保证生成图像像素之间的平滑性,从而对其进行去噪并赋予其视觉连贯性
- total loss: 上述三个loss的加权之和
你可以从这里下载对应的代码,代码结构如下:
其中:
$ git clone [email protected]:sgzqc/NST.git
$ cd NST
$ PATH =
$ CONTENT_IMAGE =
$ STYLE_IMAGE =
python3 NST.py
以下输出图像是使用本文中的代码,进行训练后生成的。我建议大家可以下载下来尝试一下这个过程.
不同风格的猫:
不同风格的风景图:
不同风格的机器小人:
本文介绍了风格迁移的原理,并针对性的讲解了相应的损失函数的含义,同时展示了不同分格迁移的效果图,最后给出了完整的代码实现.
您学废了吗?
链接一
链接二
关注公众号《AI算法之道》,获取更多AI算法资讯。
关注公众号,后台回复 NST,即可获取源代码。