Core ML和Vision:iOS11中的机器学习教程

机器学习是很火的,许多人只是听说过,但知之甚少。这篇iOS机器学习的教程将会介绍CoreML和Vison,这是iOS11中引入的的两个全新的框架。
具体来说,将学习如何使用Places205-GoogLeNet模型将这些新API用于对图像的场景

开始

下载启动项目。他已经包含了显示图片的用户界面,并且可是让用户从照片库中选择另一张图片。所以你可以专注于实现应用程序的机器学习和视觉方面。
编译并运行项目,你将看到一个城市的图片和一个按钮:

image.png

从相册中选择领一张图片。这个启动项目的Info.plist已经包含了Privacy – Photo Library Usage Description,因此将会提示你允许使用。
在图片和按钮之间还包含一个文本框,它用于显示模型对图片场景的分类。

iOS机器学习

机器学习是一种人工智能,其中计算机“学习”而不被明确编程。机器学习工具不用编码算法,而是通过大量数据中查找模式,使计算器能够开发和优化算法。

深度学习

自20世纪50年代以来,AI研究人员开发了许多机器学习方法。苹果的核心ML框架支持神经网络,树组合,支持向量机,广义线性模型,特征工程和流水线模型。然而,神经网络已经产生了许多最壮观的最近的成功,从2012年谷歌2012年使用YouTube视频来训练其人工智能来识别猫和人。只有五年后,Google正在赞助一个比赛,以确定5000种植物和动物。像Siri和Alexa这样的应用程序也存在于神经网络中。
一个神经网络试图用层次的节点来模拟人类脑部过程,并以不同的方式联系在一起。每个附加层需要大量增加计算能力:Inception v3,一个对象识别模型,有48层和约2000万个参数。但是计算基本上是矩阵乘法,哪些GPU处理非常有效。 GPU的成本下降使得人们能够创建多层深层神经网络,因此是深入学习的术语。

image.png

神经网络需要大量的训练数据,理想地代表了全方位的可能性。 用户生成数据的爆炸也促成了机器学习的复兴。
训练模型意味着向神经网络提供训练数据,并使其计算用于组合输入参数以产生输出的公式。 培训发生在离线状态,通常在具有多个GPU的机器上。
要使用这个模型,你给它新的输入,它计算输出:这被称为推论。 推论仍然需要大量的计算,来计算新输入的输出。 由于像Metal这样的框架,现在可以在手持设备上进行这些计算。
如本教程末尾所示,深入学习远非完美。 建立真正有代表性的培训数据真的很困难,过分训练模型太容易了,所以对古怪的特征给予太多的重视。

苹果提供了什么?

苹果在iOS5中引入了NSLinguisticTagger来分析自然语言。Metal出现在iOS8中,提供对设备GPU的低级访问。
去年,苹果公司将基本神经网络子程序(BNNS)添加到其加速框架中,使开发人员可以构建神经网络来进行推理(而不是训练)。
而今年,苹果给出了CoreML和Vision!

  • Core ML 使您更容易在您的应用程序中使用经过训练的模型
  • Vision 让您轻松访问Apple的模型,以检测脸部,面部地标,文字,矩形,条形码和对象。

您还可以在Vision模型中包装任何图像分析Core ML模型,这在本教程中将会如何。 因为这两个框架是基于Metal构建的,所以它们在设备上高效运行,因此您不需要将用户的数据发送到服务器。

将CoreML模型集成到你的App中

本教程使用Places205-GoogLeNet模型,您可以从Apple的“机器学习页面.”页面下载。 向下滚动到Working with Models,并下载第一个。 当您在那里时,请注意其他三个模型,它们都会在图像中检测物体 - 树木,动物,人物等。

如果您使用受支持的机器学习工具(如Caffe,Keras或scikit-learn)创建的训练模型,将训练模型转换为CoreML可描述如何将其转换为Core ML格式。

添加模型到项目中

下载完GoogLeNetPlaces.mlmodel后,拖到项目的Resources目录中。

image.png

选中这个文件,并稍等一下。当Xcode生成模型类时,将会出现一个箭头:

image.png

点击箭头就可以看到生成的类:

image.png

