深入浅出 Core ML

Machine Learning 基本介绍

 

机器学习是一门人工智能的科学。它通过对经验、数据进行分析,来改进现有的计算机算法,优化现有的程序性能。其基本流程如下图:

 

 

如图,机器学习有三个要素:

 

数据(Data)

 

学习算法(Learning Algorith)

 

模型(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
}
在实际代码中调用接口进行应用:
// 调用 modellet 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 开发中大展拳脚。

 

作者:故胤道长

 

链接:https://www.jianshu.com/p/bf766c5a266d

发表评论

电子邮件地址不会被公开。 必填项已用*标注