扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
波士顿
介绍
神经风格迁移(Neural Transfer Style)是人工智能在创造性环境中最令人惊奇的应用之一。在这个项目中,我们将看到如何将艺术绘画风格转换为所选图像,从而创造出令人惊叹的效果。Leon A. Gatys等人在2015年发布的论文"艺术风格的神经算法"中构思了神经风格迁移的概念。之后,许多研究人员应用和改进了方法,增加了损失的元素,尝试了不同的优化器并试验了用于此目的的不同神经网络。尽管如此,这篇原始论文仍然是理解这一概念的最佳来源,而VGG16和VGG19网络是这方面最常用的模型。考虑到两者在最近的网络中表现优异,这种选择是不寻常的,这种选择在风格迁移中获得了最高的性能。
https://arxiv.org/abs/1508.06576
你可以查看此GitHub存储库以获取完整代码。
https://github.com/maurock/neural_transfer_style
它是如何工作的?
这种技术的目标是将图像的风格(我们称之为"风格图像")应用于目标图像,从而保留后者的内容。我们来定义这两个术语:
风格是图像中的纹理和视觉图案。一个例子是艺术家的笔触。
内容是图像的宏观结构。人物、建筑物、物体是图像内容的示例。
这里显示了不错的效果:
你想看到更多的效果吗?在文章的最后可以浏览。
让我们看看高级步骤:
选择要设置风格的图像
•选择样风格参考图像。通常,这是一幅具有独特和可识别风格的绘画。
初始化预训练的深度神经网络,并获得中间层的特征表示。完成该步骤以实现内容图像和风格图像的表示。在内容图像中,最好的选择是获得最高层的特征表示,因为它们包含有关图像宏结构的信息。对于风格参考图像,从不同比例的多个层获得特征表示。
定义损失函数,以最小化内容损失、样式损失和变化损失的总和。每次迭代,优化器都会生成一个图像。内容损失是生成的图像和内容图像之间的差异(L2归一化),而生成的图像和样式之间的样式损失。稍后我们将看到这些变量是如何在数学上定义的。
重新考虑损失的最小化
图像处理和图像逆向处理
首先,我们需要格式化在网络使用的图像。我们将要使用的卷积神经网络(CNN)是经过预先训练的VGG19会议。当我们将图像处理成兼容的阵列时,我们还需要对生成的图像进行解处理,从BGR切换到RGB格式。让我们构建两个辅助函数来执行此操作:
内容损失
内容损失将主要输入图像的内容保留为风格。由于卷积神经网络的较高层包含图像宏观结构的信息,因此我们将内容损失计算为输入图像的最高层的输出与所生成图像的同一层之间的差异(L2归一化)。
内容损失定义为:
内容损失
在等式中,F是内容图像的特征表示(当我们运行输入图像时网络输出的内容),以及P是在特定隐藏层l处生成的图像之一。
这是实施的内容:
风格损失
理解风格损失并不像内容丢失那么简单。目标是在新生成的图像中保持图像的样式(即视觉图案作为笔画)。在前一种情况下,我们比较中间层的原始输出。在这里,我们比较样式参考图像和生成的图像的特定图层的Gram矩阵之间的差异。Gram矩阵被定义为给定层的矢量化特征映射之间的内积。矩阵的含义是捕获层的特征之间的相关性。计算多个层的损失允许保留在样式图像和生成的图像之间的不同层内部相关的类似特征。
单个图层的样式损失计算如下:
每层风格丢失
在等式中,A是风格图像的Gram矩阵,G是生成图像的Gram矩阵,两者都与给定层有关。 N和M是风格图像的宽度和高度。
首先为每个单独的图层计算样式损失,然后将其应用于考虑为风格建模的每个图层。我们来实现它:
变化损失
最后,损失的最后一个部分是变化损失。这个元素未包含在原始论文中,并不是项目成功的必要条件。实际上,经验证明,添加这个元素会产生更好的结果,因为它可以平滑像素之间的颜色变化。
让我们把这个包括进来:
总体损失
最后,考虑到所有这些贡献,计算总体损失。首先,我们需要提取我们选择的特定图层的输出。为此,我们将字典定义为
然后,我们计算调用以前函数的代码的损失。每个组件乘以特定的权重,我们可以调整以产生强烈或更轻的效果:
设置神经网络
VGG19网络将一批三个图像作为输入:输入内容图像、风格参考图像和包含生成图像的符号张量。前两个是常量变量,使用包keras.backend定义为Variable。第三个变量定义为占位符(placeholder),因为它会在优化程序更新结果时随时间变化。
一旦变量被初始化,我们就将它们加入到张量中,这将在网络后期提供。
完成后,我们需要定义损耗、梯度和输出。原始论文使用算法L-BFGS作为优化器。该算法的一个限制是它需要分别转换损失和梯度。由于独立地计算它们将是非常低效的,我们将实现一次计算损失和梯度值的Evaluator类,但是单独返回它们。我们开始实施:
最后一步
最后,一切都准备好了!最后一步是多次迭代优化器,直到达到所需的损失或所需的结果。我们将沿着迭代保存结果,以检查算法是否按预期工作。如果结果不令人满意,我们可以使用权重来改善生成的图像。
要查看整个代码,请参阅页面开头提供的GitHub链接。
结果
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流