如何基于苹果推出的 CoreML 3.0 从零开发一个图像分类应用?

阅读数:1232 2019 年 11 月 29 日 16:38

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

苹果新推出的 Core ML 3 是让开发者和程序员切入 AI 生态系统的一条理想的快车道,你可以使用 Core ML 3 为 iPhone 构建机器学习和深度学习模型,本文将详细介绍如何基于 Core ML 3 为 iPhone 创建一个图像分类应用程序。

简介

想象一下,不用深度了解机器学习,就可以使用最先进的机器学习模型打造惊艳的应用程序。欢迎来到苹果的 Core ML 3 的世界!

你是一名狂热的苹果迷吗?你使用 iPhone 吗?你是否想过苹果是如何使用机器学习和深度学习来打造其应用程序和软件的?

如果你对以上任何一个问题的回答是肯定的话——你将会进入到一场盛宴之中!因为在本文中,我们将使用深度学习和苹果的 Core ML 3 为 iPhone 打造一款应用程序。我们先来大致看下这个应用的样子:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

软件开发者、程序员,甚至是数据科学家都喜爱苹果的 AI 生态系统。他们近年来创造了一些超级棒的开发程序,包括 Core ML 和我个人最爱的 Swift 编程语言

Core ML 3 框架支持了 iPhone 的一些很酷的功能,如 FaceID、Animoji 和增强现实。自从 2017 年苹果首次推出 Core ML 以来已经过了很长时间了,现在它支持大量的工具,这些工具能帮助我们快速开发出非常棒的基于机器学习的应用程序。

本文中,我们将探索助力苹果应用程序的整个 AI 生态系统,并学习使用 Core ML 3 丰富的生态系统,包括前沿的深度学习预训练模型。

注意:本文需要读者具备一些 Core ML 的基础知识,才能够理解其中介绍的概念。我建议读者先阅读这篇文章来加速对本文的理解。

目录

  • 苹果的 AI 生态系统
  • 进入 Core ML 3 的世界
  • Core ML 3 有哪些更新
  • 使用 ResNet50 模型为 iPhone 构建一个图像分类应用
  • 我们对 Core ML 的看法

苹果的 AI 生态系统

苹果在利用机器学习来构建工具和框架方面做得相当出色。构建 AI 应用程序有大量的工具和框架可选,每一种都有其优缺点。下面我们将在较高层面上浏览一下苹果的 AI 生态系统:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

让我们对每种工具或者框架都来了解一下:

1)Turi Create

如果你想给你的应用程序增加推荐、物体检测、图像分类、图像相似度检测或者行为分类的功能,那这就是你想要的框架。

你不用成为机器学习专家之后再使用这个工具。为什么?因为它已经为每项任务都提供了模型。

我喜欢 Turi Create 是因为我们可以通过 Python 使用它,就像我们通常使用的工作流那样。当我们得到了满意的网络模型后,就可以把它导入到 Core ML,供其在 iOS、macOS、watchOS 和 tvOS 应用程序中使用啦!

以下是 Turi Create 中已经支持的一些任务,可以马上在您的应用程序中使用的:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

2)Create ML

Create ML 能够让我们不用写太多代码就可以构建机器学习模型。

我喜爱这个工具的地方是,你能够把训练数据用拖拽的方式放置到它的界面上,然后选择你想要训练的模型(如语音识别、物体检测等等),它就会自动开始训练模型啦!

以下是训练狗和猫分类模型的一个例子:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

注意我只写了两行代码,然后把存放训练数据的文件夹拖拽到了界面上——其他的就可以交由 CreateML 来做啦!

因为 Turi Create 使用的是 Python 语言,所以我们可以使用 CreateML 在 Mac 上构建模型。喔,是的,它还支持在 GPU 上训练(耶!)。

3)Swift for Tensorflow

Swift for Tensorflow 拥有灵活而高性能的,类似 Tensorflow/PyTorch 风格的 API,可以用来构建复杂的神经网络架构。

