文章

创建图像分类器模型

训练机器学习模型来对图像进行分类,并将模型添加到您的 Core ML app 中。

概览

图像分类器是一种能够识别图像的机器学习模型。在您提供一张图像后,图像分类器会根据这个图像回复一个分类标签。

此图显示了图像分类器如何根据长颈鹿的图像预测标签“长颈鹿”。

训练图像分类器的方法是向它展示大量已标记的图像示例。例如,您可以向图像分类器展示各种大象、长颈鹿、狮子等动物的照片来训练它识别野生动物。

这个流程图显示了动物图像如何进入 Create ML 中并生成动物分类器 Core ML 模型文件。

在图像分类器完成训练后,您可以对其进行评估。如果其准确性令人满意,您可以将它存储为 Core ML 模型文件,并将该文件导入到 Xcode 项目中,以在 app 中使用这个图像分类器。

收集数据

每个类别应使用至少 10 张图像,但请谨记,使用更多样化的图像可以改善图像分类器的表现,例如使用从多个角度和在多种光照条件下拍摄的照片。

每个类别下的图像数量应保持平衡。例如,不要在一个类别下使用 10 张图像,而另一个类别使用 1000 张图像。

图像可以采用 Quicktime Player 能够打开的任何格式,如 JPEG 和 PNG。图像无需符合特定的大小要求,不同图像的大小也无需相同。不过,最好使用大小至少达到 299 x 299 像素的图像。

如有可能,您收集的图像应该接近并能代表那些您预期模型在 app 中会看到的图像。例如,如果您的 app 要对用设备的摄像头在室外环境中拍摄的图像进行分类,则您应使用在室外用类似摄像头拍摄的图像来训练模型。

整理训练数据

通过将图像整理到子文件夹中来准备训练数据集。根据子文件夹中所含图像的类别,为每个子文件夹命名。例如,您可以使用标签 Cheetah 来表示所有猎豹图像。

图表显示了一个名为“Training Data”的文件夹和其中的多个子文件夹,其中子文件夹的名称为所含图像类别对应的标签。例如,所有猎豹图像都存放在名为“Cheetah”的子文件夹中。

整理测试数据

使用测试数据集测试您的模型,可以快速了解您训练的模型在现实世界中的表现情况。

如果您有数量充足的图像 (例如每个类别 25 张或以上),可以通过复制训练数据集的文件夹结构来创建测试数据集。然后,将每个类别大约 20% 的图像移入测试数据集中的同等类别文件夹。

创建图像分类器项目

使用 Create ML 创建图像分类器项目。在 Xcode 打开后,按住 Control 键点按程序坞中的 Xcode 图标,再选取“Open Developer Tool”(打开开发者工具) >“Create ML”;或者,您也可以从 Xcode 菜单中选取“Open Developer Tool”(打开开发者工具) >“Create ML”。

在 Create ML 中,选取“File”(文件) >“New Project”(新项目) 以查看模型模板的列表。选择“Image Classification”(图像分类),点按“Next”(下一步)。

这个截屏中显示了名称为“Image Classification”(图像分类)、“Object Detection”(对象检测) 和“Style Transfer”(样式转换) 的 Create ML 项目模板。

将项目的默认名称更改为更合适和实用的名称。如有这个项目内模型的更多相关信息 (如一名或多名作者以及简短描述),可在此填写。

这个截屏中显示了新项目选项窗口,其中显示了“Project Name”(项目名称)、“Author”(作者)、“License”(许可) 和“Description”(描述) 文本栏。前几个文本栏位的值分别为“Animal Classifier”、“Jamie Appleseed”和“No license provided”。描述文本栏中显示“A machine learning model trained to recognize wild animals”。

配置训练会话

将含有训练数据集的文件夹拖入项目窗口中的“Training Data”(训练数据) 方格。

这个项目窗口截屏中显示了“Settings”(设置) 标签页,其中一个名为“Training Dataset”的访达文件夹正被拖放到其“Training Data”(训练数据) 方格中。

如果适用,将含有测试数据集的文件夹拖入项目窗口中的“Testing Data”(测试数据) 方格中。

这个项目窗口截屏中显示了“Settings”(设置) 标签页,其中一个名为“Training Dataset”的访达文件夹正被拖放到其“Testing Data”(测试数据) 方格中。

如果您知道在训练会话中将使用的训练迭代数量,可以将默认的“Maximum Iterations”(最大迭代数) 更改为其他值。您也可以打开任何或所有图像增强。

这个截屏中显示了 Create ML app,图中高亮显示了“Parameters”(参数) 和“Augmentation”(增强) 设置。“Maximum Iterations”(最大迭代数) 参数设置已设为 25。增强设置有 6 个复选框 (全部处于未选中状态),名称分别为:“Add Noise”(添加噪点)、“Blur”(模糊)、“Crop”(裁剪)、“Expose”(曝光)、“Flip”(翻转) 和“Rotate”(旋转)。

