黄凯怡 姜佳琪 方建文 杨彩云
摘 要:传统的图像风格迁移程序通过人工建模只能局限于单一风格迁移,且资源消耗过大。2015 年jatys 等提出了一种基于卷积神经网络的图像风格迁移算法,通过这一种算法便能生成各种具有原内容和新风格的合成图像。文章利用深度学习算法,对卷积神经网络模型和风格迁移算法进行图像风格特征提取的研究,在MXNET 深度计算引擎上开发图像风格迁移系统(Stvler),将一副图像的风格迁移到另一副图像,其成果可应用到设计、娱乐和社交等领域。
关键词:深度神经网络:图像风格迁移;卷积神经网络:VGG-19 模型
中图法分类号:TP391文献标识码:A
1 引言
艺术源于人类对生活情趣的探索,它的价值在于人类的审美意识。随着时代的进步与发展,现代人的基本物质需求已经得到了满足。所以,大多数人会通过追求艺术享受来丰富自身经历、提升生活品质。即使大部分艺术在生活中都不具备实际的功能性,大多数人却还是会爱上各种各样的艺术,甚至在有些人的心中,艺术有着不可代替的地位。从古至今,艺术绘画大师的作品吸引着千千万万的人。人们渴望自己也能够拥有同样艺术风格的图像,图像风格化这一概念由此诞生。
然而,绘制风格图像需要大批相关技术人员,并损耗大量资源。20 世纪90 年代,科研人员相继提出大量风格化算法来完成图像风格化的任务。传统图像风格化算法多采用人工建立数学和物理模型的方式来模仿图像风格,即一种图像风格对应一个数学或统计模型。这样做出来效果是不错的,但一个程序基本只能做一种风格或者只针对一个场景,程序的适用范围过于局限。本选题基于深度神经网络来解答人类如何创造和感知艺术意象并实现图像风格迁移。这样一来,用一种算法就可以实现从任意图像中提取风格并将其应用于内容完全不同的其他图像中。
2 系统总体结构设计
本系统主要包括图像输入、图像预处理和图像后处理、图像特征提取、损失函数定义、合成图像创建、模型训练6 大模块。本系统的第一步是在图像输入模块中输入内容图像和样式图像,读取任意图像后需要进行图像预处理和后处理,通过标准化处理来增强系统图像兼容性。第二步是利用VGG?19 网络模型的某些层来抽取内容和样式特征。第三步是定义损失函数。内容损失对比保留原始图像,样式损失对比合成样式图像,而总变差损失则优化减少合成图像中的噪点(图像颗粒感)。第四步是创建和初始化合成图像。第五步就是通过迭代来训练模型最终输出合成图像。总体结构设计如图1 所示。
其中,基于VGG?19 卷积神经网络的迁移方法过程如图2 所示。图中输入的内容图像为作者在旧金山渔人码头附近的街道拍摄的照片,输入的样式图像是一幅内容为树木的油画。最终输出的合成图像内容还是街景,但是样式融入了油画笔触,同时整体颜色也更加饱满鲜艳了。
3 系统实现
3.1 图像输入模块设计
导入程序相关的包和模块,例如d2lzh,mxnet 以及time,然后调用函数分别读取任意大小与尺寸的内容图像和样式图像,获取图像的尺寸和大小。
3.2 图像预处理与后处理模块设计
设计preprocess 函数并对输入图像进行预处理,将RGB 3 个通道分别进行标准化,使其变成卷积神经网络所接受的输入格式。设计postprocess 函数后处理输出图像,把图像的像素值还原回标准化之前的格式,以方便正确输出图像。输出图像用打印函数来表示,该函数要求每个像素的浮点数值在0~1 之间,所以clip 函数用来剔除非0~1 的数(小于0 的数取0,大于1 的值分别1)。其中rgb 均值是在imageNet 数据集上学习到的。
rgb_mean = nd.array([0.485, 0.456, 0.406]
rgb_std = nd.array([0.229, 0.224, 0.225])
def preprocess(img, image_shape):
img = image.imresize(img, ?image_shape)
img = (img.astype('float32') / 255 - rgb_mean)/ rgb_std
return img. transpose ((2, 0, 1)). expand _ dims(axis=0)
def postprocess(img):
img = img[0].as_in_context(rgb_std.context)
return (img.transpose((1, 2, 0)) ? rgb_std +rgb_mean).clip(0, 1)
3.3 图像特征抽取模块
本项目使用Gatys 提出的VGG?19 网络来抽取图像特征。经过研究者实验,在远离输入层的地方易抽取图像的全局信息,在靠近输入层的地方则容易抽取图像的局部细节信息。综合以上考虑,本设计将第5个卷积块中的第1 个卷积层作为样式层,将第4 个卷积块的最后一个卷积层作为内容层,这样可以得到作者认为的最佳效果。在抽取特征时,不需要使用整个VGG 网络,只需使用上述的6 个卷积层。所以需要构建一个新的网络net,具体层数可以从pretrained_net实例中查看获取。
3.4 损失函数定义模块
损失函数主要包括内容损失函数、样式损失函数、总变差损失函数。内容损失函数采用平方误差函数来匹配合成图像与内容图像在内容特征。样式损失函数也是通过平方误差函數来优化样式风格,具体是对比图像像素点在每个通道上的统计分布。比如,颜色是通过对比RGB 直方图来匹配2 图之间的颜色差异;纹理则是通过对比先前用卷积神经网络中提取的纹理,然后,再用格拉姆(Gram)矩阵来有效地模拟纹理的各种变化,表示纹理信息。实验中部分内容图像与特征图像的特征结合后,其合成的图像中会有大量高频噪点,本系统采用总变差损失函数来降噪。总变差损失(TV loss)约束噪声的具体方法是通过降低总变差损失来尽可能使邻近的像素值相近[1~4] 。
3.5 合成图像创建模块
在迁移过程中,合成的目标图像是一个需要一直更新的变量,本系统将合成图像视为模型参数,通过定义一个新的GeneratedImage 类来表示。类内还需定义一个前向计算forward(self)函数来返回模型参数。
class GeneratedImage(nn.Block):
def __init__(self, img_shape, ??kwargs):
super(GeneratedImage, self).__init__(??kwargs)
self.weight = self.params.get('weight', shape=img_shape)
def forward(self):
return self.weight.data()
随后还需定义一个get_inits 函数来创建合成图像的模型实例,并将其初始化命名为图像X。
def get_inits(X, ctx, lr, styles_Y):
gen_img = GeneratedImage(X.shape)
gen_ img. initialize ( init. Constant ( X),
ctx = ctx,force_reinit=True)
trainer = gluon. Trainer ( gen _ img. collect _params(), 'adam',{'learning_rate': lr})
styles_Y_gram = [gram(Y) for Y in styles_Y]
return gen_img(), styles_Y_gram, trainer
3.6模型训练模块
首先,定义train 函数,该函数有7 个参数。X 代表初始化圖像也是最后输出的合成图像,contents_Y代表内容图像的内容特征,styles_Y 则是风格图像的风格特征,ctx 是GPU 相关参数,lr 即学习率(learningrate)。max_epochs 为训练迭代的次数,不断抽取合成图像的内容特征和样式特征,并计算损失函数来优化图像。在每一个迭代周期调用一次同步函数waitall,可以解决内存占用过高问题。每经过lr_decay_epoch次迭代,将lr 减少1/10,使得收敛加速。
接着进行模型训练。将内容图像和样式图像的高和宽调整为统一像素,大小可以调节。可以先设置小一些的像素,这样训练速度较快,这里设置为225×150 像素。训练迭代参数的设置是经过试验的,参数过小无法得到清楚结果,参数过大会导致训练时间过长消耗过大且对结果影响并不大。代码如下,其中内容图像content_X 初始化合成图像,初始学习率设为0.01,迭代次数设为500,学习率改变的位置设为每200 次。
将训练好的合成图像保存为neural?style?1.png。一般而言,这样的图像已经可以得到迁移到风格的新图像。为了得到更加清晰的合成图像,可以将上一步的输出放在更大的像素尺寸上进行训练。这里将高和宽放大2 倍,设置为450×300 的尺寸来初始化合成图像。将合成图像保存为neural?style?2.png,初始学习率仍设为0.01,迭代次数改为300,学习率改变的位置设为每100 次[5~10] 。
3.7 训练结果分析
本节图3(a)为原始内容图像,图3(b)为原始风格图像。首先,本节选取3 组图像对比合成图像在不同像素情况下的转换情况。图3(c)为分辨率225×150 像素的合成图像,图3(d)为分辨率450×300 像素的合成图像。原始图像为巴厘岛的某一餐厅外景,模仿到风格图像的纹理后合成图变得有油画的笔触,色块变得比较大,图像有点朦胧感,多了些许诗情画意。
图4 为控制风格权重变量的结果图像对比。图4(c)、图4(d)是分辨率为225×150 像素的合成图像,图4(c) 的风格权重为103,图4(d) 的风格权重为104。图4(e)、图4(f)是分辨率为450×300 像素的合成图像,图4(e)的风格权重为103,图4(f)的风格权重为104。从蓝天上可以明显发现在其他变量不变的情况下,风格权重越大模仿的风格特征更明显。
4 结束语
本文主要介绍并回答了如何规定图像风格;如何提取图像纹理特征而不夹杂内容特征;如何提取图像内容特征而不夹杂纹理特征;如何将两种特征融合生成目标图像。同时,分析并验证深度卷积神经网络中不同层对于图像特征表达的特性。通过反向传播算法对VGG19 不同层所抽取的特征进行反向图片生成,以可视化的方式验证深层卷积神经网络中不同层所抽取的特征特性。找到一种基于交替训练的风格迁移算法。该算法主要为解决经典神经风格迁移算法中所存在的内容细节丢失,物体边缘扭曲以及颜色覆盖等问题,提出一种交替训练的方式,以尽可能地保留内容图片中的细节信息。找到一种基于多路径前馈神经网络的实时风格迁移算法。该算法在编码器与解码器之间添加多个由残差块所构成的通道,从而提高网络收敛速度以及生成图片的质量。找到一种基于多层次特征转换的任意风格迁移算法。训练一个通用的解码器,通过特征转换的方式直接对编码器所提取的特征图进行操作,进而丰富所需渲染图片的风格。
参考文献:
[1] 黄海新,梁志旭,张东.基于深度学习的图像风格化算法研究综述[J].电子技术应用,2019,45(7):27?31.
[2] 陈淑環,韦玉科,徐乐,等.基于深度学习的图像风格迁移研究综述[J].计算机应用研究,2019,26(8):2250?2255.
[3] EFROS A A, FREEMAN W T. Image quilting for texturesynthesis and transfer[C]∥Proceedings of the 28th AnnualConference on Computer Graphics and InteractiveTechniques.New York:ACM Press,2001:341?346.
[4] 钱小燕,肖亮,吴慧中.快速风格迁移[J].计算机工程,2006,32(21):15?17+46.
[5] 阿斯顿·张,李沐,扎卡里·C.动手学深度学习[M].北京:人民邮电出版社,2019.
[6] 刘建伟,刘媛,罗雄麟.深度学习研究进展[J].计算机应用研究,2014,31(7):1921?1930+1942.
[7] 孙志军,薛磊,许阳明.深度学习研究综述[J].计算机应用研究,2012,29(8):2806?2810.
[8] 牟晋娟.基于深度学习的图像风格迁移技术的研究[J].电子元器件与信息技术,2019,3(4):82?85.
[9] 栾五洋.基于深度学习的图像风格转换浅论[J].经验交流,2018:248?250.
[10] 焦李成,杨媛淑,刘芳,等.神经网络七十年:回顾与展望[J].计算机学报,2016(8):1697?1716.
作者简介:
黄凯怡(2001—),本科,研究方向:计算机应用技术。
方建文(1972—),博士,教授,研究方向:计算机应用技术(通信作者)。