将 Edge 部署到 iOS (Core ML) 教程

您需要构建的内容

在本教程中,您将下载导出的自定义 Core ML 模型 (.mlmodel)。然后,您需要运行一个使用该模型识别花卉图片的预制 iOS 应用。

修改过的应用图片

目标

在本入门级端到端演示中,您将使用代码执行以下操作:

  • 在 iOS 应用中运行预训练的 Core ML 模型。

概览

借助 Core ML 框架,您可以使用经过训练的机器学习模型对输入数据进行分类。Vision 框架与 Core ML 搭配使用,可将分类模型应用于图片,以及预处理这些图片,使机器学习任务更轻松、更可靠。

准备工作

下载常规 Edge 模型

  1. 下载包含预训练 Core ML 模型的文件夹。 您将在本教程中使用该模型。

  2. 解压缩下载的 ZIP 文件。

  3. 在开始学习本教程之前,请导航到根项目目录:

    cd ClassifyingImagesWithVisionAndCoreML
    您将从此目录运行以下所有代码示例。

训练和导出自定义 Edge 模型

在继续操作之前,请完成 Edge 设备模型快速入门,注意根据以下修改执行相应操作:

  • 训练模型步骤中,选择设置 Core ML 模型格式 (Format model for Core ML) 选项。
  • 导出和部署 Edge 模型步骤中,按照导出 Core ML 模型的操作说明进行操作。
  • 使用提供的花卉数据集,或使用您自己的数据集。

您将使用生成的花卉 Core ML model.mlmodel 文件来运行现有 iOS 应用的自定义版本。

设置 iOS 应用

演示版 iOS 应用需要使用其他几种工具:

  1. Xcode
  2. Xcode 命令行工具

下载 Xcode

使用以下链接将 Xcode 下载到您的机器上。

安装 Xcode 命令行工具

在命令行中运行以下命令来安装 Xcode 命令行工具:

xcode-select --install

打开项目

使用 Xcode 打开项目。您可以通过命令行或界面打开项目。 如需通过命令行打开项目,请运行以下命令:

open ./Vision+ML\ Example.xcodeproj

运行原始应用

如需在模拟器中启动该应用并获取图片注释,请完成以下步骤:

  1. 选择 Xcode 窗口左上角的播放按钮 Xcode 播放图标,启动该应用。
  2. 向该应用提供预测图片。您可以通过两种方式提供图片:
    • 使用设备的相机拍摄照片,或
    • 通过将照片拖放到模拟器窗口来将其添加到设备的照片库中

该应用会根据模型为每个分类类别分配的置信度得分依次显示前两个分类类别。

结果应显示与以下图片类似的注释:

使用通用原始应用进行的分类:家具、水果、植物

运行自定义应用

原始应用使用 Core ML 模型,该模型使用标准 MobileNet 将图片归为 1000 个通用 ImageNet 类别(动物、水果、家具、植物等)中的某个类别。

修改该应用,以便其使用具有以下自定义花卉图片类别的重新训练模型。

  • 雏菊
  • 蒲公英
  • 玫瑰
  • 向日葵
  • 郁金香

将模型文件添加到项目中

  1. 下载您的自定义花卉模型(导出的 Core ML model.mlmodel),该模型是您通过完成 Edge 设备模型快速入门获取的。来自于 Core ML 模型导出操作的 model.mlmodeldict.txt 文件将位于您指定的 Google Cloud Storage 位置。

  2. 将您的自定义模型重命名为 AutoML.mlmodel

  3. 从项目中删除现有模型 (MobileNet.mlmodel)。

  4. 将自定义模型添加到 Vision+ML Example 文件夹内的项目中。

    将自定义模型拖动到 Xcode 图片中

  5. 修改 ImageClassificationViewController 中的第 30 行。移除:

    let model = try VNCoreMLModel(for: MobileNet().model)

    将此行替换为下面一行:

    let model = try VNCoreMLModel(for: AutoML().model)

运行您的自定义模型应用

如需在模拟器中重新启动该应用,请选择 Xcode 窗口左上角的播放按钮 Xcode 播放图标

如需测试修改效果,请从 flower_photos/ 目录添加图片文件并进行预测。

结果应如下所示:

修改过的应用图片

请注意,默认图片不是花卉图片。

如需试用模型,请添加您之前下载的训练数据图片,或通过 Google 搜索下载用于预测的图片。

工作方式

现在您已运行该应用,接下来请查看特定于 CoreML 和 Vision 框架的代码。

使用 Core ML 模型设置 Vision

Core ML 会自动生成一个 Swift 类,该类可让您轻松访问机器学习模型。

在以下示例中,Core ML 从 MobileNetmodel 自动生成 MobileNet 类。

  • 使用以下代码获取模型实例:

    let model = try VNCoreMLModel(for: MobileNet().model)
  • 使用上述模型和完成处理程序创建 Vision 请求。完成处理程序会处理来自模型的预测响应。

  • 界面应该在主线程中更新:

    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 对象,这些对象描述机器学习模型标识的可能分类。

  1. 机器学习模型会以固定的宽高比处理输入图片,但是输入图片可能具有任意宽高比,因此 Vision 必须将图片缩放或剪裁到合适的大小。为获得最佳结果,请将请求的 imageCropAndScaleOption 属性设置为与训练模型时使用的图片布局相匹配。

    request.imageCropAndScaleOption = .centerCrop
  2. 使用以下代码和输入图片创建 VisionRequestHandler

    let handler = VNImageRequestHandler(ciImage: ciImage, orientation: orientation)
  3. 通过传递 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: