您需要构建的内容
在本教程中,您将下载导出的自定义 Core ML 模型 (.mlmodel
)。然后,您需要运行一个使用该模型识别花卉图片的预制 iOS 应用。
目标
在本入门级端到端演示中,您将使用代码执行以下操作:
- 在 iOS 应用中运行预训练的 Core ML 模型。
概览
借助 Core ML 框架,您可以使用经过训练的机器学习模型对输入数据进行分类。Vision 框架与 Core ML 搭配使用,可将分类模型应用于图片,以及预处理这些图片,使机器学习任务更轻松、更可靠。
准备工作
下载常规 Edge 模型
下载包含预训练 Core ML 模型的文件夹。 您将在本教程中使用该模型。
解压缩下载的 ZIP 文件。
在开始学习本教程之前,请导航到根项目目录:
cd ClassifyingImagesWithVisionAndCoreML
您将从此目录运行以下所有代码示例。
训练和导出自定义 Edge 模型
在继续操作之前,请完成 Edge 设备模型快速入门,注意根据以下修改执行相应操作:
- 使用提供的花卉数据集,或使用您自己的数据集。
- 在训练模型步骤中,选择 Edge 模型单选选项。
- 在导出模型步骤中,按照导出 Core ML 模型的方法说明进行操作。
您将使用生成的花卉 Core ML model.mlmodel
文件来运行现有 iOS 应用的自定义版本。
设置 iOS 应用
演示版 iOS 应用需要使用其他几种工具:
- Xcode
- Xcode 命令行工具
下载 Xcode
使用以下链接将 Xcode 下载到您的机器上。
安装 Xcode 命令行工具
在命令行中运行以下命令来安装 Xcode 命令行工具:
xcode-select --install
打开项目
使用 Xcode 打开项目。您可以通过命令行或使用 Google Cloud Platform Console 来打开项目。如需通过命令行打开项目,请运行以下命令:
open ./Vision+ML\ Example.xcodeproj
运行原始应用
如需在模拟器中启动该应用并获取图片注释,请完成以下步骤:
- 选择 Xcode 窗口左上角的播放按钮 ,启动该应用。
- 向该应用提供预测图片。您可以通过两种方式提供图片:
- 使用设备的相机拍摄照片,或
- 通过将照片拖放到模拟器窗口来将其添加到设备的照片库中
该应用会根据模型为每个分类类别分配的置信度得分依次显示前两个分类类别。
结果应显示与以下图片类似的注释:
运行自定义应用
原始应用使用 Core ML 模型,该模型使用标准 MobileNet 将图片归为 1000 个通用 ImageNet 类别(动物、水果、家具、植物等)中的某个类别。
修改该应用,以便其使用具有以下自定义花卉图片类别的重新训练模型。
- 雏菊
- 蒲公英
- 玫瑰
- 向日葵
- 郁金香
将模型文件添加到项目中
下载您的自定义花卉模型(导出的 Core ML
model.mlmodel
),该模型是您通过完成 Edge 设备模型快速入门获取的。来自于 Core ML 模型导出操作的model.mlmodel
和dict.txt
文件将位于您指定的 Google Cloud Storage 位置。将您的自定义模型重命名为
AutoML.mlmodel
。从项目中删除现有模型 (
MobileNet.mlmodel
)。将自定义模型添加到
Vision+ML Example
文件夹内的项目中。修改
ImageClassificationViewController
中的第 30 行。移除:let model = try VNCoreMLModel(for: MobileNet().model)
将此行替换为下面一行:
let model = try VNCoreMLModel(for: AutoML().model)
运行您的自定义模型应用
如需在模拟器中重新启动该应用,请选择 Xcode 窗口左上角的播放按钮 。
如需测试修改效果,请从 flower_photos/
目录添加图片文件并进行预测。
结果应如下所示:
如需试用模型,请添加您之前下载的训练数据图片,或通过 Google 搜索下载用于预测的图片。
工作方式
现在您已运行该应用,接下来请查看特定于 CoreML 和 Vision 框架的代码。
使用 Core ML 模型设置 Vision
Core ML 会自动生成一个 Swift 类,该类可让您轻松访问机器学习模型。
在以下示例中,Core ML 从 MobileNetmodel
自动生成 MobileNet 类。
使用以下代码获取模型实例:
let model = try VNCoreMLModel(for: MobileNet().model)
使用上述模型和完成处理程序创建 Vision 请求。完成处理程序会处理来自模型的预测响应。
Google Cloud Platform Console 应该在主线程中更新:
let request = VNCoreMLRequest(model: model, completionHandler: { [weak self] request, error in DispatchQueue.main.async { guard let results = request.results else { self.classificationLabel.text = "Unable to classify image.\n\(error!.localizedDescription)" return }
results
将始终位于 VNClassificationObservation
中,这是由此项目中的 Core ML 模型指定的。
let classifications = results as! [VNClassificationObservation] })
Vision 请求的完成处理程序会指示请求是成功了还是导致了错误。如果成功了,则请求的 results 属性会包含 VNClassificationObservation
对象,这些对象描述机器学习模型标识的可能分类。
机器学习模型会以固定的宽高比处理输入图片,但是输入图片可能具有任意宽高比,因此 Vision 必须将图片缩放或剪裁到合适的大小。为获得最佳结果,请将请求的
imageCropAndScaleOption
属性设置为与训练模型时使用的图片布局相匹配。request.imageCropAndScaleOption = .centerCrop
使用以下代码和输入图片创建
VisionRequestHandler
:let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
通过传递 request 对象来调用处理程序的 perform 函数。
do { try handler.perform([self.classificationRequest]) } catch {
该处理程序会捕获常规图片处理错误。
classificationRequest
的完成处理程序processClassifications(_:error:)
会捕获特定于处理该请求的错误。print("Failed to perform classification.\n\(error.localizedDescription)") }
后续步骤
您现在已经使用从 AutoML Vision Edge 导出的 Core ML 模型完成了 iOS 花卉分类应用的演示。您使用训练好的 Core ML 模型对常规图片分类应用进行了测试,接着对其进行了修改并获取了花卉的自定义示例注释。然后您查看了特定于 Core ML 的代码来了解基础功能。
以下资源可以帮助您继续了解 Core ML 模型和 AutoML Vision Edge:
- 参阅官方文档和代码库,详细了解 CoreML。
- 试用此演示版应用的相机版本,该版本使用模型的量化版本。该版本通过更小、更高效的软件包提供了相同的功能。
- 尝试使用一些其他 TFLite 就绪模型,包括语音热词检测器和设备版智能回复。