在iOS上创建ML



人工智能每年都在接近,直到昨天才只有少数人可以使用。今天,我们可以自己创建机器学习模型,并在我们的项目中使用它们。在本文中,我们将介绍Create ML工具,并尝试训练模型对图像进行分类。

但是在开始之前,请先回顾一下历史和解释。在面向开发人员WWDC2018的年度会议上,Apple介绍了用于与机器学习Create ML配合使用的工具。在Create ML中训练的模型是将机器学习算法应用于一组训练数据的结果。模型不会占用太多空间(大约3Mb),因此可以将它们存储在项目中。最初,有人提议在Xcode 10中使用Playgrounds训练模型,并支持使用图像,文本和表格。启动项目的操场时,有必要导入CreateML库并运行MLImageClassifierBuilder(以防我们训练模型对图像进行分类)。

import CreateMLUI

let builder = MLImageClassifierBuilder()
builder.showInLineView()

苹果在2019年推出了一种全新的工具,用于将机器学习模型与Playgrounds分开使用。无需一行代码即可训练模型。数据类型列表已被声音和活动所补充。总共提供了5种数据类型和9种模型模板。让我们看一下每种数据类型以及结果可以得到的模型。

图片


图片

使用图像训练时,有两个模板可用-图像分类器(图像分类器)和对象检测器(对象检测器)。

图像分类器用于根据图像内容对图像进行分类。训练好模型后,我们可以识别图像中的一个对象并将其归为某种类型。例如,为了识别图像中的动物,甚至区分照片中描绘的花朵。在创建ML中,图像分类器模板使用传递训练。传递训练是将预先训练的模型与用户数据结合在一起的能力,这使您可以在少量图像上训练模型。

对象检测器是一种深度学习模型。使您可以识别图像中的多个对象,例如人,建筑物,汽车。而所有这些都在一个图像中。还应该添加的是,在训练对象检测器模型时,将使用计算机GPU。

声音


图片

处理声音时,只有一个模板可用于创建模型-声音分类器(声音分类器)。声音分类器是一个新模板,可让您确定音频流中最主要的声音。例如,您可以确定哪些乐器在音频中发出声音。声音分类器与图像分类器一样,使用传递训练。

活动


图片
活动仅由一个模板表示-活动分类器。活动分类器是Create ML中的新模板,用于对来自加速度计和陀螺仪的运动数据进行分类。

这样的模型是深度学习模型,并使用计算机的GPU进行训练。

文本


图片

文本由两个模板表示:文本分类器(text classifier)和单词标记器(Word Tagger)(单词标记)。

文本分类器用于根据句子,段落甚至整个文章的内容来识别它们。Word Tagger用于标记单词或识别文本中的任何名称。

桌子


图片

表由三个模板表示:表格回归器(table regressor),表格分类器(table classifier)和推荐器(recommender)。

表格回归器是可以基于某些数据预测数值的模型。例如,您可以训练一个可以预测天气的模型。

表格分类器根据对象的功能对对象进行分类。例如,您可以训练模型来根据各种用户参数确定在线商店中衣服的大小。如果目标是离散值,则模型可以使用整数,双精度型,字符串和long之类的类型。

推荐器允许您根据用户行为来推荐内容,并且所有计算都直接在设备上执行。

现在我们已经熟悉了所有可用的模板,我们可以开始创建第一个机器学习模型。让我们从图像分类器开始。

图像分类器


您看过HBO硅谷系列吗?在第四季度的系列之一中,他们展示了一种可在图像中识别“热狗”和“非热狗”的应用程序。使用图像分类器,可以创建此应用程序的类似物。但是首先,您需要准备数据以训练模型。在此处存档图像

训练图像分类器模型的一些要求。图片不得少于299 x 299像素。培训套件必须包含至少10张图像,但数量越多越好。现在我们知道,在训练图像分类器时,将使用传递训练,这使您可以在少量图像上训练模型。每组图像的数量必须相等,否则将朝着其中一种类别转移。大约80%的图像用于训练模型,其余20%用于测试。同样,不应重复图像,即在用于训练的图像文件夹中,不应有将进一步用于测试的图像。用于培训的文件夹的名称将用作相应类别的标识符,使用模型时。我的示例使用名称HotDog或NotHotDog。图像名称本身不起作用,可以随意命名。我用序列号指定了它们。

现在我们的数据已经准备好了,我们可以开始训练模型了。要使用Create ML,我们需要Xcode 11或更高版本。我将使用Xcode 11.3.1。要运行创建ML工具,您需要转到Xcode-> Open Developer Tool->创建ML。将出现一个窗口,您可以在其中选择现有的窗口或创建新的项目。选择新文档。接下来,您需要选择一个模板,在本例中,我们将使用图像分类器。为我们的项目命名,单击“下一步”,然后选择要存储项目的位置。将打开一个用于处理模型的工作环境。

图片

