图像风格化技术(1)

在后App时代,最近出现了两款热门的应用,一个是AR游戏Pokemon Go, 一个是有别于传统滤镜的“修图工具”Prisma。让我们来聊聊Prisma背后的技术


Prisma这款应用支持用户上传个人照片,并生成不同艺术家风格的照片。生成的照片一方面能保持原照片的内容,另一方面又具有艺术风格。


如下图,A是原始用户上传图片,B左下方为艺术家作品,B为生成的既具有原图A内容,又具有B左下方名画风格的图片。



这是怎么做到的?Prisma背后的技术,缘于2015年的一篇文章 A Neural Algorithm of Artistic Style。 我们先从最早的这篇文章开始,看看如何使用神经网络技术实现图像风格化的。


核心思想

如果我们能够(量化)描述图像的内容和风格,那么,图像风格化的生成其实可以转化为寻找一张图片与原图内容相近,同时与艺术作品风格相近的“优化问题”。


优化目标,可以定义为寻找图片x,使得最小化损失函数:



整体损失函数,包括两部分:

  • 第一部分,衡量内容差异

  • 第二部分,衡量风格差异


图片的内容和风格量化可以通过卷积神经网络计算。整个图像生成的过程,其实也就是优化过程,可以通过梯度下降优化。




大体步骤:

  1. 从一张初识图片x开始 (比如:白噪声图片)

  2. 对图片x运行卷积神经网络,计算内容/风格量化表示,以及损失函数(与原图/艺术家作品比较)

  3. 反向传播,计算梯度并更新图片x

  4. 返回第2步,继续,直到满足终止条件



图像内容的量化表示

以用于图像分类的卷积神经网络为例,图片经过卷积神经网络的特征编码,仍然捕捉到图像的核心内容。卷积神经网络的中间某层特征,可以认为编码了原始输入图片的内容信息,自然可以用于图像内容的表示。


基于卷积神经网络的某个中间层特征,可以重构原始图片。同样,衡量两张图片内容是否相似,可以通过对比中间层特征的差异。(具体公式可参见原论文)



图像风格的量化表示

图像风格的表示,可以通过卷积神经网络相同层不同特征之间的相关性获得。为了得到稳定的不同尺度的风格表示,实际操作时会加权综合考虑各层风格表示。(具体公式可参见原论文)



算法示意

综合核心思想和内容/风格表示,算法示意图如下:

  • 上图内容表示基于conv4层

  • 风格表示综合考虑卷积神经网络各层风格表示

  • 图像生成,基于损失函数的梯度下降优化



不同参数的效果如何?

  • 内容/风格比重(alpha/beta)

    可以通过调整参数,平衡内容和风格(左上更多偏向风格,右下保留更多内容)


  • 内容表示

    内容表示使用的卷积神经网络层,距离输入图像层越近,图像细节保留越多。



  • 初始化图像的影响

    初识图像对最终生成图像影响不大(A图从原始图像开始,B图从风格图像开始,C图为4个随机噪音图像开始)




What is Next?

当前方案效果不错,不过存在一个重要问题:速度太慢。(对每张图片的风格化都需要进行大量的迭代优化, 每次迭代都需要卷积神经网络正向/反向计算各一次)


如果基于上述的算法,单张图像的风格化远无法在秒级别内完成。意味着无法推出Prisma类似的服务。


那Prisma是怎么做到秒级别的图像生成的呢? (请听下回分解 :-) )



参考文献

  • A Neural Algorithm of Artistic Style

  • Image Style Transfer Using Convolutional Neural Networks


更多内容

  • 也谈深度残差网络

  • 谈谈分类器的损失函数(2)

  • 谈谈分类器的损失函数(1)

  • 从贝叶斯的角度看正则项

  • 从优化的角度看正则项


欢迎关注公众号: inkfish-talk

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院