WWDC 2017:深入浅出 Core ML

本文是 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 使用说明

主要操作过程分三步:

  1. 得到 Core ML 的模型
  2. 将模型导入项目中
  3. 用生成的 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 的原理可以分为下四步

  1. 用自然语义处理API统计输入文字的单词频率
  2. 将单词频率输入到 Core ML 的模型中
  3. Core ML 模型根据单词频率判断内容为正面或负面情绪
  4. 根据情绪内容更新 UI

实时物体识别

文字情感分析 App 使用的是自然语义处理(NLP)的框架,而实时物体识别使用的是视觉(Vision)框架,他们两是基于 Core ML 的最核心的两大系统框架。

所谓实时物体识别,是指 iPhone 可以自动识别出摄像头所对准的物品,如下图所示。

image

当镜头对准餐桌时,机器自动识别出餐桌,并给出相似概率。类似 Google IO 大会上展示的 Google Lens。其原理是将所捕捉到的物体传给 Core ML 的模型,让模型实时推测出物品并更新 UI。具体的原理和代码参见《初探 iOS 上的人工智能:Core ML》,这里不再赘述。

总结

借助 Core ML,苹果将复杂的学习算法和模型训练从机器学习中剥离出来,开发者无需理解其背后深奥的逻辑和计算,只需直接调用模型、在本地实时安全的运用即可。同时为了兼顾扩展性,苹果对其他第三方机器学习框架和模型提供了 Core ML 转换接口和工具。由于现在的 Core ML 支持模型太少,且转换流程自定义空间不大,所以使用场景和应用也比较简单局限。相信在未来苹果会加快完善 Core ML,使得其能够在 App 开发中大展拳脚。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容