本文是 WWDC 2017 Session 703 和 710 的读后感,其视频及配套 PDF 文稿链接如下:Introducing Core ML, CoreML in Depth
本文的内容主要涵盖 Machine Learning 基本介绍,Core ML 框架的说明和使用详解,Core ML 的支持工具 Core ML Tools,以及相应的 App 使用场景。
Machine Learning 基本介绍
机器学习是一门人工智能的科学。它通过对经验、数据进行分析,来改进现有的计算机算法,优化现有的程序性能。其基本流程如下图:
如图,机器学习有三个要素:
- 数据(Data)
- 学习算法(Learning Algorithm)
- 模型(Model)
以图片分析 App 为例,这个场景下的数据、学习算法和模型分别对应:
数据:各种花的图片。这些数据称为此次机器学习的样本(Sample)。每张图片中包含的信息,比如形状、色彩,称之为特征(Feature)。每张图片对应的花朵,比如梅花、玫瑰,称之为标签(Label)。这些图片中蕴含着某些规律,而我们人类正是依靠这些规律判断出图片对应的花朵(标签)。现在我们希望机器能够把这个规律挖掘出来。这样在面对新的样本时,机器能根据其特征,准确判断其对应标签,也就是判断图片对应的花朵。
学习算法:机器学习的算法有很多,比如神经网络、逻辑回归、随机森林等等。作为 iOS 工程师我们无需深刻理解这些算法,只要知道输入数据后执行“学习算法”就可以得到模型。
模型:即机器从样本数据中挖掘出来的规律。有了模型之后,面对新的数据,模型就可以做出相应判断,例如下图图片是郁金香还是玫瑰。
Core ML 到底是什么
Core ML 是苹果为其开发者准备的机器学习框架。支持 iOS, MacOS,tvOS,和 watchOS。它由4部分组成,其结构如下图:
最底层性能框架层:由 Acccelerate 和 Metal Performance Shaders 两个框架组成。前者用于图形学和数学上的大规模计算,后者用于优化与加速 GPU 和图形渲染。
Core ML:支持导入机器学习的模型,并生成对应高级代码(Swift, Objective-C)的框架。
专用机器学习框架:基于 Core ML,针对特殊场景进行封装和优化的框架。如上图所示,Vision 框架和 NLP 框架都是 iOS 11 最新添加:前者用于图片分析,例如人脸识别;后者用于自然语义分析,例如上下文理解。 iOS 中的 GamePlayKit 框架也属于 Core ML 对应的专用框架,用于决策树(Decision Tree)模型的学习。
应用层:使用了这些框架之后构建起来的 App。应用场景(如下图)十分广泛:人脸识别,手写文字理解,类型转化,文字情感分析,自动翻译,等等。
Core ML 使用说明
主要操作过程分三步:
- 得到 Core ML 的模型
- 将模型导入项目中
- 用生成的 Swift 接口进行编程
下面我们来分别对这三个步骤进行详解:
得到 Core ML 的模型
在苹果官网上你可以直接拿到训练好的模型。目前有4个:
你也可以自己训练模型,或到第三方社区去下载别人训练好的模型。苹果提供了转换器(基于 Python,开源)用于把其它机器学习框架训练出来的模型转化为 Core ML 适配的模型。如下图所示:
如何使用 Core ML Tools 进行转化的原理和演示详见《Core ML in Depth》文章。
将模型导入项目中
直接拖拽即可。记得右侧 Target Membership 选项勾选自己的 App。你可以点击 mlmodel 文件观看它的属性。大小(Size)是 App 性能的一个重要指标,输入(Input)输出(Output)决定了如何使用这个模型。下图中输入是花朵图片,为 image 类型。输出有两个值,一个是最有可能的花朵,为 String 类型;另一个是所有可能的花朵类型即其对应的可能性,为 String 对应 Dobule 的 Dictionary 类型。
用生成的 Swift 接口进行编程
生成的接口如下:
// 输入
class FlowerClassifierInput {
// 花朵图片
var flowerImage: CVPixelBuffer
}
// 输出
class FlowerClassifierOutput {
// 最有可能的花朵类型
let flowerType: String
// 所有可能的花朵类型即其对应的可能性
let flowerTypeProbs: [String: Dobule]
}
// 模型
class FlowerClassifier {
convenience init()
// 通过输入产生输出
func prediction(flowerImage: CVPixelBuffer) throws -> FlowerClassifierOutput
}
在实际代码中调用接口进行应用:
// 调用 model
let flowerModel = FlowerClassifier()
// 利用 flower model 对输入进行分析
if let prediction = try? flowerModel.prediction(flowerImage: image) {
// 得到分析的结构
return prediction.flowerType
}
Core ML 的支持和工具
现在 iOS 上可以运行的Core ML 的模型可以从苹果官网上下载,也可以通过第三方社区下载,Caffee,Keras,LIBSVM,scikit-learn,xgboot等开源机器学习框架训练出的模型皆可无缝转换为 Core ML 对应的模型。
同时,苹果开源并展示了如何使用它们自己的 Core ML 模型转换工具,它是用 Python 写成。你可以定制转换器和转换模型的参数。下面我们就来看看使用 Core ML 模型转换工具的步骤。
- 安装 Core ML 工具
直接在终端中输入以下命令:
pip install -U coremltools
如果 Mac 上没有安装 Python,请先用命令行安装:
brew install python
- 转换训练好的模型
假如你的模型是用 caffe 训练的,即现在有一个 .caffemodel 文件,以下步骤可以将其转化为苹果支持的 .mlmodel:
// 导入 core ml 工具库
import coremltools
// 利用 core ml 中对应的 caffee 转化器处理 .caffemodel 模型
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel')
// 将转化好的模型存储为 .mlmodel 文件
coreml_model.save('XXX.mlmodel')
确定转化好的模型能否工作(比如检测现有模型能否识别一张玫瑰图片),可以直接运行:
myTestData = Image.open('rose.jpg')
XXX.mlmodel.predict('data': myTestData)
如果能正确输出结果(预测结果应含有 rose,其预测可能性较高),那么证明模型转换没有问题。
- 定制化转化的模型
定制转化模型的参数,我们一般用 label.txt 文件来定义,直接传入转化中即可。
// 自定义模型的接口参数
labels = 'labels.txt'
// 将 labels 设为转换的模型参数
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel', class_labels='labels')
定制转化的输入数据 data 为 image 类型:
coreml_model = coremltools.converters.caffe.convert('XXX.caffemodel', class_labels='labels', image_input_name = 'data')
指定转换模型的描述型参数(metadata):
// 指定作者信息
coreml_model.author = 'Apple Papa'
// 指定许可证
coreml_model.license = 'MIT'
// 指定输入('data')描述
coreml_model.input_description['data'] = 'An image of flower'
其他参数也类似设置。
目前苹果因为版权问题,对于 Google 的 TensorFlow 和 Amazon 的 MXNet 两大框架支持不够,但是这两个框架训练出来的模型转换成 iOS 上对应的 Core ML 模型难度并不大,除了用苹果自己的转换工具外,网上也有很多开源工具可以做到。
App 使用场景
文字情感分析
所谓文字情感分析,就是根据输入文字内容,机器自动判定文字表达的是正面还是负面情绪。苹果示例的 App 如下:
当什么文字都没有的时候,App 反应的是正常情感;当文字内容为开心或赞美时,App 会变为笑脸;当文字内容为伤心或抱怨时,App 会变为苦瓜脸。整个过程为即时反映,几乎无延迟。
整个 App 的原理可以分为下四步
- 用自然语义处理API统计输入文字的单词频率
- 将单词频率输入到 Core ML 的模型中
- Core ML 模型根据单词频率判断内容为正面或负面情绪
- 根据情绪内容更新 UI
实时物体识别
文字情感分析 App 使用的是自然语义处理(NLP)的框架,而实时物体识别使用的是视觉(Vision)框架,他们两是基于 Core ML 的最核心的两大系统框架。
所谓实时物体识别,是指 iPhone 可以自动识别出摄像头所对准的物品,如下图所示。
当镜头对准餐桌时,机器自动识别出餐桌,并给出相似概率。类似 Google IO 大会上展示的 Google Lens。其原理是将所捕捉到的物体传给 Core ML 的模型,让模型实时推测出物品并更新 UI。具体的原理和代码参见《初探 iOS 上的人工智能:Core ML》,这里不再赘述。
总结
借助 Core ML,苹果将复杂的学习算法和模型训练从机器学习中剥离出来,开发者无需理解其背后深奥的逻辑和计算,只需直接调用模型、在本地实时安全的运用即可。同时为了兼顾扩展性,苹果对其他第三方机器学习框架和模型提供了 Core ML 转换接口和工具。由于现在的 Core ML 支持模型太少,且转换流程自定义空间不大,所以使用场景和应用也比较简单局限。相信在未来苹果会加快完善 Core ML,使得其能够在 App 开发中大展拳脚。