一、概述
Firebase ML 使您能够无线部署模型。这使您可以保持较小的应用程序大小并仅在需要时下载 ML 模型、试验多个模型或更新您的 ML 模型而无需重新发布整个应用程序。
在此 Codelab 中,您会将使用静态 TFLite 模型的 Android 应用程序转换为使用从 Firebase 动态提供的模型的应用程序。
你会学到什么
- 将 TFLite 模型部署到 Firebase ML 并从您的应用访问它们
- 使用 Firebase Analytics 跟踪用户反馈以衡量模型准确性
- 通过 Firebase Performance 分析模型性能
- 选择通过 Remote Config 加载多个已部署模型中的哪一个
- 通过 Firebase A/B 测试试验不同的模型
你需要什么
- 最新的Android Studio版本。
- 示例代码。
- Android 5.0+ 和 Google Play 服务 9.8 或更高版本的测试设备,或 Google Play 服务 9.8 或更高版本的模拟器
- 如果使用设备,连接电缆。
您将如何使用本教程?
如何评价您构建 Android 应用程序的经验?
2.获取示例代码
从命令行克隆 GitHub 存储库。
$ git clone https://github.com/FirebaseExtended/codelab-digitclassifier-android.git
如果您没有安装 git,您还可以从其 GitHub 页面或单击此链接下载示例项目。
3. 导入入门应用
在 Android Studio 中,选择codelab-digitclassifier-android
目录 ( )从示例代码下载(文件>打开> .../codelab-digitclassifier-android/start)。
您现在应该在 Android Studio 中打开了启动项目。
4. 运行入门应用
现在您已将项目导入到 Android Studio 中,您已准备好首次运行该应用程序。连接您的 Android 设备,然后单击运行( ) 在 Android Studio 工具栏中。
该应用程序应在您的设备上启动。此时,如果您尝试画一个数字,应用程序应该能够识别它。
5.创建Firebase控制台项目
将 Firebase 添加到项目中
- 转到Firebase 控制台。
- 选择添加项目。
- 选择或输入项目名称。
- 按照 Firebase 控制台中的剩余设置步骤,然后单击创建项目(或添加 Firebase,如果您使用的是现有的 Google 项目)。
6.添加火力点
- 在新项目的概览屏幕中,单击 Android 图标以启动设置工作流。
- 输入代码实验室的包名称:
org.tensorflow.lite.examples.digitclassifier
将 google-services.json 文件添加到您的应用
注册包名并选择下一步后,单击下载 google-services.json以获取您的 Firebase Android 配置文件,然后将 google-services.json 文件复制到您项目的app
目录中。下载文件后,您可以跳过控制台中显示的后续步骤(它们已在 build-android-start 项目中为您完成)。
将 google-services 插件添加到您的应用
google-services 插件使用 google-services.json 文件来配置您的应用程序以使用 Firebase。将以下行添加到项目app
程序目录中 build.gradle.kts 文件顶部的plugins
块中:
应用程序/build.gradle.kts
id("com.google.gms.google-services")
然后将以下行添加到项目中 build.gradle.kts 文件的plugins
块中:
项目/build.gradle.kts
id("com.google.gms.google-services") version "4.3.15" apply false
将项目与 gradle 文件同步
为确保您的应用程序可以使用所有依赖项,此时您应该将项目与 gradle 文件同步。从 Android Studio 工具栏中选择文件 > 将项目与 Gradle 文件同步。
7. 使用 Firebase 运行应用
现在您已经使用 JSON 文件配置了google-services
插件,您可以使用 Firebase 运行应用程序了。连接您的 Android 设备,然后单击运行( ) 在 Android Studio 工具栏中。
该应用程序应在您的设备上启动。此时,您的应用仍应成功构建。
8. 将模型部署到 Firebase ML
将模型部署到 Firebase ML 非常有用,主要有两个原因:
- 我们可以保持应用程序安装较小,只在需要时下载模型
- 该模型可以定期更新,并且具有与整个应用程序不同的发布周期
在我们用从 Firebase 动态下载的模型替换我们应用程序中的静态模型之前,我们需要将它部署到 Firebase ML。该模型可以通过控制台部署,也可以使用 Firebase Admin SDK 以编程方式部署。在此步骤中,我们将通过控制台进行部署。
为简单起见,我们将使用应用程序中已有的 TensorFlow Lite 模型。首先,打开 Firebase 控制台并单击左侧导航面板中的机器学习。如果您是第一次打开,请点击“开始”。然后导航到“自定义”并单击“添加自定义模型”按钮。
出现提示时,为模型指定一个描述性名称,例如mnist_v1
,然后从start/app/src/main/assets/mnist.tflite
下的 Codelab 项目目录上传文件。然后就可以从Android工程中删除这个TF Lite模型文件了。
9. 从 Firebase ML 下载模型
选择何时将远程模型从 Firebase 下载到您的应用程序可能会很棘手,因为 TFLite 模型可能会变得相对较大。理想情况下,我们希望避免在应用程序启动时立即加载模型,因为如果我们的模型仅用于一个功能而用户从未使用该功能,我们将无缘无故地下载大量数据。我们还可以设置下载选项,例如仅在连接到 wifi 时获取模型。如果您想确保模型即使在没有网络连接的情况下也可用,重要的是在没有应用程序的情况下将其捆绑作为备份。
为了简单起见,我们将删除默认的捆绑模型,并在应用启动时始终从 Firebase 下载模型。这样,在运行数字识别时,您可以确保推理正在使用 Firebase 提供的模型运行。
在 app/build.gradle.kts 文件中,添加 Firebase 机器学习依赖项
应用程序/build.gradle.kts
implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")
然后添加逻辑以从 Firebase 下载模型。
我们将用downloadModel("mnist_v1")
替换digitClassifier.initialize(loadModelFile())
并实现这个方法。
主活动.kt
private fun downloadModel(modelName: String): Task<CustomModel> {
val conditions = CustomModelDownloadConditions.Builder()
.requireWifi()
.build()
return FirebaseModelDownloader.getInstance()
.getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
.addOnCompleteListener {
val model = it.result
if (model == null) {
showToast("Failed to get model file.")
} else {
showToast("Downloaded remote model: $modelName")
digitClassifier.initialize(model)
}
}
.addOnFailureListener {
showToast("Model download failed for $modelName, please check your connection.")
}
}
重新运行您的应用程序并在数字分类器中绘制一个数字。下载完成后,您应该会看到一条表明已下载远程模型的 Toast 消息和一条表明正在使用您的新模型的日志。
10.跟踪用户反馈和转换以衡量模型准确性
Google Analytics for Firebase 为您提供了一种方式,让您了解用户在您的应用程序中移动的方式、他们成功的地方以及他们被卡住和回头的地方。它还可用于了解应用程序中最常用的部分。
我们将通过跟踪用户对模型预测的反馈来衡量模型的准确性。如果用户点击“是”,则表示预测准确。
我们可以记录一个 Analytics 事件来跟踪我们模型的准确性。首先,我们必须将 Analytics 添加到依赖项中,然后才能在项目中使用它:
添加 Firebase Analytics 依赖项
应用程序/build.gradle.kts
implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")
记录事件
然后在onCreate
函数中,我们将设置 onclick 侦听器以将correct_inference
事件记录到 Firebase。
MainActivity.kt (onCreate)
// Setup YES button
yesButton?.setOnClickListener {
Firebase.analytics.logEvent("correct_inference", null)
}
再次运行应用程序并绘制一个数字。按几次“是”按钮以发送推断准确的反馈。
调试分析
通常,您的应用程序记录的事件会在大约一小时的时间内集中在一起并一起上传。这种方法可以节省最终用户设备的电池电量并减少网络数据使用量。但是,为了验证您的分析实施(以及为了在 DebugView 报告中查看您的分析),您可以在您的开发设备上启用调试模式,以便以最小的延迟上传事件。
要在 Android 设备上启用 Analytics 调试模式,请执行以下命令:
adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier
再次运行应用程序并绘制一个数字。按几次“是”按钮以发送推断准确的反馈。现在,您可以通过 Firebase 控制台中的调试视图近乎实时地查看日志事件。单击左侧导航栏中的 Analytics > DebugView。
11.分析模型的性能
Firebase Performance Monitoring 是一项服务,可帮助您深入了解 iOS、Android 和 Web 应用程序的性能特征。
您使用性能监控 SDK 从您的应用程序收集性能数据,然后在 Firebase 控制台中查看和分析该数据。性能监控可帮助您了解可以在何处以及何时改进应用程序的性能,以便您可以使用该信息来修复性能问题。
在这里,我们围绕推理和下载添加性能跟踪
这很重要,因为深度学习中使用的较大模型有可能更准确,但它们也可能需要更长的时间才能返回响应。在我们的实验中,我们试图在准确性和速度之间找到适当的平衡。
添加 Firebase 性能依赖项
项目/build.gradle.kts
plugins {
// ...
// Add the dependency for the Performance Monitoring plugin
id("com.google.firebase.firebase-perf") version "1.4.2" apply false
}
应用程序/build.gradle.kts
plugins {
// ...
// Add the Performance Monitoring plugin
id("com.google.firebase.firebase-perf")
}
// ...
dependencies {
// ...
// Add the dependency for the Performance Monitoring library
implementation("com.google.firebase:firebase-perf")
}
添加自定义跟踪
在setupDigitClassifier()
函数中创建一个新的 downloadTrace,并在下载模型之前启动它。然后添加一个 onsuccess 侦听器来停止跟踪。
在classifyDrawing()
函数中创建一个新的 classifyTrace,并在分类之前启动它。然后在 onsuccess 侦听器中停止跟踪。
主活动.kt
class MainActivity : AppCompatActivity() {
// ...
private val firebasePerformance = FirebasePerformance.getInstance()
// ...
private fun setupDigitClassifier() {
// Add these lines to create and start the trace
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel("mnist_v1")
// Add these lines to stop the trace on success
.addOnSuccessListener {
downloadTrace.stop()
}
}
// ...
private fun classifyDrawing() {
val bitmap = drawView?.getBitmap()
if ((bitmap != null) && (digitClassifier.isInitialized)) {
// Add these lines to create and start the trace
val classifyTrace = firebasePerformance.newTrace("classify")
classifyTrace.start()
digitClassifier
.classifyAsync(bitmap)
.addOnSuccessListener { resultText ->
// Add this line to stop the trace on success
classifyTrace.stop()
predictedTextView?.text = resultText
}
.addOnFailureListener { e ->
predictedTextView?.text = getString(
R.string.tfe_dc_classification_error_message,
e.localizedMessage
)
Log.e(TAG, "Error classifying drawing.", e)
}
}
}
查看性能事件的日志消息
- 通过将
<meta-data>
元素添加到应用程序的AndroidManifest.xml
文件中,在构建时为性能监控启用调试日志记录,如下所示:
AndroidManifest.xml
<application>
<meta-data
android:name="firebase_performance_logcat_enabled"
android:value="true" />
</application>
- 检查您的日志消息是否有任何错误消息。
- 性能监控使用
FirebasePerformance
标记其日志消息。使用logcat过滤,可以具体查看duration trace和HTTP/S网络请求日志,运行如下命令:
adb logcat -s FirebasePerformance
- 检查以下类型的日志,这些日志表明性能监控正在记录性能事件:
-
Logging TraceMetric
-
Logging NetworkRequestMetric
12. 将第二个模型部署到 Firebase ML
当提出模型的新版本时,例如具有更好模型架构的模型或在更大或更新的数据集上训练的模型,我们可能会想用新版本替换当前模型。但是,在测试中表现良好的模型在生产中不一定表现得同样好。因此,让我们在生产中进行 A/B 测试,以比较我们的原始模型和新模型。
启用 Firebase 模型管理 API
在此步骤中,我们将启用 Firebase 模型管理 API,以使用 Python 代码部署新版本的 TensorFlow Lite 模型。
创建存储桶来存储您的 ML 模型
在您的 Firebase 控制台中,转到存储并单击开始。
按照对话设置您的存储桶。
启用 Firebase ML API
转到 Google Cloud Console 上的Firebase ML API 页面,然后单击启用。
询问时选择数字分类器应用程序。
训练新模型并发布到 Firebase ML
现在我们将使用更大的数据集训练模型的新版本,然后我们将使用 Firebase Admin SDK 直接从训练笔记本以编程方式部署它。
下载服务帐户的私钥
在使用 Firebase Admin SDK 之前,我们需要创建一个服务帐户。单击此链接打开 Firebase 控制台的服务帐户面板,然后单击按钮为 Firebase Admin SDK 创建一个新的服务帐户。出现提示时,单击“生成新私钥”按钮。我们将使用服务帐户密钥来验证来自 colab notebook 的请求。
现在我们可以训练和部署新模型了。
- 打开这个colab notebook ,在你自己的 Drive 下复制一份。
- 通过单击左侧的播放按钮运行第一个单元格“Train an improved TensorFlow Lite model”。这将训练一个新模型,可能需要一些时间。
- 运行第二个单元将创建一个文件上传提示。上传您在创建服务帐户时从 Firebase 控制台下载的 json 文件。
- 运行最后两个单元格。
运行 colab notebook 后,您应该会在 Firebase 控制台中看到第二个模型。确保第二个模型命名为mnist_v2
。
13.通过远程配置选择模型
现在我们有两个独立的模型,我们将添加一个参数来选择在运行时下载哪个模型。客户端收到的参数值将决定客户端下载哪个模型。
在 Firebase 控制台中添加配置规则
首先,打开 Firebase 控制台并单击左侧导航菜单中的远程配置按钮。然后,单击“添加参数”按钮。
将新参数命名为model_name
并为其指定默认值"mnist_v1"
。通过将模型名称放在远程配置参数中,我们可以测试多个模型,而无需为每个要测试的模型添加新参数。单击发布更改以应用更新。
添加 Firebase RemoteConfig 依赖项
应用程序/build.gradle.kts
implementation("com.google.firebase:firebase-config-ktx")
配置 Firebase 远程配置
主活动.kt
private fun configureRemoteConfig() {
remoteConfig = Firebase.remoteConfig
val configSettings = remoteConfigSettings {
minimumFetchIntervalInSeconds = 3600
}
remoteConfig.setConfigSettingsAsync(configSettings)
}
请求和使用配置
为配置创建一个获取请求并添加一个完成处理程序来获取和使用配置参数。
主活动.kt
private fun setupDigitClassifier() {
configureRemoteConfig()
remoteConfig.fetchAndActivate()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val modelName = remoteConfig.getString("model_name")
val downloadTrace = firebasePerformance.newTrace("download_model")
downloadTrace.start()
downloadModel(modelName)
.addOnSuccessListener {
downloadTrace.stop()
}
} else {
showToast("Failed to fetch model name.")
}
}
}
测试远程配置
- 点击
运行按钮。
- 检查您是否看到已下载 mnist_v1 模型的 Toast 消息。
- 返回 Firebase 控制台,将默认值更改为 mnist_v2 并选择发布更改以应用更新。
- 重启应用,查看Toast提示本次下载了mnist_v2模型。
14. A/B 测试模型有效性
Firebase A/B 测试可让您轻松运行、分析和扩展产品和营销实验,从而帮助您优化应用体验。最后,我们可以使用 Firebase 的内置 A/B 测试行为来查看我们的两个模型中哪个模型表现更好。
转到 Firebase 控制台中的 Analytics -> Events。如果显示了correct_inference
事件,将其标记为“Conversion event”,如果没有,您可以转到 Analytics -> Conversion Events 并单击“Create a New Conversion Event”并放下correct_inference.
现在转到 Firebase 控制台中的“远程配置”,从我们刚刚添加的“model_name”参数的更多选项菜单中选择“A/B 测试”按钮。
在随后的菜单中,接受默认名称。
在下拉列表中选择您的应用,并将定位条件更改为 50% 的活跃用户。
如果您之前能够将correct_inference
事件设置为转化,请将此事件用作要跟踪的主要指标。否则,如果您不想等待事件显示在 Analytics 中,您可以manually
添加correct_inference
。
最后,在变体屏幕上,将您的控制组变体设置为使用mnist_v1
并将您的变体 A 组设置为使用mnist_v2
。
单击右下角的审阅按钮。
恭喜,您已成功为两个独立的模型创建 A/B 测试! A/B 测试目前处于草稿状态,可以随时点击“开始实验”按钮开始。
要详细了解 A/B 测试,请查看A/B 测试文档。
15. 恭喜!
在此 Codelab 中,您学习了如何将应用中静态捆绑的 tflite 资产替换为来自 Firebase 的动态加载的 TFLite 模型。要了解有关 TFLite 和 Firebase 的更多信息,请查看其他 TFLite 示例和 Firebase 入门指南。
我们涵盖的内容
- TensorFlow 精简版
- 火力地堡机器学习
- Firebase 分析
- Firebase 性能监控
- Firebase 远程配置
- Firebase A/B 测试
下一步
- 在您的应用中实施 Firebase ML 部署。