这个框架最美妙的事情莫过于其代码和 Python 代码一样具有良好的可读性。以下是分别用 Swift 和 Python 写的同一个模型的代码(注意它俩的相似性):

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

如果你需要模型的高性能,想要高效部署模型时,就可以使用 Swift for Tensorflow。你可以通过这个链接了解怎样使用 Swift for Tensorflow 来构建深度学习模型。

4)语言和视觉框架(Language and Vision Frameworks)

这些是苹果自己的框架,对应于 Python 的 spaCy 和 OpenCV 框架,但苹果自己添加了一些额外功能。这些框架可以让我们创建端到端的流程,用于图像处理和文字处理等。

如果你想执行图像分析任务,比如人脸或者地标检测、文字检测、条形码识别、图像注册和通用特征追踪功能,那么 Vision 就正好适合你

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

类似的,如果你想执行诸如语言和脚本识别、打上标记、词形还原、词性标记和命名实体识别等功能,那么Language就正好适用于这些场景。

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

除了这两个以外,苹果还支持用于语音数据的框架(它们可以和 CoreML 很好地结合)。我在后续文章中会介绍到这些工具。现在,先让我们看看令人叹为观止的 Core ML 3!

进入 Core ML 3 的世界

我喜爱苹果的 Core ML 3 框架,因为它不仅支持上文提到的这些工具,而且它自己还具有一些额外的功能。

首先,CoreML3 允许我们导入通过所有主流 Python 框架训练好的机器学习或者深度学习模型。

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

我们之前的文章(上面的那个链接)已经介绍了 Core ML 3 的这个功能。这里,我们会介绍 Core ML 3 的另一个有趣的功能——我们怎样利用 CoreML3 现在支持的大量前沿的预训练模型。

下面是 Core ML 3 支持的模型列表。注意其中一些模型(例如 Squeezenet、DeeplabV3 和 YOLOv3)是非常新的,它们几个月前才被提出来:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

所有这些模型实际上都经过了优化,以在手机、平板和计算机上提供最优性能。这就是苹果公司最伟大的地方。

这就意味着,即使这些模型中很多都是复杂的深度学习模型,我们也不用担心其在我们的应用程序中部署和使用时的性能——这是多么炫酷?

Core ML 3——有什么更新?

你观看了今年的 WWDC 大会吗?会议上有一些关于 Core ML 3 的有趣声明,以及苹果设备将为这个框架提供的支持。如果你错过了这场大会,以下是其快速摘要:

1)设备端上的训练

这是目前为止 Core ML 3 最棒的地方。之前,我们只有“设备端上推理”功能的支持,这基本上意味着我们可以在其他某台机器上训练模型,然后再在设备上使用这个训练好的模型进行实时预测,这提供了更好的用户体验,因为我们不需要借助因特网就可以做出预测了。

Core ML 3 现在也支持设备端上的训练了!你可以使用 iPhone 的 CPU、GPU 和神经引擎来训练你的机器学习和深度学习模型。

你可以把 Core ML 3 当做是迁移学习或者在线学习,这个过程中,你只需要微调一个已有的模型即可。

以 Face ID 应用为例。它需要让模型保持最新,因为用户的脸可能随着时间流逝而发生变化(脸上长出了胡须、化了不同的妆、脸变老了等等)。基本的想法是在一开始生成一个基础模型,这个模型对每一个人都具有相同的平均性能,然后会将其复制一份,这份拷贝就会针对每个用户进行定制化。

随着时间推移,每个用户独有的这个模型会变得更加出色,更加契合该用户:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

这个方法具有几个好处:

  1. 训练只会在用户的个人设备上进行,这意味着能很好地保护用户的数据隐私
  2. 我们不需要为数百万用户搭建大量的服务器来做模型训练
  3. 由于不需要因特网,这个模型随时都可以用来做预测!

2)Core ML 3 中增加了新的神经网络层类型

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

