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

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。如果您不想完成此实验,可以从 repo 中克隆完成的版本

在 Android Studio 中打开该应用,根据需要进行更新,并在准备就绪后运行该应用,以确保其正常运行。您应该会看到与以下类似的内容:

f3703d45d1332d1d.png

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

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

  1. 使用 Android Studio 找到应用级 build.gradle 文件。最简单的方法是在项目浏览器中执行此操作。确保顶部选择了 Android,然后您会在底部看到 Gradle Scripts 文件夹。
  2. 打开适用于模块的文件,该文件包含您的应用名称,后跟“.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 将更新,以显示 assets 文件夹中的这两个文件:

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 个预测结果,每个结果旁边都有一个值,例如“天空”的值为 0.7632。

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

现在,您已获得标签器选项,可以将标签器的实例化更改为:

val labeler = ImageLabeling.getClient(options)

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

dd40c36c4edbb33.png

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

假设您添加了第二张鲜花图片,并使用该图片重新运行了命令:

8556a5fbea487842.png

它会将其识别为玫瑰。

您可能想知道为什么是“玫瑰花”而不是“玫瑰”。这是因为在数据集中,标签由文件夹名称给出,但遗憾的是,这些文件夹名称不太一致,有时使用单数(例如“daisy”),有时使用复数(例如“roses”)。请勿将此模型与尝试统计图片中物品数量的模型混淆,此模型比后者原始得多,只能识别花卉类型!

6. 获取 iOS 初始应用

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

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

运行该代码,您会看到如下内容:

9e151ed18f99fb98.png

请注意,这些分类非常笼统,例如“花瓣”“花”“天空”。您在上一个 Codelab 中创建的模型经过训练,可以检测 5 种花卉,包括这种雏菊。

在本 Codelab 的剩余部分,您将了解如何使用自定义模型升级应用。

7. 使用自定义机器学习套件图片标签添加器 Pod

第一个应用使用 pod 文件来获取基本的机器学习套件图片标记器库和模型。您需要更新该代码才能使用自定义图片标签库。

  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. 系统会弹出一个对话框,其中包含用于添加文件的选项。确保已选择 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 Camera 从实时 Feed 中拍摄帧,并对其进行分类,以查看手机识别出了哪些花!

从这里开始,您可以实现无限可能。如果您有花卉以外的其他数据,那么您已经具备了使用计算机视觉技术构建识别这些数据的应用所需的基础知识。这些只是迈向更广阔世界的第一步,希望您喜欢这些练习!