将自定义模型集成到您的应用中

1. 准备工作

在本系列的第一个 Codelab 中,您创建了一个非常简单的应用,该应用使用图片标签来解析图片内容。您向它传递了一张雏菊的图片,您知道它看到了花瓣或天空之类的东西。然后,在第二个 Codelab 中,您改用 Python 来训练一个新的自定义模型,该模型可识别五种不同花卉。

在此 Codelab 中,您将使用在第一个实验中构建的模型来更新该应用!

您可以通过克隆代码库获取此 Codelab 的完整源代码。您会看到 Android 和 iOS 的子目录。如果您想按照示例操作,上一个 Codelab 的代码可作为 ImageClassifierStep1 提供。此 Codelab 完成后的代码作为 ImageClassifierStep2 提供。

前提条件

  • 您应该已经完成此学习路线中的前两个 Codelab

您将构建和学习的内容

  • 将在之前的实验中训练的自定义模型集成到 Android 或 iOS 应用中

所需条件

  • Android Studio,可在 developer.android.com/studio 获取,了解本实验的 Android 部分
  • Xcode,可在 Apple App Store 中获取,适用于本实验的 iOS 部分

2. 获取入门应用

首先,您需要通过“在 Android 或 iOS 上构建首个计算机视觉应用”Codelab 中的应用。如果您已完成本实验,它将被命名为 ImageClassifierStep1。如果您不想完成本实验,可以从代码库克隆完成的版本。

在 Android Studio 中打开它,执行任何所需的更新,并在准备就绪后运行应用以确保它可以正常运行。您应该会看到与以下类似的内容:

f3703d45d1332d1d.png

这是一款原汁原味的应用,但它只需少量代码即可展示一些非常强大的功能。但是,如果您希望系统将此花朵识别为雏菊,而不仅仅是一朵花,则必须更新应用以使用“为图片分类器创建自定义模型”Codelab 中的自定义模型。

3. 更新 build.gradle 以使用自定义机器学习套件模型

  1. 使用 Android Studio 找到应用级 build.gradle 文件。最简单的方法是在 Project Explorer 中执行此操作。确保已选择顶部的 Android,然后您会在底部看到 Gradle Scripts 文件夹。
  2. 打开模块所在的应用,应用名称后跟“.app”如下所示 - (Module: ImageClassifierStep1.app):

8fe1d04b40610047

  1. 在文件底部,找到 dependencies 设置。在这里,您应该会看到以下行:
implementation 'com.google.mlkit:image-labeling:17.0.1'

