针对 Android 进行迁移

更新 Gradle 导入

新 SDK 只需要为每个机器学习套件 API 提供一个依赖项。您无需指定 firebase-ml-visionfirebase-ml-natural-language 等常用库。机器学习套件为依赖于 Google Play 服务的库使用 com.google.android.gms 命名空间。

Vision API

捆绑模型会作为应用的一部分提供。您必须下载瘦模型。有些 API 支持捆绑式和精简模式,而其他 API 则仅以其中一种形式提供:

API组合
文字识别x(Beta 版)x
人脸检测xx
条形码扫描xx
图像标签xx
对象检测和跟踪x-

根据下表更新模块(应用级)Gradle 文件(通常是 app/build.gradle)中机器学习套件 Android 库的依赖项:

捆绑模型

API旧工件新工件
条形码扫描 com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.0.2
面部轮廓 com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.5
图像标签 com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0.7
对象检测 com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0.0

薄款

API旧工件新工件
条形码扫描 com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.1.0
人脸检测 com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
文字识别 com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:18.0.2

AutoMLVision Edge

API旧工件新工件
AutoML(无需下载) com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:16.0.0-beta4
包含下载的 AutoML com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:16.0.0-beta4
com.google.mlkit:linkfirebase:17.0.0

Natural Language API

捆绑模型作为应用的一部分提供。所有语言 API 都以捆绑模型的形式提供。以下是新的工件名称:

API旧工件新工件
语言 ID com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.4
智能回复 com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.2

更新类名称

如果您的类出现在此表中,请做出指示的更改:

旧类新课程
com.google.firebase.ml.common.FirebaseMLException 异常的构造函数 com.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.=\"Image com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.=\"BarcodeDetector{/3} com.google.mlkit.vision.barcode.Scode
com.google.firebase.ml.vision.labeler.=\"ImageLabel com.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.=\"BarcodeDetector{/3} com.google.mlkit.vision.barcode.Scode
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel 中的字段 com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel 类 com.google.mlkit.common.model.CustomRemoteModel 类的用法
com.google.firebase.ml.vision.label.{9/}OnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.=\"ImageLabel com.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.{9/}OnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.{9/}ObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

对于其他类,请遵循以下规则:

  • 从类名称中移除 FirebaseVision 前缀。
  • 从类名称中移除以 Firebase 前缀开头的其他前缀。

此外,在软件包名称中,请将 com.google.firebase.ml 前缀替换为 com.google.mlkit

更新方法名称

代码有细微的变化:

  • 检测器/扫描器/标签添加者/翻译器...实例化发生了变化。每个功能现在都有自己的入口点。例如:条形码扫描、TextRecognition、ImageLabeling、Translation...对 Firebase 服务 getInstance() 的调用已替换为对功能入口点的 getClient() 方法的调用。
  • 由于我们引入了其他库来识别中文和韩语等其他脚本,因此移除了 TextRecognizer 的默认实例化。如需将默认选项与拉丁字母文本识别模型搭配使用,请声明对 com.google.android.gms:play-services-mlkit-text-recognition 的依赖项并使用 TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
  • 由于我们为这两种功能引入了自定义模型支持,因此移除了 ImageLabeler 和 ObjectDetector 的默认实例化。例如,如需在 ImageLabeling 中将基本选项与基本模型搭配使用,请声明对 com.google.mlkit:image-labeling 的依赖项并在 Java 中使用 ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
  • 所有手柄(检测器/扫描器/标签添加者/译者...)均可关闭。确保不再使用这些对象时调用 close() 方法。如果要在 Fragment 或 AppCompatActivity 中使用它们,一种简单的方法是对 Fragment 或 AppCompatActivity 调用 LifecycleOwner.getLifecycle(),然后调用 Lifecycle.addObserver
  • 为了保持一致,已将 Vision API 中的 processImage()detectInImage() 重命名为 process()
  • Natural Language API 现在使用“语言标记”(如 BCP 47 标准所定义)而非“语言代码”。
  • 移除了 xxxOptions 类中的 getter 方法。
  • InputImage 类中的 getBitmap() 方法(取代了 FirebaseVisionImage)作为公共接口的一部分不再受支持。请参阅机器学习套件快速入门示例中的 BitmapUtils.java,了解如何从各种输入中转换位图。
  • 移除了 ImageImageMetadata,只需将宽度、高度、旋转角度、格式等图片元数据传递给 InputImages 的构造方法即可。