如我们所见,这是一个完全独立的项目,您可以在其中创建和训练多个模型。项目的名称(Project)显示在左侧的检查器中,单击该名称将显示有关该项目的信息并允许您对其进行编辑。在下面的“模型源”中,包含了我们项目中使用的所有模型。现在让我们看一下工具主窗口中的“数据输入”部分。

训练数据-您需要在此处添加训练模型的图像。验证数据-您可以在此处添加一组图像来测试模型训练(在我的情况下,我离开了“自动”)。测试数据-在这里您需要添加图像以测试模型训练中未涉及的图像。

在“参数”部分,您可以指定在模型训练期间对单个图像执行的最大迭代次数。在“增强”部分中,您可以选择叠加在图像上的效果。

熟悉了Create ML之后,我们就可以开始训练我们的第一个模型了。我们只需将Training Data文件夹(名称可以是任意名称)拖到Training Data选项卡中。现在单击训练。学习过程开始。

图片

因此,我花了大约27秒钟来训练,模型几乎准备就绪。训练后,您可以评估模型对训练数据集中的图像进行分类的程度。由于模型是在这些图像中训练的,因此可以对它们进行很好的分类。就我而言,该模型识别出训练集中的所有图像和测试集中的97%的图像。测试时间到了。

图片

转到“测试”选项卡。与用于训练模型的数据一样,只需将“测试数据”文件夹拖到“测试数据”窗口中即可。实际上,在开始培训之前,我们可以设置一个包含图像的文件夹进行测试。但是对于过程的线性度,我们将以不同的方式进行。单击测试模型。根据测试结果,该模型处理了98%。

图片

通过输出,您可以验证模型的性能而无需将其添加到项目中。为此,请添加热狗而非热狗的图像,然后检查结果。我添加了沙拉和热狗的图像,在两种情况下,模型都很好。当然,严肃的项目可能需要更多的数据进行培训,更多的迭代等等。但是对于一个测试项目,这就足够了。要保存模型,只需将其从Output传输到所需的文件夹。

图片

现在,我建议尝试将模型集成到测试项目中,可以在这里找到模型已经添加到项目中,但是您可以使用任何其他分类器。这不会破坏应用程序,因为模型是可互换的,并且您可以在项目中使用多个模型。只需将完成的模型转移到项目中即可。

图片

在机器学习模型部分,您可以找到有关模型的信息。可以在“创建ML”工具项目中指定此信息。请注意,我们训练的模型仅占用17 KB。此外,在“模型类”部分中,警告您将创建一个名为MyImageClassifier的Swift类,我强烈建议您不要触摸其中的任何内容,因为这可能会影响应用程序。预测部分描述了输入参数以及我们得到的结果。如果您使用的模型不是您要教的,则可以在“实验”部分中检查模型,只需传输图像即可。

图片

转到ImageClassifierService类,在这里您可以看到如何初始化模型。

private func makeImageClassifierModel() -> VNCoreMLModel? {
  return try? VNCoreMLModel(for: MyImageClassifier().model)
}

很简单吧?接下来,您需要创建,处理和执行分类请求。

private func makeClassifierRequest(for model: VNCoreMLModel, ciImage: CIImage) {
    let request = VNCoreMLRequest(model: model) { [weak self] request, error in
      self?.handleClassifierResults(request.results)
    }
    
    let handler = VNImageRequestHandler(ciImage: ciImage)
    DispatchQueue.global(qos: .userInteractive).async {
      do {
        try handler.perform([request])
      } catch {
        self.onDidUpdateState?(.requestFailed)
      }
    }
  }

它仅用于处理结果。

  private func handleClassifierResults(_ results: [Any]?) {
    guard let results = results as? [VNClassificationObservation],
      let firstResult = results.first else {
      onDidUpdateState?(.requestFailed)
      return
    }
    
    DispatchQueue.main.async { [weak self] in
      let confidence = (firstResult.confidence * 100).rounded()
      let resultModel = ClassifierResultModel(identifier: firstResult.identifier, confidence: Int(confidence))
      self?.onDidUpdateState?(.receiveResult(resultModel: resultModel))
    }
  }

现在我们可以运行应用程序并检查模型的准确性。

图片

我们可以看到,该模型运行良好。现在,让我们尝试向我们的模型显示不是热狗的图像,并查看她如何应对。

图片

可以看到,该模型将汉堡图像定义为“不是热狗”。我建议稍微混淆一下模型,并在热狗服装中添加狗的图像。

图片

在这里,我们训练有素的模型做得很好。

结论


在这篇简短的文章中,我们介绍了创建ML工具。了解了它可以使用的类型以及工具使用的模式。他们还尝试训练他们的模型。创建机器学习模型中最困难的部分是查找和准备要学习的数据。您不能训练模型,但可以使用已经训练的模型。例如,已经有可以使用图像和文本的现成模型。github上有许多自定义模型。
训练模型的图像也很容易找到,例如Google的档案但是,如果您需要为目标明确的任务训练模型,则必须收集图像并创建档案。

All Articles