除了为不同模型类别提供的网络层,Core ML 3 还为一些中间操作提供了 100+ 的网络层,比如 Masking、Tensor Manipulation、Boolean logic、Control Flow 等等。

其中一些层类型是在经典的神经网络架构中使用的,而 Core ML 3 已经提供给我们了。

这就意味着我们能够马上为我们的应用程序构建这样的模型了。

如果你对整个组件感兴趣,请观看 WWDC 完整视频。出于本文构建应用程序的目的,我们介绍了 Core ML 3 的核心基础知识。现在是时候构建一个 iPhone 的应用程序啦!

构建一个 iPhone 图像分类应用程序

在我们开始构建应用程序前,需要先安装一些东西:

系统搭建:

  1. macOS:我使用的是 macOS Catalina(10.15.1)
  2. Xcode:这是在苹果设备上构建应用程序的默认软件。你可以从苹果商店里把它下载到你的 Mac 上。我使用的是 11.2 的版本。
  3. 项目代码:你可以在命令行下敲入以下命令,从 GitHub 上拉取该项目的代码:
复制代码
git clone https://github.com/mohdsanadzakirizvi/CoreML3-Resnet50.git

注意:

  1. 对于本文介绍的应用程序,你需要一台 macOS 机器,不然就实现不了这个项目
  2. 为苹果设备编写的任何应用程序都是使用的 Swift 语言( https://developer.apple.com/swift/
  3. 该教程不需要你学习 Swift。但是如果你对该语言感兴趣,可以点这个链接学习。

构建我们的深度学习模型

一旦你下载了该项目,你会看到两个文件夹:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

该项目的 Complete Version 是应用程序的全功能版本,你可以通过导入 ResNet50 模型来运行它。而练习版本则缺少一些代码,你可以使用这个版本代码来学习本文。

运行如下命令以在 Xcode 中打开该项目:

复制代码
open ImageClassifier.xcodeproj

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

我在 Xcode 窗口中圈出了三处主要区域:

  1. 在左上角显示的 play 按钮是用来在模拟器中启动你的应用程序
  2. 看一下 play 按钮下方,你会看到该项目的文件和文件夹。这个小面板称为项目导航器。它帮助我们在项目的不同文件和文件夹之间跳转。
  3. 在 play 按钮旁边写着“iPhone 11 Pro Max”。这个区域表示你想在模拟器上测试的目标设备型号。

让我们先运行下这个应用程序看看会发生什么。点击左上角的 play 按钮,这会启动模拟器。

你看到了什么?

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

到目前为止,我们的应用程序没有做什么事情。它只是显示一张图片,和一个按钮用于选择其他图片——让我们做得更酷炫一些吧!

如果你打开练习版本,你会发现以下的文件夹结构:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

在项目导航器面板,选择ViewController.swift文件。这个文件包含了大部分控制我们应用程序功能的代码。你会看到以下代码:

复制代码
import CoreML
import Vision
import UIKit
class ViewController: UIViewController {
// MARK: - IBOutlets
@IBOutlet weak var scene: UIImageView!
@IBOutlet weak var answerLabel: UILabel!
// MARK: - View Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
guard let image = UIImage(named: "scenery") else {
fatalError("no starting image")
}
scene.image = image
}
}
// MARK: - IBActions
extension ViewController {
@IBAction func pickImage(_ sender: Any) {
let pickerController = UIImagePickerController()
pickerController.delegate = self
pickerController.sourceType = .savedPhotosAlbum
present(pickerController, animated: true)
}
}
// MARK: - UIImagePickerControllerDelegate
extension ViewController: UIImagePickerControllerDelegate {
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
dismiss(animated: true)
guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else {
fatalError("couldn't load image from Photos")
}
scene.image = image
}
}
// MARK: - UINavigationControllerDelegate
extension ViewController: UINavigationControllerDelegate {
}