每一种增强都会创建一个副本,并对样本图像应用变形或滤镜效果,让您无需收集更多样本,也可提高数据集的多样性。

训练图像分类器

点按“Train”(训练) 按钮,以启动训练会话。在启动会话时,Create ML 会将部分训练数据快速分入验证数据集,然后从其余训练图像中提取特征,如边缘、角落、纹理和颜色区域。Create ML 会使用图像的特征来反复训练模型,再利用验证数据集检查其准确性。

这个项目窗口截屏中显示了“Training”标签页下有个线条图,其中呈现了模型准确性和训练迭代数。线条朝着 100% 逐渐向上递进,在 10 次 (共 25 次) 迭代后,训练和验证的准确性分别达到 97.7% 和 90%。

Create ML 会在图表中显示进度,黑线和灰线分别表示模型针对训练数据集和验证数据集的准确性。

评估模型的准确性

Create ML 完成模型训练后,将使用测试数据集对模型进行测试。完成对模型的测试后,Create ML 会在“Evaluation”(评估) 标签页下显示训练、验证和测试的得分。模型的训练数据集准确性得分通常较高一些,因为它是从这些图像学习的。在这个示例中,图像分类器正确识别了训练图像中 100% 的图像、验证图像中 95% 的图像,以及测试图像中 97% 的图像。

这个项目窗口截屏显示了“Evaluation”(评估) 标签页下有一个测试数据集表格,其中含有名为“Class”、“Item Count”、“Precision”和“Recall”的列。表格按照“Precision”(精确率) 的升序排列,第一行的值分别为“Leopard”、5%、83% 和 100%。

“Precision”(精确率) 是真正例除以真正例与假正例之和所得到的值。“Recall”是真正例除以真正例与假负例之和所得到的值。

如果评估表现不够好,您可能需要更多样的训练数据进行重新训练。例如,您可以为图像分类器启用图像增强选项。有关如何进行更详细模型评估的信息以及提升模型性能的策略,请参阅“提高模型准确性”。

预览模型

点按“Preview”(预览) 标签页,以测试模型对未曾见过的图像的表现。要查看模型的预测,可将图像文件拖入“Train”(按钮) 下方的列中。

这个截屏显示了项目窗口中的“Preview”(预览) 标签页。

存储模型

如果模型的性能达标,就可将它存储到文件系统中 (使用 Core ML 的 .mlmodel 格式),以便添加到您的 Xcode 项目中。您可以从“Output”(输出) 标签页进行以下操作:

  • 点按“Save”(存储) 按钮,将模型存储到文件系统中

  • 点按“Export”(导出) 按钮,在 Xcode 中打开模型

  • 点按“Share”(共享) 按钮,将模型发送给其他人,例如通过“邮件”或“信息”来发送

  • 将模型的图标拖入接受文件的任何地方

这个截屏显示了项目窗口的“Output”(输出) 标签页,其中显示了用户点按“Get”(获取) 按钮后出现的模型存储对话框。“Get”(获取) 按钮的图标是带有向下箭头的方框。

将模型添加到 App

最后一步是将您训练好的模型添加到 Xcode 项目中。例如,您可以使用图像分类器模型来替换掉“通过计算机视觉和 Core ML 对图像进行分类”(英文) 示例的 Xcode 项目中包含的模型。

下载这个示例,并在 Xcode 中打开其项目。将您的模型文件拖入导航面板中。Xcode 会将这个模型添加到项目中,并显示模型的元数据、操作系统可用性,以及类别标签等。

这个截屏显示了在 Xcode 中打开的示例代码项目,其中显示了动物分类器模型在编辑器视图的情况。

只需更改一行代码,就能在其中使用您的模型。项目仅在 ImageClassificationViewController 类中的一个位置对 MobileNet 模型进行实例化处理。


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

更改这行代码,就能将正在使用的替换为您的模型类。


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

这些模型都以图像为输入并输出标签字符串,因此可以互换。替换模型后,示例 app 不但会像之前一样对图像进行分类,现在它还会使用您的模型及关联的标签。

自动训练和评估模型

如果您是编程或机器学习方面的新手,可以按照以上所述,使用 Create ML 来训练有用的图像分类器。当然您也可以使用 MLImageClassifier (英文) 实例来编写模型训练过程的脚本。常规的任务都是相同的:准备数据,训练模型,评估性能,再存储 Core ML 模型文件。不同之处只在于所有任务都需要编程。

例如,您可以对两个 MLImageClassifier.DataSource (英文) 实例进行实例化处理,分别用于训练数据集和测试数据集。借助 init(trainingData:parameters:) (英文),使用训练数据源来对图像分类器进行实例化处理。然后,使用测试数据源及 evaluation(on:) (英文) 方法,再评估它返回的 MLClassifierMetrics (英文) 实例中的值。

另请参阅

图像模型