训练一个机器学习模型来实现图像分类。
1.概述
图像分类器是一个被训练用来识别图像的机器学习模型。当你给他一个图像,它针对这个图像反馈一个文本。
通过显示许多贴过标签的示例图像来训练图像分类器。例如,您可以通过显示如大象、长颈鹿、狮子等多种图像训练一个图像分类器来识别野生动物。
2.准备数据
首先准备用于训练和评估分类器的数据。从每个标签的80%的图像中创建一个训练数据集合。用剩下的图片创建一个测试数据集。确保任何给定的图像只存在于两个集合的其中一个。
接下来,将磁盘上的数据组织为与MLImageClassifier.DataSource
类型之一兼容。一个方法是创建一个名为Training Data
的文件夹,另一个命名为Testing Data
。在每个文件夹中,用您的标签作为名字创建子文件夹。然后将图像排列到每个数据集的相应子文件夹中。
确切的标签字符串并不重要,只要它们对您有意义。比如,可以使用“Cheetah”标签来表示所有猎豹的图像。您不必用任何特定的方式命名图像文件或者向其添加元数据。您只需要讲他们放入正确标签的文件夹即可。每个标签至少使用10张图像作为训练集,当然越多越好。此外要平衡每个标签图像的数量。比如,不要使用10张图像用于"猎豹",而"大象"给了1000张。
图像可以是统一格式标志符符合“public.image”的任意格式。包括像JPEG和PNG这样的常见格式。图像不必统一相同的尺寸,也不用使用任何特定尺寸。但是,最好使用大于等于299x299像素的图像。如果可以,使用与收集图像进行预测相似的方式训练您收集的图像。也就是说,如果您的应用程序在室外设置中对从设备的相机拍摄的图像进行分类,则使用类似相机在户外拍摄的图像训练您的模型。
提供多样性的图像。例如,使用显示来自许多不同角度和不同光照条件的动物图像。对于给定标签用差不多相同图像训练出来的分类器,相比较于用更多样化的图像集训练出来的分类器,性能更差。
注
分类器使用“scene print feature extractor”来加速训练过程。这回影响适合训练图像的种类。详细可参考MLImageClassifier.FeatureExtractorType.scenePrint(revision:)
创建模型的两种方式
方式一、在 Playground 中显示 Image Classifier Builder(通过Playground创建)
准备好您的数据,使用Mac OS创建一个新的Xcode playground。使用playground创建MLImageClassifierBuilder
实例并且在实时视图中展示它:
// Import CreateMLUI to train the image classifier in the UI.
// For other Create ML tasks, import CreateML instead.
import CreateMLUI
let builder = MLImageClassifierBuilder()
builder.showInLiveView()
在Xcode中显示助手编辑器,并运行playground。当你运行它时,实时视图会展示一个图像分类器:
训练图像分类器
将训练数据文件夹从Finder拖拽到实时视图指定的位置。当您这么做时,训练处理开始并且图像分类器显示其进度:
作为训练过程的一部分,图片分类器自将自动将训练数据分成训练集和验证集。它们都会影响训练,但方式不同。因为分离是随机进行的,所以每次训练模型时会得到不同的结果。
当训练结束时,实时视图显示训练和验证的准确度。这个反映了训练模型从相应数据集分类图像的效果如何。因为模型是在这些图像上训练的,所以它通常能很好地对它们进行分类。
评估分类器的性能
接下来,用模型从没有见过的图形来测试它,以评估训练模型的性能。为此,使用开始训练之前创建的测试数据集。拖拽测试数据文件夹到实时视图,就像拖拽训练数据时一样。
该模型处理所有的图像,并对每一个图像做出预测。因为这是被标记的数据,该模型可以检测它自己的预测结果。然后,它将总体评估精度作为UI中的最终度量。
如果评估性能不够好,您可能需要更多的数据重新训练——例如,通过引入图像增强——或者更改一些其他培训配置。有关如何进行更详细的模型评估以及改进模型性能的策略的信息,请参阅Improving Your Model’s Accuracy
保存Core ML 模型
当你的模型运行得足够好时,将它保存下来,这样你就可以在你的应用程序中使用它了。
给分分类器起一个有意义的名字。在UI中用AnimalClassifier
作为名字替换默认的ImageClassifier
。您也可以添加更多关于模型的信息,像作者和简短描述。点击展开三角按钮来显示元数据栏位并填写详细信息
点击Save
。该模型以.mlmodel
格式的文件写入到Where
字段指定的目录。
将模型添加到应用
现在,将训练过的模型添加到现有支持Core ML的应用程序中。您可以使用该模型替换来自Classifying Images with Vision and Core ML样例代码项目中附带的模型。如果您这样做了,该样例app的工作原理与之前完全形同,只是它根据您定义的标签识别和分类动物。
在Xcode中打开样例代码项目并将您的模型文件拖入导航面板。一旦该模型成为项目的一部分,Xcode向您显示模型元数据以及其他信息,比如Model Class
。
使用新得模型,您只需要更改一行代码。项目附带的MobileNet
模型在ImageClassificationViewController
类的一个地方被实例化:
let model = try VNCoreMLModel(for: MobileNet().model)
将这一行改为使用新的模型类:
let model = try VNCoreMLModel(for: AnimalClassifier().model)
该模型可以被互换是因为他们都获取一个图像作为输入并输出一个标签。替换之后,样例应用程序与之前一样对图像进行分类,只是用了您的模型及其关联的标签。
实现图像分类器制作过程自动化
如果您在编程或机器学习方面没什么经验,可以按照以上部分所述,使用MLImageClassifierBuilder
实例来训练有用的图像分类器。然而,如果需要用脚本编写模型训练过程,请改为使用MLImageClassifier
实例。这些步骤本质上是一样的:准备数据、训练模型、评估性能并保存结果到Core ML模型文件中。不同之处在于,一切都是通过编程完成的。例如,您不是将测试数据拖到实时视图来评估模型的表现,而是初始化 MLImageClassifier.DataSource 实例并将它提供给分类器的 evaluation(on:) 方法。
方式二、Create an Image Classifier Project(通过Xcode工具创建)(Xcode升版本后可用)
用Create ML创建一个图像分类项目。打开Xcode,按住Control建并单击Xcode的Dock图标,然后选择Open Developer Tool> Create ML
。或者,从Xcode菜单中选择Open Developer Tool> Create ML。
在Create ML
中,选择File
->New
以查看模型模板列表。选择Image Classifier
,然后单击Next
。
给分类器赋予一个有意义的名字。在UI上用AnimalClassifier
替换默认的MyImageClassifier
作为项目名称。您也可以已添加更多关于模型的信息,像作者和简短描述。
配置训练输入数据
将训练数据文件夹从Finder拖入到项目窗口的Traininig Data
位置。
从Finder将测试数据文件夹拖到项目窗口中的
Testing Data
位置。自定义训练参数或者添加图像增强(可选)
训练图像分类器
在项目窗口工具栏上点击播放按钮开始训练。图像分类器在从训练图像中学习时显示其进度。
了解培训和验证过程
作为培训过程的一部分,Create ML会自动将您的培训数据分成训练集和验证集。模型从训练集迭代地学习,并且在每次迭代时,模型使用验证集检查其自身的准确性。因为Create ML将数据随机分成这两组,所以每次训练模型时可能会得到不同的结果。
评估分类器的准确性
培训结束后,Create ML显示培训和验证准确性分数。这些报告了训练模型对相应集合中的图像进行分类的程度。因为模型训练这些图像,所以通常可以很好地对它们进行分类。在该示例中,训练的模型正确地识别训练集中的所有图像和验证集中的97%的图像。
UI显示了每次训练迭代时模型的准确度进度图表,以及每个图像类别的精度和召回详细信息。
精确度是真阳性的数量除以真阳性和假阳性的总和。召回是真阳性的数量除以真阳性和假阴性的总和。
测试分类器的性能
使用您的测试数据集Create ML测试您训练模型的性能,测试数据集包含模型以前从未见过的图像。
该模型处理所有图像并对每个图像进行预测。Create ML将每个预测与正确的标签进行比较,并在UI中显示整体测试准确性。
如果评估绩效不够好,您可能需要重新培训更多不同的培训数据。例如,您可以为图像分类器启用图像增强选项。有关如何进行更详细的模型评估以及提高模型性能的策略的信息,请参阅提高模型的准确性。
保存模型
当您的模型运行良好时,请将其保存,以便您可以在应用中使用它。将模型图标从Output选项卡拖动到Finder中的目录,以将模型保存为.mlmodel格式的文件。
将模型添加到您的应用程序
现在将训练的模型添加到使用Core ML的应用程序。您可以使用此模型替换Vision with Vision和Core ML示例代码项目附带的模型。如果您这样做,示例应用程序的工作原理与之前完全相同,只是它根据您定义的标签识别和分类动物。
在Xcode中打开示例代码项目,然后将模型文件拖到导航窗格中。一旦模型成为项目的一部分,Xcode就会显示模型元数据以及模型类等其他信息。
要在代码中使用新模型,只需要更改一行代码即可。项目附带的 MobileNet 模型仅在 ImageClassificationViewController 类中的一个位置进行实例化:
let model = try VNCoreMLModel(for: MobileNet().model)
请将这一行更改为使用新的模型类:
let model = try VNCoreMLModel(for: AnimalClassifier().model)
这些模型都以图像为输入并输出标签,因此可以互换。替换后,示例 app 会像之前一样对图像进行分类,不同的地方是它会使用您的模型及关联的标签。