移动应用AI化成新战场?详解苹果最新Core ML模型构建基于机器学习的智能应用

2,491 阅读9分钟

Google刚刚息鼓,苹果又燃战火!这一战,来自移动应用的AI化之争。

近日,苹果发布专为移动端优化的Core ML后,移动开发者对此的需求到底有多强烈?去年大获成功的AI应用Prisma又能告诉我们什么?苹果的新武器Core ML具体该怎么用?野心勃勃的苹果在移动端机器学习上的布局到底有着怎样的心机?苹果真能撼动Google、Facebook的优势地位吗?未来AI的走向会不会就此改变?此中答案,本文将娓娓道来。

作者 | 胡永波


本届WWDC,Core ML是苹果送给移动开发者的一份大礼。使用它,开发者可以把训练好的机器学习模型导入iOS应用,同时在系统层面加速应用内的人工智能计算。Core ML API支持的具体任务包括图像识别、文本处理、人脸检测与追踪,等等。

苹果这一举措,正应了Gartner去年10月份预测的移动应用AI化趋势:科技行业的主战场很快会变成能够主动学习和适应、可自主做出反馈的智能系统之间的竞争。到2018年,全球最大的200家公司中,绝大部分都会推出智能应用,同时会使用完整的大数据分析工具来重新定义并提升用户的体验。

而Gartner的说法,则又来自业已拥有机器学习能力的那些移动应用的市场表现。归根结底是SnapChat在青少年人群中的流行,是Prisma在去年的异常火爆,是在国内一直被人刷屏的各类美颜照片应用……只要找对场景,有AI加持的移动应用总能脱颖而出。

以Prisma为代表的移动应用AI化

重新回顾一下Prisma的故事,我们总是能找出一些蛛丝马迹。

作为战斗民族的90后,技术发烧友Alexey Moiseenkov在2016年初偶然读到两篇关于图像的机器学习论文:《艺术风格的神经算法(A Neural Algorithm of Artistic Style)》和《利用神经卷积网络进行纹理合成(Texture Synthesis Using Convolutional Neural Networks)》。

艺术风格的神经算法:提取画作的艺术风格

