CoreML机器学习初级教程
文章目录
【注意】最后更新于 June 24, 2017,文中内容可能已过时,请谨慎使用。
资源
Core ML开发文档 ML模型资源页面 在Working with Models中包含有几个常用的模型模板,例如用于在图片中检测物体——树、动物、人等等。 Integrating a Core ML Model into Your App
官方Core ML文档示例 App MarsHabitatPricePredictor 模型的输入只是数字,因此代码直接使用生成的 MarsHabitatPricer 方法和属性,而不是将模型包装在 Vision 模型中。每次都改一下参数,很容易看出模型只是一个线性回归: 137 * solarPanels + 653.50 * greenHouses + 5854 * acres
配置 :将 Core ML 模型集成到你的 App
本教程使用 Places205-GoogLeNet 模型,可以从苹果的ML页面下载。往下滑找到 Working with Models,下载第一个。还在这个页面,注意一下其它三个模型,它们都用于在图片中检测物体——树、动物、人等等。
注意:如果你有一个训练过的模型,并且是使用受支持的机器学习工具训练的,例如 Caffe、Keras 或 scikit-learn,Converting Trained Models to Core ML 介绍了如何将其转换为 Core ML 格式。
- 添加模型 下载 GoogLeNetPlaces.mlmodel 后,把它从 Finder 拖到项目导航器的 Resources 组里:
- 生成模型类 选择该文件,然后等一会儿。Xcode 生成了模型类后会显示一个箭头:
- 查看模型类
点击箭头,查看生成的类:
三个类:
GoogLeNetPlaces
: 主类,包含一个 model 属性和两个 prediction 方法GoogLeNetPlacesInput
: 输入类,包含一个 CVPixelBuffer 类型的 sceneImage 属性,Vision 框架会负责把我们熟悉的图片格式转换成正确的输入类型。GoogLeNetPlacesOutput
:输出属性,Vision 框架会将GoogLeNetPlacesOutput
属性转换为自己的results
类型.
实现Vision工作流程
标准的 Vision 工作流程是创建模型,创建一或多个请求,然后创建并运行请求处理程序。
并管理对 prediction
方法的调用,所以在所有生成的代码中,我们只会使用 model
属性。
- 创建模型:在
Vision Model
中包装Core ML Model
CoreML模型 是用于 Vision 请求的 Core ML 模型的容器 打开 ViewController.swift,并在 import UIKit 下面 import 两个框架:
|
|
- 创建
VNCoreMLRequest
图像分析请求VNCoreMLRequest
是一个图像分析请求,它使用 Core ML 模型来完成工作。它的 completion handler 接收 request 和 error 对象。 Core ML 模型GoogLeNetPlaces
是一个分类器,因为它仅预测一个特征:图像的场景分类。这时request.results 是VNClassificationObservation
对象数组。
|
|
VNClassificationObservation 有两个属性:identifier - 一个 String,以及 confidence - 介于0和1之间的数字,这个数字是是分类正确的概率。使用对象检测模型时,你可能只会看到那些 confidence 大于某个阈值的对象,例如 30% 的阈值。 然后取第一个结果,它会具有最高的 confidence 值,然后根据 identifier 的首字母把不定冠词设置为“a”或“an”。最后,dispatch 回到主线程来更新 label。你很快会明白分类工作为什么不在主线程,因为它会很慢。
创建并运行VNImageRequestHandler请求处理程序
VNImageRequestHandler
是标准的 Vision 框架请求处理程序;不特定于 Core ML 模型。给它 image 作为 detectScene(image:) 的参数。然后调用它的 perform 方法来运行处理程序,传入请求数组。在这个例子里,我们只有一个请求。
把下面几行添加到 detectScene(image:)
的末尾:
|
|
使用模型来自动识别场景
在两个地方调用 detectScene(image:)
把下面几行添加到 viewDidLoad() 的末端和 imagePickerController(_:didFinishPickingMediaWithInfo:) 的末端:
|
|
现在构建并运行。
- 场景一: 机器识别出了50%的概率是摩天大厦
- 场景二 机器人识别出了75%的概率是水族池
什么是深度学习
自20世纪50年代以来,AI 研究人员开发了许多机器学习方法。苹果的 Core ML 框架支持神经网络、树组合、支持向量机、广义线性模型、特征工程和流水线模型。但是,神经网络最近已经取得了很多极为神奇的成功,开始于 2012 年谷歌使用 YouTube 视频训练 AI 来识别猫和人。仅仅五年后,谷歌正在赞助一场确定 5000 种植物和动物的比赛。像 Siri 和 Alexa 这样的 App 也存在它们自己的神经网络。 神经网络尝试用节点层来模拟人脑流程,并将节点层用不同的方式连接在一起。每增加一层都需要增加大量计算能力:Inception v3,一个对象识别模型,有48层以及大约2000万个参数。但计算基本上都是矩阵乘法,GPU 来处理会非常有效。GPU 成本的下降使我们能够创建多层深度神经网络,此为深度学习。 神经网络,circa 2016 神经网络需要大量的训练数据,这些训练数据理想化地代表了全部可能性。用户生成的数据爆炸性地产生也促成了机器学习的复兴。 训练模型意味着给神经网络提供训练数据,并让它计算公式,此公式组合输入参数以产生输出。训练是离线的,通常在具有多个 GPU 的机器上。 要使用这个模型,就给它新的输入,它就会计算输出:这叫做推论。推论仍然需要大量计算,以从新的输入计算输出。因为有了 Metal 这样的框架,现在可以在手持设备上进行这些计算。 在本教程的结尾你会发现,深度学习远非完美。真的很难建立具有代表性的训练数据,很容易就会过度训练模型,以至于它会过度重视一些古怪的特征。 苹果提供了什么? 苹果在 iOS 5 里引入了 NSLinguisticTagger 来分析自然语言。iOS 8 出了 Metal,提供了对设备 GPU 的底层访问。 去年,苹果在 Accelerate 框架添加了 Basic Neural Network Subroutines (BNNS),使开发者可以构建用于推理(不是训练)的神经网络。 今年,苹果给了我们 Core ML 和 Vision! Core ML 让我们更容易在 App 中使用训练过的模型。 Vision 让我们轻松访问苹果的模型,用于面部检测、面部特征点、文字、矩形、条形码和物体。 你还可以在 Vision 模型中包装任意的图像分析 Core ML 模型,我们在这篇教程中就干这个。由于这两个框架是基于 Metal 构建的,它们能在设备上高效运行,所以不需要把用户的数据发送到服务器。
文章作者 iTBoyer
上次更新 2017-06-24