在深度学习的领域中,有许多激动人心的应用,比如面部识别、机器翻译和语音识别。在这个领域中,还隐藏着一种令人兴奋的艺术形式——神经风格迁移。对于内心的艺术家来说,神经风格迁移提供了像毕加索一样绘画的能力。简单来说,它就是通过深度学习的魔力,将内容(布局或草图)与风格(绘画或颜色)融合在一起。让一起踏上神经风格迁移的创意探索之旅,揭开其在图像转换中迷人的应用。
神经风格迁移(Neural Style Transfer, NST)是一种结合了图像内容和风格的技术,它允许将一种图像的风格应用到另一种图像的内容上。本文将带了解NST的基本原理,并探讨其在图像转换中的应用。
神经风格迁移的核心思想是“可以在CNN中分离风格表示和内容表示,这些表示在学习计算机视觉任务(例如图像识别任务)时获得。”假设已经听说过ImageNet竞赛,从那里了解到了从AlexNet到VGG再到RESNET等最先进的模型。这些模型的共同点是它们都在庞大的ImageNet数据集(1400万张图像,1000个类别)上进行训练,使它们能够理解任何图像的各个方面。利用这些模型的这一特性,将图像的内容和风格部分分开,并提供一个损失函数来优化所需的结果。
将使用预训练的卷积神经网络来构建模型。为了简化这个过程,采用了迁移学习的概念,像keras这样的库为提供了这些模型,并让在它们的基础上进行实验。以下是使用keras加载模型的代码示例:
import keras
from keras.applications import vgg19
model = vgg19.VGG19(include_top=False)
layer_outputs = [layer.output for layer in model.layers]
model = keras.Model(inputs=model.input, outputs=layer_outputs)
在上面的代码中,首先导入了keras库,然后加载了VGG19模型,并通过设置include_top=False来排除最后的softmax层。接着,创建了一个字典,将层名作为键,层输出作为值。最后,定义了模型,输入为VGG的输入规范,输出为为每一层创建的字典。
为了获得所需的图像,需要定义一个损失函数,该函数将优化损失以达到所需的结果。这里将使用像素级损失的概念。像素级损失是一种用于理解图像之间差异的度量,它比较输出像素值与输入值。(另一种方法是全局损失函数,将在博客的后期阶段简要讨论。)有时像素级损失在表示每个有意义的特征方面有自己的缺点,这就是全局损失函数发挥作用的地方。将关注的损失项包括:
内容损失确保想要在生成的图像中捕获的内容被有效捕获。已经观察到CNN在网络的较高层次捕获有关内容的信息,而较低层次更关注单个像素值。在这里,基础是内容特征,而组合是生成的输出图像特征。在这里,reduce_sum计算指定参数的维度上的元素总和,这种情况下是输入(内容)和生成图像之间的对应像素之间的差异。
定义风格损失函数比内容损失更复杂,因为涉及多个层次的计算。风格信息被测量为每层特征图之间的相关性。在这里使用Gram矩阵来计算风格损失。那么什么是Gram矩阵呢?
Gram矩阵是捕获给定层中一组特征图上特征分布的度量。因此,当基本上在计算或最小化风格损失时,正在使两种风格和生成图像中特征的分布水平相同。
因此,想法是制作风格和生成图像的Gram矩阵,然后计算两者之间的差异。Gram矩阵(Gij)是层中第i个和第j个特征图的乘积,然后跨高度和宽度求和,如上所示。
有许多其他更快的NST提议,希望能探索并提出更快的机制。一个要遵循的概念是使用图像变换器神经网络的全局损失概念,这增加了NST的速度,并且它允许根据内容训练图像变换器神经网络,并应用各种风格而无需重新训练。
这在部署环境中更有帮助,因为传统模型为每对内容和风格进行训练,而这个概念允许一次性内容训练,然后在同一内容上进行多次风格转换。
训练风格迁移模型涉及使用两个关键网络:一个预训练的特征提取器和一个转移网络。预训练的特征提取器在避免需要成对训练数据方面发挥着关键作用,因为它利用了深度卷积神经网络在图像分类中学到的专门特征。
预训练特征提取器的作用是允许比较两幅图像的内容和风格。然而,其主要功能不是创建风格化的图像;这个责任落在一个单独的神经网络身上,称为转移网络。
转移网络旨在进行图像翻译,通常遵循编码器-解码器架构。它接收一个输入图像并生成一个风格化的输出。
训练过程从通过预训练的特征提取器运行一个或多个风格图像开始。这导致在各种风格层保存输出以供将来比较。然后处理内容图像,经历相同的特征提取过程。随后,内容图像通过转移网络传递以产生风格化的图像,特征提取器再次被用来在内容和风格层保存输出。
风格化图像的质量由一个自定义的损失函数决定,该函数结合了内容和风格的考虑。风格化图像的内容特征与原始内容图像进行比较,而风格特征与参考风格图像中提取的特征进行比较。