论文的作者Gatys等人基于论文中的研究成果,在2015年做出一个收费网站 DeepArt,自动y以大师的绘画风格来为用户作画,其步骤如下:

  1. 识别用户上传的照片;

  1. 学习照片中的艺术风格信息;

  2. 输出一幅重新绘制出来的作品。

    利用神经卷积网络进行纹理合成:对照片纹理进行重绘和渲染

    这与人类学习作画过程类似:

    1. 看到一幅作品,对绘画有个初步的概念;

    2. 学习作品中的绘画风格与笔法;

    3. 临摹上述风格和笔法,重新绘画。

    提取不同名画的风格,就能渲染出不同效果的照片

    但只出现在网页端的DeepArt服务耗时过长,渲染出一张新照片至少需要20分钟,并且收费不菲。Gatys等人没能看到移动市场的机会,这让年轻的Alexey一下子抓住了灵感,让他坚信移动端的“AI+图像处理”必定大有可为。

    Alexey清楚,在移动端成功的关键,是能够显著降低图像处理过程的耗时,也就是大幅度提升神经网络的运行效率。为此,他对Gatys等人的算法研究了两个月,在不影响移动端图像效果的前提下,尽可能简化神经网络所需要处理的细节。此处的优化,使得Prisma的耗时仅需几秒钟,处理速度相比DeepArt提升了1000倍。

    随后的开发过程,仅用了一个半月。6月11日,Prisma在苹果应用商店上线。两周时间,下载量就超过160万次;三个月后,全球下载量突破7000万;到年底,Prisma一举拿下Google和苹果两大平台的“年度最佳应用”。

    Prisma的迭代升级一直是围绕“提速”来进行的,关键就是不断改进图像处理的算法。

    最初,Prisma的3个神经网络都部署在云端。用户选取照片效果后,手机上的Prisma应用便将照片上传至服务器,云端的卷积神经网络在解读照片后,会根据用户选择的效果重新渲染出一张新照片,并下载到用户的手机上。

    随着Prisma开始海外扩张,海外用户与Prisma位于莫斯科的服务器通讯问题,成为Prisma加载缓慢的主因。为此,Alexey不得不考虑解决办法,也就要设法在手机上完成照片渲染的过程。2016年8月,直接使用iPhone处理器,Prisma成为第一个能够离线运行风格转换神经网络的手机应用。一张1080×1080分辨率的照片,半秒就能转换成全新的风格。

    可以看出,在手机上部署机器学习算法的需求是极强的。

    毕竟,采用AI来编辑或制作照片的不止Prisma一家。2016年3月,SnapChat的动态相机效果Lenses一经发布便大受欢迎,这项技术是SnapChat从它2015年9月收购的那家乌克兰公司Looksery身上买来的。Facebook紧随其后,于8月份开始,先后在Instagram、Messenger、WhatsApp上推出能跟SnapChat竞争的滤镜效果。Facebook的技术则来自它在2016年3月份买下的白俄罗斯公司Masquerad。

    于是,从今年开始,Facebook和Google相继把它们的机器学习框架转向移动端,在手机应用上直接运行AI算法的趋势几乎不可逆转。紧接着,便有了我们今天的主角Core ML横空出世。

    用于移动端的Core ML模型

    与Google TensorFlow、Facebook Caffe2不同,苹果的Core ML它专门为iOS移动端的机器学习进行过优化,最大限度减少内存的占用和功耗。而且,即便是网络连接丢失,它还能保证应用的正常工作与响应。

    Core ML为iOS Vision API提供图像处理支持,为iOS Foundation API提供自然语言处理上的支持,并支持对iOS GameplayKit的学习决策树 (learned decision tree) 进行分析。苹果为开发者准备好的是四个用于图像识别的模型:Places205-GoogLeNet、ResNet50、Inception v3和VGG16,模型格式为Core ML的 .mlmodel 扩展名。

    如何制作Core ML模型

    借助于Core ML,开发者还能把训练好的机器学习模型,导入至自己的应用内直接使用。它所支持的机器学习模型包括神经网络 (Neural Network)、组合树 (Tree Ensemble)、支持向量机 (Support Vector Machine) 与广义线性模型 (Generalized Linear Model)。

    苹果提供的Core ML Tools Python工具包,可以把第三方机器学习工具所创建的已训练模型转换成Core ML模型格式。Core ML所支持机器学习框架包括Keras、Caffe、scikit-learn、XGBoost与LIBSVM。

    以Caffe模型 (.caffemodel) 为例,通过调用转换器,你可以将其传递给 coremltools.converters.caffe.convert 方法:

    import coremltools coreml_model = coremltools.converters.caffe.convert('my_caffe_model.caffemodel')

    然后,将结果保存为Core ML模型格式:

    coreml_model.save('my_model.mlmodel')

    对于Core ML所不支持的格式,比如TensorFlow模型,你只能自己来创建转换工具,将模型的输入、输出和架构表示转换为Core ML格式。这需要仔细参考Core ML Tools所提供的转换工具,它们具体演示了如何通过每一层模型架构、层与层之间的连接关系进行定义,来把各种第三方模型转换成Core ML格式。

    如何在应用中添加并使用Core ML模型?

    以用来预测火星殖民地价格的已训练模型 MarsHabitatPricer.mlmodel 为例:

    首先需要把模型添加到 Xcode 项目中:

    也就是将模型拖进项目导航器 (project navigator)

    对于 MarsHabitatPricer.mlmodel 而言,Xcode 会生成相应的接口,来分别表示模型本身(MarsHabitatPricer)、模型输入 (MarsHabitatPricerInput) 以及模型输出 (MarsHabitatPricerOutput)。

    使用所生成的 MarsHabitatPricer 类的构造器,便可以创建这个模型:

    let model = MarsHabitatPricer()

    获取输入值并传递给模型:

    示例应用使用了 UIPickerView,以便从用户那里获取模型的输入值。

    func selectedRow(for feature: Feature) -> Int {

    return pickerView.selectedRow(inComponent: feature.rawValue)

    }

    let solarPanels = pickerDataSource.value(for: selectedRow(for: .solarPanels), feature: .solarPanels)

    let greenhouses = pickerDataSource.value(for: selectedRow(for: .greenhouses), feature: .greenhouses)

    let size = pickerDataSource.value(for: selectedRow(for: .size), feature: .size)

    使用模型来进行预测:

    guard let marsHabitatPricerOutput = try? model.prediction(solarPanels: solarPanels, greenhouses: greenhouses, size: size) else {

    fatalError("Unexpected runtime error.")

    }

    通过读取 marsHabitatPricerOutput 的 price 属性,就可以获取所预测的价格,然后在应用的 UI 内就可以对该结果进行展示。

    let price = marsHabitatPricerOutput.pricepriceLabel.text = priceFormatter.string(for: price)

    注:此处所生成的 prediction(solarPanels:greenhouses:size:) 方法会返回错误提示,因为示例应用所预期的输入类型为 Double。

    使用Core ML所遇到的常见错误,是传递给方法的输入数据类型与模型预期的输入类型不同匹配:比如用错误格式表示的图片类型。

    构建并运行 Core ML 应用

    Xcode 会将 Core ML 模型编译到资源中,以进行优化并在设备上运行。优化过的模型表征会包含在您的应用程序包内,当应用在设备上运行时,便可用以进行预测。

    苹果表示,iPhone上经过优化的图像识别,速度能比Google Pixel快6倍。

    Core ML可能会有什么样的影响

    WWDC还没开完,Keynote引起大家关注后,大会日程中还要讲的Core ML有5项:

    • Introducing Core ML

    • Vision Framework: Building on Core ML

    • Core ML in depth

    • Core ML and Natural Language Processing Lab

    • Core ML & Natural Language Processing Lab

    重点是偏向应用的视觉框架和自然语言处理,苹果的经验和支持肯定会让很多开发者跃跃欲试:只要找对场景,新的像Prisma这样的现象级AI应用就还会出现。

    而随着iOS应用内机器学习使用门槛的降低,关注AI具体应用的各类工程师也越来越多;随着iOS开发者的涌入,机器学习领域将不再只是算法工程师的天下。

    那么,移动开发的另一头,Google为Android端准备的TensorFlow Lite在今年正式发布时会如何发力,就更值得关注了。

    毕竟,Google不做移动芯片,如何在硬件层面为手机上的AI应用做优化,就成了它绕不过去的问题:是跟高通的Neural Processing Engine合作?还是把自家的TPU小型化?

    至于Caffe2,Facebook将如何在系统层面为AI应用做优化,则是一个非常有趣的问题。

    诚如Gartner所言,当AI变成科技行业的主战场时,这里的事情就有意思多了。

    参考内容:

    https://developer.apple.com/documentation/coreml

    https://developer.apple.com/wwdc/schedule/

    http://www.gartner.com/smarterwithgartner/gartners-top-10-technology-trends-2017/

    https://backchannel.com/an-exclusive-look-at-how-ai-and-machine-learning-work-at-apple-8dbfb131932b#.cg37ae5f0

    https://zhuanlan.zhihu.com/p/26746283

    https://developer.apple.com/videos/play/wwdc2017/703/