写点什么

如何基于苹果推出的 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:383963
用户头像
蔡芳芳 InfoQ主编

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

关注

评论

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

浅谈指标体系建设(一)

圣迪

在 JavaScript 中创建私有成员

devpoint

JavaScript typescript ES2020 ES6 12月日更

对研发管理的一些思考

hackstoic

研发管理 规范

『腾讯网』幸运彩票是真是假[手机乐乎]

天马行空

幸运彩票是真是假

天长地久->曾经拥有

mtfelix

28天写作

架构实战营毕业总结

紫云

架构实战营

模块五作业

Geek_1d37ea

架构实战营

Nacos 本地单机版部署步骤和使用 – Spring Cloud 系列教程

程序员泥瓦匠

nacos

35 K8S之kubeconfig配置文件

穿过生命散发芬芳

k8s 28天写作 12月日更

模块六作业

沐风

JetPack-Paging3-入门

Changing Lin

12月日更

毕业设计:电商秒杀系统架构设计

紫云

自定义规则删除过期文件(linux)

liuzhen007

28天写作 12月日更

【LeetCode】从英文中重建数字Java题解

Albert

算法 LeetCode 12月日更

毕业总结

guangbao

再来一篇!看jdk源码大师亲自操刀编写的集合源码!

看点代码再上班

Java 架构 软件技术

hw6-拆分电商系统为微服务

WWH

架构实战营

DDD领域驱动设计落地实践:六步拆解DDD

慕枫技术笔记

架构 后端 签约计划第二季

DDD领域驱动设计落地实践系列

慕枫技术笔记

内容合集 签约计划第二季

极客时间【架构实战营】第二期 毕业设计

Geek_91606e

架构实战营

Springboot异步任务执行及监控

xcbeyond

springboot 异步任务 28天写作 12月日更

模块五学习总结

Geek_1d37ea

架构实战营

创业研发团的组织建设-硬件开发流程

wood

创业 敏捷 28天写作 硬件开发

长短租用户体验

张老蔫

28天写作

庞氏骗局:购物就能赚钱

石云升

28天写作 电信诈骗 12月日更 庞氏骗局

『腾讯网』德国飞艇平台[手机乐乎]

天马行空

德国飞艇平台

Golang Gin 框架之模型绑定(八)

liuzhen007

28天写作 12月日更

『腾讯网』飞艇技巧图片图解【重点推荐】[手机乐乎]

天马行空

飞艇技巧图片图解

『腾讯网』腾讯分分彩 官网平台[手机乐乎]

天马行空

腾讯分分彩 官网平台

现代软件架构师的10个技巧

俞凡

架构 微服务 云原生

Android C++系列:Linux线程(二)线程原语

轻口味

android 28天写作 12月日更

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