iOS 图片风格转换(CoreML)

百家 作者:iOS开发 2017-09-30 11:49:45

点击上方“iOS开发”,选择“置顶公众号”

关键时刻,第一时间送达!


1. 前言


图片风格转换最早进入人们的视野,估计就是Prisma这款来自俄罗斯的网红App。他利用神经网络(多层卷积神经网络)将图片转换成为特定风格艺术照片。利用图片风格转换算法,我们可以将一个图片放入以及训练好的神经网络模型进行预测结果得到风格迥异,独具特色的图片。随着iOS11苹果推出了CoreML,我们可以很轻松将训练好的这些风格转换模型转换成为苹果的CoreML Model,并使用这个模型来进行图片风格转换。


图片风格转换 @Prisma


2. 图片风格转换算法介绍


2015年,德国科学家 Gatys等人发表一篇名为《A Neural Algorithm of Artistic Style》的论文,打开了神经网络在图像艺术创作的大门。作者利用VGG16模型对一张原图(Content Image)和一张风格图(Style Image)分别进行图像特征提取。通过利用对两种特征构造损失函数,对一张初始化图片进行损失值计算并反馈重绘图像得到生成图(Generated Image)。但是这个算法每一次生成一张图片都需要进行一次网络训练,需要耗费的时间比较长。斯坦福大学的Johnson[6]等人提出了快速风格转移算法,训练一个网络,对于任意一张图片都可以转换成为网络对应的风格。快速转移算法包含两个网络。一个为图片转换网络(Image Transform Network),一个为损失网络(Loss Network)。在训练阶段利用大量图片用两个网络进行训练得到模型,在输出阶段套用模型将结果进行输出得到生成图。他们得出的网络相对Gatys的模型得到生成图的速度快上三个数量级。我们在iPhone上进行图片风格转换的时候可以使用Johnson的方法快速的生成风格图片,当然使用Gatys的方式也是可以的,但是在生成图片的时候会消耗更多的时候。


快速风格迁移算法


上图即是快速风格迁移算法的整体结构图,该算法包括图片转换网络和损失计算网络。其中图片转换网络是一个多层卷积神经网络,它将一张输入的原始图片转换成为一张生成图片。损失计算网络是一个VGG-16网络,用于计算图片转换网络生成图片对于我们输入的风格图和原图之间的损失大小。通过计算生成图与原图的内容损失以及生成图与风格图的风格损失大小来判断生成图的质量。通过不断计算来减少损失,反向传播到图片转换网络并对其进行优化,最终得到合格的图片风格转换模型。而这个模型就可以被我们不断用来进行图片到具体某一风格的转换。


3. CoreML介绍


CoreML 是 Apple 今年 WWDC 新推出面向开发者的机器学习框架。如果我们有一个MLModel我们可以容易的利用Model进行结果的预测,所有的MLModel都会有以下结构。


MLModel结构


一般一个MLModel文件会包括MLInput,MLModel,MLOutput三部分,我们将数据封装成为Input并交付给MLModel,模型会进行结果预测并输出预测结果Output,我们再将预测的结果转换成为我们需要的数据类型。


4. 代码实现


CoreML对图片的处理都需要将图片转换成为CVPixelBufferRef数据,这里提供一段UIImageCVPixelBufferRef的代码。


CVPixelBufferRef转换代码


将图片转换成为CVPixelBufferRef之后放入模型进行处理生成Output并得到结果,结果也是一个CVPixelBufferRef的数据。

Output


所以这里我们还需要将CVPixelBufferRef转回去UIImage,具体的实现代码如下:


image.png


更多具体的代码见项目。


5. 细节优化


5.1 合成图生成效果转换


有时候我们会觉得合成图片的效果并不如意,如下面的示例图1跟2,我们可以看到2已经跟1差异非常的大了,一定程度上我会觉得风格过度了。这个时候我们可以通过调整合成图的效果来换取整体构图的完整性,比如说图3的风格只有50%。我们可以看到图3成像会更加具体而又有独特风味。此外还可以通过调整对比度,颜色饱和度来调整构图,这里就需要根据图片消耗更多的时间了。


示例图 @Fzliu


5.2 合成图颜色转换


图片风格转换在我看来有一点是独特但是也是致命的,那就是颜色的迁移。我么可以看到在示例图2中,合成图是使用梵高的星空转换出来的图片,整体图片纹理以及颜色进行了变化。这个时候如果我们希望保留原图的颜色而未知合成图的纹理,就可以使用YUV颜色空间进行转换。



YUV是图片的一种数据格式,YUV中的“Y”表示图片的明亮程度;“U”代表色度,也称为饱和度;“V”代表浓度。从YUV的示例图我们可以很清楚的看到他们的具体含义。


YUV示例


在这里我们可以看到其中U以及V可以很好代表图片的颜色,而Y代表了图片的大部分内容。因此我们可以移植原图的U以及V到合成图上,就可以得到示例图2中的颜色转换合成图了。


6. 运行环境


  • Mac OS 10.12.6

  • Xcode 9 beta 6

  • Python 3.1

  • Tensorflow 1.0

  • Keras 2

  • Coremltools 0.4.0


7. Demo


这里我将现有的风格转换模型集合在一起写了一个风格转换Demo,具体可以见截图:



Demo地址:https://github.com/kingandyoga/StyleTransfer-iOS



  • 作者:kingandyoga

  • 链接:http://www.jianshu.com/p/bd1b79b32609

  • 來源:简书

  • iOS开发整理发布,转载请联系作者授权

【点击成为安卓大神】

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接