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

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. 打开适用于 Module 的应用,其中您的应用名称后跟“app.”,如下所示(模块:ImageClassifierStep1.app):

8fe1d04b40610047.png

  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.png

4.添加 TFLite 模型

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

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

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

db30b47e419a326b.png

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

36de0c51bec1c19e.png

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”为 .7632。

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

现在,您可以为标签添加者创建选项,将标签添加者的实例化设置更改为:

val labeler = ImageLabeling.getClient(options)

其余代码无需修改即可运行。你也试试吧!

dd40c36c4edbb33.png

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

假设您添加了第二张花卉图片,然后使用以下代码重新开始运行:

8556a5fbea487842.png

它识别的是玫瑰。

您可能想知道为什么显示“玫瑰”而不只是“玫瑰”。这是因为,在数据集中,标签由文件夹名称表示,遗憾的是,这些文件夹名称有些不一致,有时使用单数(例如“雏菊”),有时使用复数(如“玫瑰”)。请不要将此模型与试图计算图片中项目的模型混淆 - 它比原始数据要原始得多,只能识别花类型!

6.获取 iOS Start App

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

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

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

9e151ed18f99fb98.png

请注意非常宽泛的分类:花瓣、花朵、天空。我们在上一个 Codelab 中创建的模型经过训练,可以检测 5 种花卉,其中包括这朵花。

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

7. 使用自定义机器学习套件图片标记器 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,请返回并运行该 Codelab,或者点击此处浏览 Colab 代码。如果您无法访问 Google Colab,可通过此链接获取笔记本

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

请注意,如果添加到此目标,“Add to Targets”条目将会具有 ImageClassifierStep1,如果您跳至完成的代码,则继续完成本实验或 ImageClassifierStep2(如下所示)。

5b6a7f40c73f0f1f.png

这将确保您可以加载模型。下一步将介绍如何执行此操作。

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.png

假设您添加了第二张花卉图片,然后使用以下代码重新开始运行:

75f3970a6b509bfe.png

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

10. 恭喜!

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

当然,生成的应用会非常有限,因为它依赖于捆绑式图片资源。不过,机器学习部分效果不错。例如,您可以使用 AndroidX 相机从实时 Feed 获取帧并对其进行分类,以查看手机可识别的花卉!

在这里,无限可能性无限,如果您有自己的除花卉之外的数据,为您构建使用计算机视觉来识别它们所需的应用奠定了基础。这些只是通往更广阔世界的第一步,希望您喜欢浏览这些内容!