写点什么

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

  • 2019-11-29
  • 本文字数:5953 字

    阅读完需:约 20 分钟

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

苹果新推出的 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 生态系统

  • 进入 Core ML 3 的世界

  • Core ML 3 有哪些更新

  • 使用 ResNet50 模型为 iPhone 构建一个图像分类应用

  • 我们对 Core ML 的看法

苹果的 AI 生态系统

苹果在利用机器学习来构建工具和框架方面做得相当出色。构建 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 应用为例。它需要让模型保持最新,因为用户的脸可能随着时间流逝而发生变化(脸上长出了胡须、化了不同的妆、脸变老了等等)。基本的想法是在一开始生成一个基础模型,这个模型对每一个人都具有相同的平均性能,然后会将其复制一份,这份拷贝就会针对每个用户进行定制化。


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



这个方法具有几个好处:


  1. 训练只会在用户的个人设备上进行,这意味着能很好地保护用户的数据隐私

  2. 我们不需要为数百万用户搭建大量的服务器来做模型训练

  3. 由于不需要因特网,这个模型随时都可以用来做预测!


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



除了为不同模型类别提供的网络层,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。但是如果你对该语言感兴趣,可以点这个链接学习。


构建我们的深度学习模型


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



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


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


open ImageClassifier.xcodeproj
复制代码



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


  1. 在左上角显示的 play 按钮是用来在模拟器中启动你的应用程序

  2. 看一下 play 按钮下方,你会看到该项目的文件和文件夹。这个小面板称为项目导航器。它帮助我们在项目的不同文件和文件夹之间跳转。

  3. 在 play 按钮旁边写着“iPhone 11 Pro Max”。这个区域表示你想在模拟器上测试的目标设备型号。


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


你看到了什么?



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


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



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


import CoreMLimport Visionimport 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: - IBActionsextension ViewController {
@IBAction func pickImage(_ sender: Any) { let pickerController = UIImagePickerController() pickerController.delegate = self pickerController.sourceType = .savedPhotosAlbum present(pickerController, animated: true) }}
// MARK: - UIImagePickerControllerDelegateextension 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: - UINavigationControllerDelegateextension ViewController: UINavigationControllerDelegate {}
复制代码


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


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


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


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


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



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


  • Resnet50.mlmodel 文件拖入 Xcode 窗口的在项目导航面板

  • 此时会弹出一个窗口,窗口上带有一些选项。保持默认选项,然后点击“Finish”

  • 当我们把这样一个文件拖入 Xcode 后,它会在项目中自动地创建该文件的引用。通过这个方式,我们在代码中可以很容易地获取这个文件


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



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


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


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


// MARK: - Methodsextension 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 应用程序!

我们对 Core ML 3 的看法

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


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


原文链接:


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


2019-11-29 16:383938
用户头像
蔡芳芳 InfoQ主编

发布了 801 篇内容, 共 555.6 次阅读, 收获喜欢 2790 次。

关注

评论

发布
暂无评论
发现更多内容

Go-Excelize API源码阅读(十九)——SetHeaderFooter

Regan Yue

Go 开源 源码解析 8月日更 8月月更

Docker与虚拟化技术浅析第一弹之docker与Kubernetes

京东科技开发者

Docker Kubernetes k8s 虚拟机

图灵8月书讯 | 10 本新书上市,本本精选

图灵社区

新书推荐

MobTech ShareSDK 高级接口及配置

MobTech袤博科技

android MobTech袤博科技 sharesdk

租金、物业费的催收困境,如何解决?

IT资讯搬运工

[JS真好玩] 我帮掘金找到了一个小Bug,可利用该Bug增加专栏粉丝数

HullQin

CSS JavaScript html 前端 8月月更

呐,HTTP接口安全的八种对策送给你了

知识浅谈

HTTP API 8月月更

面试突击77:Spring 依赖注入有几种?各有什么优缺点?

王磊

Java 常见面试题

何去何从的并行计算

博文视点Broadview

如何应对软件可变性?这4种常用的方法肯定要知道

华为云开发者联盟

云计算 软件 后端

Kubernetes资源编排系列之五: OAM篇

阿里云大数据AI技术

运维 开放应用模型

解决 NGINX LDAP 参考实施中的安全问题

NGINX开源社区

nginx HTTP 安全漏洞 ldap 身份验证

教你使用Jupyter可视化查询语句的语法树

华为云开发者联盟

人工智能

开源一夏 | 使用layui框架实战之栅格系统和菜单评分组件运用心得

恒山其若陋兮

开源 8月月更

文本纠错:提升OCR任务准确率的方法

合合技术团队

人工智能 文字识别 OCR 合合信息

​Black Hat 2022 聚焦软件供应链安全

SEAL安全

网络安全 软件供应链安全

算法之“杨辉三角”题解

掘金安东尼

算法 前端 8月月更

英伟达首席科学家:深度学习硬件的过去、现在和未来

OneFlow

机器学习 深度学习 硬件

翻译|使用 StatefulSet 运行数据库应用

RadonDB

数据库 Kubernetes RadonDB

电商行业:全链路监测广告投放效果,用数据驱动业务增长

HarmonyOS SDK

分析 电商营销

公众版与政企版,这两款云电脑我都要!

天翼云开发者社区

云原生 SIG:关于 Koordinator 混部原理及最佳实践 | 第 43 期

OpenAnolis小助手

开源 云原生 混部 sig 龙蜥大讲堂

Linux常用命令

楠羽

短视频软件开发:推荐算法没有想象的那么复杂

开源直播系统源码

直播系统 直播系统源码 短视频直播

技术分享| anyRTC 8月更新迭代

anyRTC开发者

音视频 WebRTC 视频通话 实时消息 抓拍图片

Rewind the PlanetScale Rewind | 拆解硅谷当红科技公司如何做 Product Marketing

Bytebase

从零到一,教你搭建「以文搜图」搜索服务(一)

Zilliz

人工智能 机器学习 深度学习

架构实战营模块五作业

zhihai.tu

GaussDB(DWS)如何实现实时,批量和交付式查询一站式开发

乌龟哥哥

8月月更

云原生(二十四) | Kubernetes篇之Kubernetes 配置

Lansonli

云原生 k8s 8月月更

揭秘百度智能测试在测试分析领域实践

百度Geek说

测试 数据 用例

如何基于苹果推出的CoreML 3.0从零开发一个图像分类应用?_开源_Mohd Sanad Zaki Rizvi_InfoQ精选文章