NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

如何基于苹果推出的 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/


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

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

发布了 781 篇内容, 共 495.6 次阅读, 收获喜欢 2748 次。

关注

评论

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

“东数西算”超级工程利好云计算,多云管理背后却暗藏汹涌!

行云管家

云计算 多云 东数西算 云管

从容器化到资源池化,数栈云原生技术实践探索之路

袋鼠云数栈

大数据 flink 云原生 k8s

5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测

MASA技术团队

C# .net 微软 测试 压测

2022年提高远程工作效率的三大实用技巧汇总

行云管家

远程办公 居家办公 办公软件

科创人·富士康CDO史喆:To B产品切忌臃肿,数字化不分对错只求更好

科创人

Prime Video 如何使用机器学习来确保视频质量

亚马逊云科技 (Amazon Web Services)

计算机视觉 Amazon Prime Video WACV

TASKCTL ETL作业类型的插件与维护管理

TASKCTL

kettle 元数据 ETL 自动化运维 调度任务

Tiger DAO VC:将你的风险投资变成DAO组织协同

小哈区块

免费下载|KubeMeet 城市站实录合辑,N 场容器开源分享打包看

阿里巴巴云原生

云图说丨叮咚,您有一份短信通关攻略待查收

华为云开发者联盟

短信 签名 消息 签名模板 MSGSMS

jackson学习之十(终篇):springboot整合(配置类)

程序员欣宸

Java web 4月月更

计算机存储层次简析

懒时小窝

计算机基础

好的测试数据管理,到底要怎么做?

禅道项目管理

测试 数据 数据管理

一文读懂 TsFile

Apache IoTDB

hyengine - 面向移动端的高性能通用编译/解释引擎

阿里巴巴终端技术

编译 移动端 引擎

知识管理的目的及意义——提高社会资源的配置效率

小炮

知识管理

macOS系统病毒常见的两种传播途径

火绒安全

macos 终端安全 勒索病毒 蠕虫

来也科技收购Mindsay背后:新旧势力交锋智能自动化备受关注

王吉伟频道

RPA 收购 机器人流程自动化 来也科技 Mindsay

聚焦供应链布局,新能源汽车企业重塑产业核心竞争能力

数商云

数字化转型 供应链 新能源汽车

java高级用法之:JNA中的Function

程序那些事

Java Netty 程序那些事 4月月更

WeTest平台产品&技术合作伙伴招募

WeTest

使用 Sanic 框架进行 Python Web 开发

宇宙之一粟

Python 4月月更 sanic

Redis是怎样通讯的?

ooooooh灰灰

redis 后端 协议 4月月更

STM32+华为云IoTDA,带你设计一个属于自己的动态密码锁

华为云开发者联盟

stm32 iotda 华为云IoT 密码锁 Qt框架

thinkphp5框架新建页面相关规范详解

CRMEB

YonMaster开发者认证线上赋能培训班定档4月18日

YonBuilder低代码开发平台

【Zeekr_Tech】汽车软件RTOS-之AUTOSAR OS多核控制简介

Zeekr_Tech

Linux 软件架构

“双碳”下的建筑业:未来10年必须重视这5大方向

WorkPlus

教你用ab命令进行并发与压力测试

华为云开发者联盟

并发 压力测试 ab测试 ab命令 请求次数

MSE 微服务治理发布企业版,助力企业构建完整微服务治理体系

阿里巴巴云原生

五大应用示范,为社区/企业防疫管理减负提效

明道云

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