以下是新旧 Kotlin 方法的一些示例:

旧优惠

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

新建

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add life cycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

以下是新旧 Java 方法的一些示例:

旧优惠

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

新建

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS);
// Optional: add life cycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

API 特定更改

条形码扫描

对于 Barcode Scanning API,现在可以通过两种方式提供模型:

  • 通过 Google Play 服务(也称为“瘦”)(推荐)- 这样可以缩减应用大小,并且应用之间共享模型。不过,首次使用之前,开发者需要确保模型已下载完毕。
  • 使用应用的 APK,也称为“捆绑”应用 - 这会增加应用的大小,但这意味着模型可以立即使用。

这两种实现略有不同,与“精简版”相比,“捆绑”版本有多项改进。如需详细了解这些差异,请参阅 Barcode Scanning API 指南。

人脸检测

对于 Face Detection API,可以通过两种方式交付模型:

  • 通过 Google Play 服务(也称为“瘦”)(推荐)- 这样可以缩减应用大小,并且应用之间共享模型。不过,首次使用之前,开发者需要确保模型已下载完毕。
  • 使用应用的 APK(也称为“捆绑应用”)- 这会增加应用的下载大小,但意味着相应模型可以立即使用。

实现方式是相同的。

翻译

  • TranslateLanguage 现在为其常量使用可读名称(例如 ENGLISH),而不是语言标记 (EN)。它们现在也使用 @StringDef 而不是 @IntDef,并且常量的值就是匹配的 BCP 47 语言标记

  • 请注意,如果您的应用使用“设备空闲”下载条件选项,此选项已被移除,无法再使用。您仍然可以使用“设备充电”选项。如果您需要更复杂的行为,可以在自己的逻辑后面延迟调用 RemoteModelManager.download

AutoML 图片标记

请注意,如果您的应用使用“设备空闲”下载条件选项,则此选项已被移除,无法再使用。您仍然可以使用“设备充电”选项。

如果您需要更复杂的行为,可以在自己的逻辑后面延迟调用 RemoteModelManager.download

对象检测和跟踪

如果您的应用将对象检测与粗分类结合使用,请注意新 SDK 更改了它针对检测到的对象返回分类类别的方式。

分类类别以 DetectedObject.Label 的实例(而不是整数)的形式返回。粗分类器的所有可能类别都包含在 PredefinedCategory 类中。

以下是新旧 Kotlin 代码示例:

旧优惠

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

新建

if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

以下是新旧 Java 代码示例:

旧优惠

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

新建

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

“未知”类别已被移除。当某个对象的分类置信度较低时,我们不会返回任何标签。

移除 Firebase 依赖项(可选)

此步骤仅在满足以下条件时适用:

  • Firebase ML Kit 是您使用的唯一 Firebase 组件。
  • 您只能使用设备端 API。
  • 不使用模型传送。

在这种情况下,您可以在迁移后移除 Firebase 依赖项。 请按照以下步骤操作:

  • 通过删除应用模块(应用级)目录中的 google-services.json 配置文件来移除 Firebase 配置文件。
  • 将模块(应用级)Gradle 文件(通常为 app/build.gradle)中的 Google 服务 Gradle 插件替换为严格版本匹配器插件:

早于

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // …
}

之后

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

android {
  // …
}
  • 将项目(根级)Gradle 文件 (build.gradle) 中的 Google 服务 Gradle 插件类路径替换为严格版本匹配程序插件的相应路径:

早于

buildscript {
  dependencies {
    // ...

    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

之后

buildscript {
  dependencies {
    // ...

    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}

根据 Firebase 支持网站上的说明,在 Firebase 控制台中删除您的 Firebase 应用。

获取帮助

如果您遇到任何问题,请访问我们的社区页面,我们概述了可以与我们联系的渠道。