Xcode已经生成输入输出类,并且主要的类GoogLeNetPlaces有一个model属性和两个prediction方法。
GoogLeNetPlacesInput用一个CVPixelBuffer类型的sceneImage属性。这是什么?不要害怕,不要哭泣,Vision框架将会将我们属性的图像格式装换为正确的输入类型。
Vision框架还将GoogLeNetPlacesOutput属性转换为自己的结果类型,并管理对预测方法的调用,所以在所有生成的代码中,代码将只使用model属性。

在Vision模型中包装Core ML模型

最后,你将需要写些代码!打开ViewController.swift,在import UIKit下面导入两个框架:

import CoreML
import Vision

然后在IBActions扩展末尾添加如下扩展:

// MARK: - Methods
extension ViewController {

  func detectScene(image: CIImage) {
    answerLabel.text = "detecting scene..."
  
    // Load the ML model through its generated class
    guard let model = try? VNCoreMLModel(for: GoogLeNetPlaces().model) else {
      fatalError("can't load Places ML model")
    }
  }
}

代码意思如下:
首先,您显示一条消息,以便用户知道某些事情正在发生。
GoogLeNetPlaces的指定的初始化程序会引发错误,因此在创建时必须使用try。
VNCoreMLModel只是一个用于Vision请求的Core ML模型的容器。
标准Vision工作流程是创建模型,创建一个或多个请求,然后创建并运行请求处理程序。 您刚刚创建了该模型,因此您的下一步是创建一个请求。

detectScene(image:):末尾添加下面代码:

// Create a Vision request with completion handler
let request = VNCoreMLRequest(model: model) { [weak self] request, error in
  guard let results = request.results as? [VNClassificationObservation],
    let topResult = results.first else {
      fatalError("unexpected result type from VNCoreMLRequest")
  }

  // Update UI on main queue
  let article = (self?.vowels.contains(topResult.identifier.first!))! ? "an" : "a"
  DispatchQueue.main.async { [weak self] in
    self?.answerLabel.text = "\(Int(topResult.confidence * 100))% it's \(article) \(topResult.identifier)"
  }
}

VNCoreMLRequest是使用Core ML模型来完成工作的图像分析请求。它的完成处理程序接收requesterror对象。
您检查该request.results是一组VNClassificationObservation对象,这是当Core ML模型是分类器而不是预测器或图像处理器时,Vision框架返回的。而GoogLeNetPlaces是一个分类器,因为它仅预测了一个特征:图像的场景分类。
VNClassificationObservation有两个属性:identifier - 一个String类型 - 和confidence - 介于0和1之间的数字 - 这是分类正确的概率。当使用对象检测模型时,您可能只会看到那些confidence大于某个阈值的对象,例如30%。
然后,取第一个结果将具有最高的置信度值,并将不定冠词设置为“a”或“an”,具体取决于标识符的第一个字母。最后,您将返回主队列更新标签。你很快会看到分类工作发生在主队列中,因为它可能很慢。
现在,到第三步:创建和运行请求处理程序。
detectScene(image:):末尾添加下面代码:

// Run the Core ML GoogLeNetPlaces classifier on global dispatch queue
let handler = VNImageRequestHandler(ciImage: image)
DispatchQueue.global(qos: .userInteractive).async {
  do {
    try handler.perform([request])
  } catch {
    print(error)
  }
}

VNImageRequestHandler是标准的Vision框架请求处理程序; 它不是核心ML模型的具体。 你给它作为一个参数进入detectScene(image :)的图像。 然后通过调用其perform方法运行处理程序,传递一个请求数组。 在这种情况下,您只有一个请求。
perform方法抛出一个错误,所以你把它包装在一个try-catch。

使用模型来分类场景

现在只需要在两个地方调用detectScene(image :)
viewDidLoad()imagePickerController(_:didFinishPickingMediaWithInfo :)的末尾添加以下行:

guard let ciImage = CIImage(image: image) else {
  fatalError("couldn't convert UIImage to CIImage")
}

detectScene(image: ciImage)

编译并运行。很快就可以看到分类:

image.png

嗯,是的,图像中有摩天大楼。 还有火车。
点击按钮,并选择照片库中的第一个图像:一些太阳斑点的叶子的特写镜头:

image.png

引用:

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

推荐阅读更多精彩内容