苹果新推出的Core ML 3是让开发者和程序员切入AI生态系统的一条理想的快车道,你可以使用Core ML 3为iPhone构建机器学习和深度学习模型,本文将详细介绍如何基于Core ML 3为iPhone创建一个图像分类应用程序。
想象一下,不用深度了解机器学习,就可以使用最先进的机器学习模型打造惊艳的应用程序。欢迎来到苹果的Core ML 3的世界!
你是一名狂热的苹果迷吗?你使用iPhone吗?你是否想过苹果是如何使用机器学习和深度学习来打造其应用程序和软件的?
如果你对以上任何一个问题的回答是肯定的话——你将会进入到一场盛宴之中!因为在本文中,我们将使用深度学习和苹果的Core ML 3为iPhone打造一款应用程序。我们先来大致看下这个应用的样子:
软件开发者、程序员,甚至是数据科学家都喜爱苹果的AI生态系统。他们近年来创造了一些超级棒的开发程序,包括Core ML和我个人最爱的Swift编程语言。
Core ML 3框架支持了iPhone的一些很酷的功能,如FaceID、Animoji和增强现实。自从2017年苹果首次推出Core ML以来已经过了很长时间了,现在它支持大量的工具,这些工具能帮助我们快速开发出非常棒的基于机器学习的应用程序。
本文中,我们将探索助力苹果应用程序的整个AI生态系统,并学习使用Core ML 3丰富的生态系统,包括前沿的深度学习预训练模型。
注意:本文需要读者具备一些Core ML的基础知识,才能够理解其中介绍的概念。我建议读者先阅读这篇文章来加速对本文的理解。
苹果在利用机器学习来构建工具和框架方面做得相当出色。构建AI应用程序有大量的工具和框架可选,每一种都有其优缺点。下面我们将在较高层面上浏览一下苹果的AI生态系统:
让我们对每种工具或者框架都来了解一下:
1)Turi Create
如果你想给你的应用程序增加推荐、物体检测、图像分类、图像相似度检测或者行为分类的功能,那这就是你想要的框架。
你不用成为机器学习专家之后再使用这个工具。为什么?因为它已经为每项任务都提供了模型。
我喜欢Turi Create是因为我们可以通过Python使用它,就像我们通常使用的工作流那样。当我们得到了满意的网络模型后,就可以把它导入到Core ML,供其在iOS、macOS、watchOS和tvOS应用程序中使用啦!
以下是Turi Create中已经支持的一些任务,可以马上在您的应用程序中使用的:
2)Create ML
Create ML能够让我们不用写太多代码就可以构建机器学习模型。
我喜爱这个工具的地方是,你能够把训练数据用拖拽的方式放置到它的界面上,然后选择你想要训练的模型(如语音识别、物体检测等等),它就会自动开始训练模型啦!
以下是训练狗和猫分类模型的一个例子:
注意我只写了两行代码,然后把存放训练数据的文件夹拖拽到了界面上——其他的就可以交由CreateML来做啦!
因为Turi Create使用的是Python语言,所以我们可以使用CreateML在Mac上构建模型。喔,是的,它还支持在GPU上训练(耶!)。
3)Swift for Tensorflow
Swift for Tensorflow拥有灵活而高性能的,类似Tensorflow/PyTorch风格的API,可以用来构建复杂的神经网络架构。
这个框架最美妙的事情莫过于其代码和Python代码一样具有良好的可读性。以下是分别用Swift和Python写的同一个模型的代码(注意它俩的相似性):
如果你需要模型的高性能,想要高效部署模型时,就可以使用Swift for Tensorflow。你可以通过这个链接了解怎样使用Swift for Tensorflow来构建深度学习模型。
4)语言和视觉框架(Language and Vision Frameworks)
这些是苹果自己的框架,对应于Python的spaCy和OpenCV框架,但苹果自己添加了一些额外功能。这些框架可以让我们创建端到端的流程,用于图像处理和文字处理等。
如果你想执行图像分析任务,比如人脸或者地标检测、文字检测、条形码识别、图像注册和通用特征追踪功能,那么Vision就正好适合你。
类似的,如果你想执行诸如语言和脚本识别、打上标记、词形还原、词性标记和命名实体识别等功能,那么Language就正好适用于这些场景。
除了这两个以外,苹果还支持用于语音数据的框架(它们可以和CoreML很好地结合)。我在后续文章中会介绍到这些工具。现在,先让我们看看令人叹为观止的Core ML 3!
进入Core ML 3的世界
我喜爱苹果的Core ML 3框架,因为它不仅支持上文提到的这些工具,而且它自己还具有一些额外的功能。
首先,CoreML3允许我们导入通过所有主流Python框架训练好的机器学习或者深度学习模型。
我们之前的文章(上面的那个链接)已经介绍了Core ML 3的这个功能。这里,我们会介绍Core ML 3的另一个有趣的功能——我们怎样利用CoreML3现在支持的大量前沿的预训练模型。
下面是Core ML 3支持的模型列表。注意其中一些模型(例如Squeezenet、DeeplabV3和YOLOv3)是非常新的,它们几个月前才被提出来:
所有这些模型实际上都经过了优化,以在手机、平板和计算机上提供最优性能。这就是苹果公司最伟大的地方。
这就意味着,即使这些模型中很多都是复杂的深度学习模型,我们也不用担心其在我们的应用程序中部署和使用时的性能——这是多么炫酷?
Core ML 3——有什么更新?
你观看了今年的WWDC大会吗?会议上有一些关于Core ML 3的有趣声明,以及苹果设备将为这个框架提供的支持。如果你错过了这场大会,以下是其快速摘要:
1)设备端上的训练
这是目前为止Core ML 3最棒的地方。之前,我们只有“设备端上推理”功能的支持,这基本上意味着我们可以在其他某台机器上训练模型,然后再在设备上使用这个训练好的模型进行实时预测,这提供了更好的用户体验,因为我们不需要借助因特网就可以做出预测了。
Core ML 3现在也支持设备端上的训练了!你可以使用iPhone的CPU、GPU和神经引擎来训练你的机器学习和深度学习模型。
你可以把Core ML 3当做是迁移学习或者在线学习,这个过程中,你只需要微调一个已有的模型即可。
以Face ID应用为例。它需要让模型保持最新,因为用户的脸可能随着时间流逝而发生变化(脸上长出了胡须、化了不同的妆、脸变老了等等)。基本的想法是在一开始生成一个基础模型,这个模型对每一个人都具有相同的平均性能,然后会将其复制一份,这份拷贝就会针对每个用户进行定制化。
随着时间推移,每个用户独有的这个模型会变得更加出色,更加契合该用户:
这个方法具有几个好处:
2)Core ML 3中增加了新的神经网络层类型
除了为不同模型类别提供的网络层,Core ML 3还为一些中间操作提供了100+的网络层,比如Masking、Tensor Manipulation、Boolean logic、Control Flow等等。
其中一些层类型是在经典的神经网络架构中使用的,而Core ML 3已经提供给我们了。
这就意味着我们能够马上为我们的应用程序构建这样的模型了。
如果你对整个组件感兴趣,请观看WWDC完整视频。出于本文构建应用程序的目的,我们介绍了Core ML 3的核心基础知识。现在是时候构建一个iPhone的应用程序啦!
在我们开始构建应用程序前,需要先安装一些东西:
系统搭建:
git clone https://github.com/mohdsanadzakirizvi/CoreML3-Resnet50.git
注意:
构建我们的深度学习模型
一旦你下载了该项目,你会看到两个文件夹:
该项目的Complete Version是应用程序的全功能版本,你可以通过导入ResNet50模型来运行它。而练习版本则缺少一些代码,你可以使用这个版本代码来学习本文。
运行如下命令以在Xcode中打开该项目:
open ImageClassifier.xcodeproj
我在Xcode窗口中圈出了三处主要区域:
让我们先运行下这个应用程序看看会发生什么。点击左上角的play按钮,这会启动模拟器。
你看到了什么?
到目前为止,我们的应用程序没有做什么事情。它只是显示一张图片,和一个按钮用于选择其他图片——让我们做得更酷炫一些吧!
如果你打开练习版本,你会发现以下的文件夹结构:
在项目导航器面板,选择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模型:
你可以下载需要的模型版本。模型大小越大,模型就会越精确。类似的,模型大小越小,模型运行就会越快。
这里是整个过程,以供参考:
使用训练模型做出第一次预测
为了做出第一次预测,我们需要载入刚刚下载的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)
现在你再运行这个应用程序,你可以看到它已经开始对应用程序启动时显示的图片场景做出预测了。
把以上代码拷贝到imagePickerController()(第87行)中,然后应用程序就可以对你选择的任何图片做出同样的预测了。
以下就是该应用程序最终的样子:
恭喜你——你刚刚已经为你的iPhone构建了第一个AI应用程序!
使用最新的AI研究(包括图像、语音和文字)来创建令人印象深刻的应用程序,显然,苹果把这个过程变得更简单了。你不用知道太多的模型知识,就可以立马开始学习和探索如何构建应用程序了。你可以进一步探索,尝试用最新模型(例如BERT)创建更有意思的应用程序。如果可以的话,你可以尝试在本文应用程序中使用SqueezeNet和MobileNet,看看不同模型在同样的图片上的性能表现如何。
本文使用的所有代码都在Github上。
领取专属 10元无门槛券
私享最新 技术干货