现在由于你已经熟悉了 Xcode 和项目代码文件,让我们进入下一阶段。

向应用程序中添加一个预训练模型

到 Core ML 3 官网网页上直接下载预训练模型:

复制代码
https://developer.apple.com/machine-learning/models/

在该网页的 image 部分,你将找到 ResNet50 模型:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

你可以下载需要的模型版本。模型大小越大,模型就会越精确。类似的,模型大小越小,模型运行就会越快。

  • Resnet50.mlmodel文件拖入 Xcode 窗口的在项目导航面板
  • 此时会弹出一个窗口,窗口上带有一些选项。保持默认选项,然后点击“Finish”
  • 当我们把这样一个文件拖入 Xcode 后,它会在项目中自动地创建该文件的引用。通过这个方式,我们在代码中可以很容易地获取这个文件

这里是整个过程,以供参考:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

使用训练模型做出第一次预测

为了做出第一次预测,我们需要载入刚刚下载的 ResNet50 模型。然后,输入一张图片,将其转为模型需要的格式,就可以做出预测了。

在 ViewController.swift 文件中的 IBActions(第 33 行)下方写入以下代码:

复制代码
// MARK: - Methods
extension ViewController {
func imageClassify(image: CIImage) {
answerLabel.text = "detecting..."
// 通过生成模型的类来加载机器学习模型
guard let model = try? VNCoreMLModel(for: Resnet50().model) else {
fatalError("can't load Places ML model")
}
// 创建视觉模型请求,附带完成时的回调句柄
let request = VNCoreMLRequest(model: model) { [weak self] request, error in
let results = request.results as? [VNClassificationObservation]
var outputText = ""
for res in results!{
outputText += "\(Int(res.confidence * 100))% it's \(res.identifier)\n"
}
DispatchQueue.main.async { [weak self] in
self?.answerLabel.text! = outputText
}
}
// 在全局派发队列中运行 CoreML3 Resnet50 分类模型
let handler = VNImageRequestHandler(ciImage: image)
DispatchQueue.global(qos: .userInteractive).async {
do {
try handler.perform([request])
} catch {
print(error)
}
}
}
}

上述代码基本上就是接收一张新图片,对图片做预处理以满足 ResNet50 的格式需求,然后把图片传入网络做预测。

最重要的代码行是以下这些:

复制代码
// 通过生成模型的类来加载机器学习模型
guard let model = try? VNCoreMLModel(for: Resnet50().model) else {
fatalError("can't load Places ML model")
}

正是在这里我们设置了模型名字。如果你想使用诸如 BERT 或者 YOLO 这样的框架,你只需要改变模型名字,应用程序的其他部分就能顺畅运作了。

现在,我们需要调用 **imageClassify()这个函数来对图像做出预测。在viewDidLoad()(第 19 行)** 函数末尾添加如下代码:

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

现在你再运行这个应用程序,你可以看到它已经开始对应用程序启动时显示的图片场景做出预测了。

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

把以上代码拷贝到imagePickerController()(第 87 行)中,然后应用程序就可以对你选择的任何图片做出同样的预测了。

以下就是该应用程序最终的样子:

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?

恭喜你——你刚刚已经为你的 iPhone 构建了第一个 AI 应用程序!

我们对 Core ML 3 的看法

使用最新的 AI 研究(包括图像、语音和文字)来创建令人印象深刻的应用程序,显然,苹果把这个过程变得更简单了。你不用知道太多的模型知识,就可以立马开始学习和探索如何构建应用程序了。你可以进一步探索,尝试用最新模型(例如 BERT)创建更有意思的应用程序。如果可以的话,你可以尝试在本文应用程序中使用 SqueezeNet 和 MobileNet,看看不同模型在同样的图片上的性能表现如何。

本文使用的所有代码都在 Github 上。

原文链接:
https://www.analyticsvidhya.com/blog/2019/11/introduction-apple-core-ml-3-deep-learning-models-iphone/

评论

发布