版本号可能不同。请务必从机器学习套件网站(网址为 https://developers.google.com/ml-kit/vision/image-labeling/android)中查找最新版本号

  1. 将其替换为自定义图片标签库引用。您可以在以下网址找到此版本的版本号:https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. 此外,您还将添加在上一个实验中创建的 .tflite 模型。您不希望在 Android Studio 编译应用时压缩此模型,因此请确保在同一 build.gradle 文件的 Android 部分中使用此设置:
aaptOptions{
    noCompress "tflite"
}

确保它不在任何其他设置中。它应直接嵌套在 android 标记下。示例如下:

62d546bff11d2a50

4. 添加 TFLite 模型

在上一个 Codelab 中,您创建了自定义模型,并将其下载为 model.tflite。

在项目中,找到当前包含 flower1.jpgassets 文件夹。按如下方式将模型复制到该文件夹:

  1. 右键点击 Android Studio 中的 Assets 文件夹。在随即打开的菜单中,选择在“访达”中显示。(Windows 中为“在资源管理器中显示”,在 Linux 中为“在文件中显示”。)

db30b47e419a326b.png

  1. 系统会将您转到文件系统中的目录。将 model.tflite 文件与 flower1.jpg. 一起复制到该目录中

36de0c51bec1c19e

Android Studio 将更新,以在您的资源文件夹中显示这两个文件:

e9f4e9f394d9b357.png

现在,您可以更新代码了。

5. 更新自定义模型的代码

第一步是添加一些代码以加载自定义模型。

  1. MainActivity 文件中,将以下代码添加到 onCreate 中,位于 setContentView(R.layout.activity_main) 行的正下方。

这将使用 LocalModel,根据 model.tflite 资源进行构建。如果 Android Studio 通过将“LocalModel”进行投诉红色,按 ALT + Enter 导入库。系统应该会为您将导入操作添加到 com.google.mlkit.common.model.LocalModel。

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

以前,在 btn.setOnClickListener 处理程序中,您使用的是默认模型。它是使用以下代码设置的:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

您需要使用自定义模型替换该模型。

  1. 设置自定义选项对象:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

这会将默认选项替换为自定义集。置信度阈值为要返回的预测结果设置了质量标准。回顾此 Codelab 顶部的示例,其中图片为雏菊,您共有 4 个预测结果,每个预测结果旁边都有一个值,例如“Sky”(天空)是 0.7632

您可以使用高置信度阈值来有效滤除质量较低的结果。例如,如果将此值设为 0.9,系统将不会返回任何优先级低于该值的标签。setMaxResultCount() 在具有许多类的模型中非常有用,但由于此模型只有 5 个,因此您只需将其保留为 5 个即可。

现在,您已经有了标签添加者的选项,接下来可以将标签添加者的实例化更改为:

val labeler = ImageLabeling.getClient(options)

代码的其余部分将不经修改直接运行。快来试试吧!

dd40c36c4edbb33.png

在这里,您可以看到这朵花现在被识别为一朵雏菊,概率为 0 .959!

假设您添加了第二张花卉图片,然后重新运行了该图片:

8556a5fbea487842

它将其标识为玫瑰。

您可能会好奇,为什么会有“玫瑰”而不是“玫瑰”呢。这是因为在数据集中,标签由文件夹名称指定,遗憾的是,这些文件夹名称有点不一致,有时使用单数(如“daisy”),有时使用复数形式(如“玫瑰”)。不要将它与尝试计算图片中项数的模型混淆,它比这更原始,并且只能识别花卉类型!

6. 获取 iOS Start 应用

  1. 首先,您需要第一个 Codelab 中的应用。如果您已完成本实验,它将被命名为 ImageClassifierStep1。如果您不想完成本实验,可以从代码库克隆完成的版本。请注意,代码库中不存在 pod 和 .xcworkspace,因此在继续下一步之前,请务必运行“pod install”从与 .xcproject 相同的目录中。
  2. 在 Xcode 中打开 ImageClassifierStep1.xcworkspace。请注意,您应该使用 .xcworkspace 而不是 .xcproject,因为您使用 Pod 捆绑了机器学习套件,并且工作区将加载这些套件。

在本实验的剩余部分,我将在 iPhone 模拟器中运行该应用,该模拟器应支持此 Codelab 中的构建目标。如果您想使用自己的设备,可能需要在项目设置中更改构建目标,使其与您的 iOS 版本相匹配。

运行应用,您会看到如下内容:

9e151ed18f99fb98

请注意一些非常宽泛的分类:花瓣、花朵、天空。您在上一个 Codelab 中创建的模型经过训练,能够检测 5 种花卉,包括此花:雏菊。

在此 Codelab 的其余部分,您将了解使用自定义模型升级应用需要执行哪些操作。

7. 使用自定义机器学习套件 Image Labeler Pod

第一个应用使用 Pod 文件获取基础机器学习套件 Image Labeler 库和模型。您需要对其进行更新,才能使用自定义图片标签库。

  1. 在项目目录中找到名为 podfile 的文件。打开它,您会看到如下内容:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. 将 pod 声明从 ImageLabeling 更改为 ImageLabelingCustom,如下所示:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. 完成后,使用终端导航到包含 podfile 的目录(以及 .xcworkspace)并运行 pod install

bb5d78eb7c7ab975.png

片刻之后,系统会移除 MLKitImageLabeling 库,并添加自定义库。现在,您可以打开 .xcworkspace 以修改代码。

8. 将 TFLite 模型添加到 Xcode

在上一个 Codelab 中,您创建了一个自定义模型,并将其下载为 model.tflite。如果您没有现成的代码,请返回并运行该 Codelab,或者浏览此处的 Colab 代码。如果您无权访问 Google Colab,可以点击链接获取笔记本

  1. 在 Xcode 中打开工作区后,将 model.tflite 拖动到您的项目中。它应该与其他文件(例如 ViewController.swiftMain.storyboard)位于同一文件夹中。
  2. 系统会弹出一个对话框,其中包含用于添加文件的选项。确保选中添加到目标,否则在部署到设备时,模型不会与应用捆绑在一起。

请注意条目将包含 ImageClassifierStep1(如果您从该示例开始,并继续完成本实验的分步操作)或 ImageClassifierStep2(如下所示),如果您跳转到完成的代码。

5b6a7f40c73f0f1f

这将确保您可以加载模型。您将在下一步中看到具体操作方法。

9. 针对自定义模型更新代码

  1. 打开您的 ViewController.swift 文件。您可能会在“import MLKitImageLabeling”。这是因为您在更新 pod 文件时移除了通用图片标签库。您可以随意删除此行,并用以下内容进行更新:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

您可能很容易快速读完这些内容,并认为它们在重复相同的代码!但这是“常见”和“自定义”到最后!

  1. 接下来,您将加载在上一步中添加的自定义模型。找到 getLabels() 函数。在 visionImage.orientation = image.imageOrientation 行下方,添加以下代码行:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. 查找用于指定通用 ImageLabeler 选项的代码。这些库已被移除,因此您可能会出错:
let options = ImageLabelerOptions()

将其替换为以下代码,以使用 CustomImageLabelerOptions 并指定本地模型:

let options = CustomImageLabelerOptions(localModel: localModel)

...这样就大功告成了!立即尝试运行您的应用!当您尝试对图片进行分类时,分类应该更加准确,并告诉您您正在看着一朵概率较高的雏菊!

238cd21748a97cf4

假设您添加了第二张花卉图片,然后重新运行了该图片:

75f3970a6b509bfe

应用成功检测到此图片与标签“玫瑰”匹配!

10. 恭喜!

现在,您已经构建了一个使用通用模型来识别图片内容的应用,现在已经创建自己的机器学习模型来识别特定事物(例如花卉),然后更新应用以使用自定义模型。

由此产生的应用当然非常有限,因为它依赖于捆绑的图片资源。不过,机器学习部分运行良好。例如,您可以使用 AndroidX Camera 从实时 Feed 中获取画面并对其进行分类,看看手机能识别哪些花!

在这里,无限的可能性是无穷无尽的 - 如果您有除花卉之外的其他事物的数据,那么您已经具备构建使用计算机视觉识别这些应用所需的基础。以上只是迈向更广大世界的最初几步,希望您享受到了其中的乐趣!