点击上方“蓝字”,发现更多精彩。

当我们拍一张风景图的时候,想要把这张风景图转成各种风格的图像,如果使用PS去做,可能需要经过一道道复杂的工序,但这里有了深度学习算法之后,就能够轻轻松松达到这种效果,只需要运行程序就好了。这里用到的就是风格迁移网络了。

风格迁移是什么

风格迁移就是将一张图片的内容保留,同时将图像风格转移成另一张图片的风格,比如梵高风格。下面就是一些典型的例子,可以将原本的照片转换成梵高的画作风格,但是依旧保留着原本图片的主体内容。

风格迁移历程

风格迁移最开始是从ANeuralAlgorithmofArtisticStyle这篇文章中提出的,但是只能实现固定风格固定内容的风格迁移,也就是说每次想要处理一张新的图片都需要重新训练一次网络。后续PerceptualLossesforReal-TimeStyleTransferandSuper-Resolution又提出了固定风格随意内容的风格迁移,也就意味着处理不同的图片不需要重新训练网络,针对某一种风格训练好网络就可以处理各种各样的图片。但是需要生成其他风格的图片,还得再训练新的网络。MetaNetworksforNeuralStyleTransfer提出了一种随意风格随意内容的风格迁移网络,训练完成,只需要输入网络随意风格图片和内容图片即可完成处理。

1固定风格固定内容的普通风格迁移

图像经过卷积层后得到的特征图的协方差矩阵可以很好地表征图像的纹理特征,但是会损失位置信息。不过在风格迁移的任务中,我们可以忽略位置信息损失这个缺点,只需要找到一个方法可以表征图像的纹理信息,并把它这些纹理信息迁移到需要被风格迁移的图像中,完成风格迁移的任务;而现在,利用协方差矩阵可以得到纹理信息,我们就可以完成风格迁移。

协方差是一个二阶的统计信息,文章里使用Grammatrix来代替协方差矩阵(其实就是没有减去均值的协方差矩阵),它能够描述全局特征的自相关。Gram矩阵的运算公式如下:

假设图片经过某层卷积层后得到了[height,width,channel]的特征图,为了进行Grammatrix的操作,需要将特征图进行flatten,得到F=[height*width,channel]的特征图,那么这里的G=F.transpose*F,得到size为[channel,channel]的G矩阵,表达特征图里面的自相关。可以理解为这个G矩阵就是图像的风格信息。Gram矩阵代码如下所示:

这样要得到一张处理好的风格迁移图片,就有一个比较直观的想法,给定风格图片p,内容图片a,得到一张有p的风格,有a的内容的图片f,只需要让f和a在内容上近似,f和p在风格上近似,也就意味着要满足如下的损失函数:

Loss的组成就是两个部分:内容损失和风格损失。

内容损失:

风格损失:

实现这一功能的网络架构如图所示:

其实这个网络本身并没有实质的参数,初始化的内容图片就是网络迭代优化时需要更新的参数。将初始化的图片输入VGG网络,内容图片和风格图片同步输入网络,选取特定层的结果计算上面的内容损失和风格损失,经过迭代后,即可得到比较完美的风格迁移图片。

2固定风格任意内容的快速风格迁移

要达到固定风格任意内容的快速风格迁移这一效果就是在原本网络结构的基础上加入了一个图片生成网络——TransformNet。将内容图片x输入网络得到生成图片y,然后生成图片y,风格图片ys,以及内容图片x均输入VGG网络,取特定层的输出分别计算风格损失和内容损失,然后反向传播更新transformnet的权重,网络训练完成后,只需要将任意图片输入transformnet就可以得到相应的训练时的风格图片。

TransformNet架构如下:

话不说多,上代码

3任意风格任意内容的极速风格迁移

网络架构如下所示

在固定风格任意内容的基础上更进一步,核心思想就是加入了MetaNet——即原本TransformNet的参数(图中虚线框中部分网络的参数)是用MetaNet生成的。MetaNet的输入流是红线区域,也就是说风格图片决定了TransformNet的参数。当网络训练完成后,同时输入需要转换的内容图片和风格图片,风格图片会经过MetaNet生成TransformNet的权重,在使用相应的权重的TransformNet生成迁移风格的图片。

MetaNet架构如下

代码

为了避免参数过多,MetaNet将图像特征处理成维后分14路去生成对应transformNet的权重。

效果展示

实际处理的效果则如下所示了,很轻松生成了一张梵高风格的图片。

获取方式

在聊天框输入即可获得相应的代码自己体验。直接一键运行即可!

扫码


转载请注明地址:http://www.tongcaoa.com/tckl/8282.html