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 中打开该文件,执行所需的任何更新,当它准备就绪后,运行应用以确保它正常运行。您应会看到类似下图的界面:
这是一个非常初级的应用,但只需少量代码,即可显示一些非常强大的功能。但是,如果您希望将此花识别为雏菊(而不仅仅是花朵),则必须更新应用以通过为图片分类器创建自定义模型 Codelab 使用您的自定义模型。
3.更新 build.gradle 以使用自定义机器学习套件模型
- 使用 Android Studio 查找应用级
build.gradle
文件。最简单的方法是在 Project Explorer 中执行此操作。 确保在顶部选择了 Android,您将在底部看到 Gradle Scripts 文件夹。 - 打开适用于 Module 的应用,其中您的应用名称后跟“app.”,如下所示(模块:ImageClassifierStep1.app):
- 在文件底部,找到 dependencies 设置。其中应该会显示以下行:
implementation 'com.google.mlkit:image-labeling:17.0.1'
版本号可能会有所不同。您可以随时在机器学习套件网站中找到最新版本号:https://developers.google.com/ml-kit/vision/image-labeling/android
- 将其替换为自定义图片标签库参考。此版本的版本号位于:https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- 此外,您将添加在上个实验中创建的 .tflite 模型。您不希望在 Android Studio 编译您的应用时压缩此模型,因此请确保在同一
build.gradle
文件的 Android 部分中使用此设置:
aaptOptions{
noCompress "tflite"
}
请确保不在任何其他设置之下。它应直接嵌套在 android
标记下。示例如下:
4.添加 TFLite 模型
在上一个 Codelab 中,您创建了自定义模型并将其下载为 model.tflite。
在项目中,找到当前包含 flower1.jpg
的 assets 文件夹。按如下所示将模型复制到该文件夹:
- 右键点击 Android Studio 中的 Assets 文件夹。在打开的菜单中,选择在 Finder 中显示。(“在 Windows 中显示在资源管理器中”,在 Linux 中处于“在文件中显示”)。
- 系统会将您转到文件系统上的目录。将
model.tflite
文件与flower1.jpg.
一起复制到该目录中
Android Studio 将更新并同时在资源文件夹中显示这两个文件:
您现在可以更新代码了。
5. 更新自定义模型的代码
第一步是添加一些代码以加载自定义模型。
- 在
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)
您需要将其替换为使用自定义模型。
- 设置自定义选项对象:
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)
其余代码无需修改即可运行。你也试试吧!
在这里,您可以看到这朵花现在被识别为概率为 0 .959 的菊花!
假设您添加了第二张花卉图片,然后使用以下代码重新开始运行:
它识别的是玫瑰。
您可能想知道为什么显示“玫瑰”而不只是“玫瑰”。这是因为,在数据集中,标签由文件夹名称表示,遗憾的是,这些文件夹名称有些不一致,有时使用单数(例如“雏菊”),有时使用复数(如“玫瑰”)。请不要将此模型与试图计算图片中项目的模型混淆 - 它比原始数据要原始得多,只能识别花类型!
6.获取 iOS Start App
- 首先,您需要第一个 Codelab 中的应用。通过本实验后,系统将使用 ImageClassifierStep1。如果您不想完成本实验,可以从代码库克隆已完成的版本。请注意,代码库中没有 pod 和 .xcworkspace,因此在继续执行下一步之前,请务必从 .xcproject 所在目录运行“pod install”。
- 在 Xcode 中打开
ImageClassifierStep1.xcworkspace
。请注意,您应该使用 .xcworkspace 而不是 .xcproject,因为您已使用 Pod 捆绑机器学习套件,而且工作区会加载它们。
在本实验的其余部分,我将在 iPhone 模拟器中运行应用,该应用应该支持此 Codelab 中的构建目标。如果您想使用自己的设备,则可能需要更改项目设置中的构建目标,以匹配您的 iOS 版本。
运行时,您会看到如下内容:
请注意非常宽泛的分类:花瓣、花朵、天空。我们在上一个 Codelab 中创建的模型经过训练,可以检测 5 种花卉,其中包括这朵花。
在此 Codelab 的其余部分,您将了解使用自定义模型升级应用需要完成的操作。
7. 使用自定义机器学习套件图片标记器 Pod
第一个应用使用 Pod 文件来获取基本机器学习套件 Image Labeler 库和模型。您需要进行更新,才能使用自定义图片标签库。
- 在项目目录中找到名为
podfile
的文件。打开该文件后,您会看到如下内容:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- 将 pod 声明从
ImageLabeling
更改为ImageLabelingCustom
,如下所示:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- 完成后,请使用终端导航到包含 podfile 的目录(以及 .xcworkspace),并运行
pod install
。
片刻之后,MLKitImageLabeling 库将被移除,并且添加自定义库。您现在可以打开 .xcworkspace 来编辑代码了。
8. 将 TFLite 模型添加到 Xcode
在上一个 Codelab 中,您创建了一个自定义模型,并将其下载为 model.tflite。如果您没有现成的 Codelab,请返回并运行该 Codelab,或者点击此处浏览 Colab 代码。如果您无法访问 Google Colab,可通过此链接获取笔记本
- 在 Xcode 中打开工作区后,将 model.tflite 拖动到您的项目。此文件应与
ViewController.swift
或Main.storyboard
等其他文件位于同一文件夹中。 - 系统会弹出一个对话框,其中包含用于添加文件的选项。务必选择添加到目标,否则该模型部署到设备上时将不会与应用捆绑。
请注意,如果添加到此目标,“Add to Targets”条目将会具有 ImageClassifierStep1,如果您跳至完成的代码,则继续完成本实验或 ImageClassifierStep2(如下所示)。
这将确保您可以加载模型。下一步将介绍如何执行此操作。
9. 更新自定义模型的代码
- 打开
ViewController.swift
文件。您可能会在文件顶部的“import MLKitImageLabeling”中看到错误。这是因为您在更新 pod 文件时移除了通用图片标签库。您可以随意删除此行,并使用以下方式进行更新:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
快速读取这些代码并认为它们重复相同的代码可能很容易!但最后是“常见”和“自定义”!
- 接下来,您将加载在上一步中添加的自定义模型。找到
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!)
- 找到用于指定通用 ImageLabeler 相关选项的代码。您可能遇到了错误,因为这些库已被移除:
let options = ImageLabelerOptions()
将其替换为以下代码,以便使用 CustomImageLabelerOptions
,后者指定本地模型:
let options = CustomImageLabelerOptions(localModel: localModel)
...就这么简单!现在就试试运行应用吧!当你尝试对图片进行分类时,它应该更加准确,并告知你在查看菊花的图片。
假设您添加了第二张花卉图片,然后使用以下代码重新开始运行:
该应用成功检测到此图片与“玫瑰”标签匹配!
10. 恭喜!
现在,您已构建了一个使用通用模型识别图片内容的应用,创建了自己的机器学习模型来识别具体事物(例如花卉),然后更新应用以使用自定义模型。
当然,生成的应用会非常有限,因为它依赖于捆绑式图片资源。不过,机器学习部分效果不错。例如,您可以使用 AndroidX 相机从实时 Feed 获取帧并对其进行分类,以查看手机可识别的花卉!
在这里,无限可能性无限,如果您有自己的除花卉之外的数据,为您构建使用计算机视觉来识别它们所需的应用奠定了基础。这些只是通往更广阔世界的第一步,希望您喜欢浏览这些内容!