转到控制台

在 Android 上使用机器学习套件检测标签

您可以使用机器学习套件来为图片中识别出的对象添加标签。

开始之前

  1. 设置一个 Firebase 项目:
    1. 如果您还没有 Firebase 项目,请在 Firebase 控制台中创建一个。如果您已经有与自己的移动应用相关联的现有 Google 项目,请点击导入 Google 项目。如果没有,请点击添加项目
    2. 点击将 Firebase 添加到您的 Android 应用,然后按设置步骤操作。如果您是导入现有 Google 项目,系统可能会自动执行这些操作,您只需下载配置文件即可。
    3. 出现提示时,输入应用的软件包名称。请务必输入应用在使用的软件包名称,只有在将应用添加到 Firebase 项目时才能进行此设置。
    4. 最后,您要下载一个 google-services.json 文件。您可以随时重新下载配置文件
    5. 如果尚未将此文件复制到项目的模块文件夹(通常是 app/),请执行此操作。
  2. 将从您的 EAP 联系人那里接收到的 SDK 解压缩:
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. 将存放解压缩 SDK 和 Google 服务插件的目录添加到您的项目级 build.gradle
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. 然后,加入机器学习套件的依赖项,并将 apply plugin 行添加到您的应用级 build.gradle 文件:

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

配置标签检测器

默认情况下,Cloud 检测器使用 STABLE 版本的模型,最多会返回 10 个结果。如果您想更改这些设置中的任何一个,请使用 FirebaseVisionCloudDetectorOptions 对象来指定。

例如,要更改这两项默认设置,请按照下面的示例构建一个 FirebaseVisionCloudDetectorOptions 对象:

FirebaseVisionCloudDetectorOptions options =
    new FirebaseVisionCloudDetectorOptions.Builder()
        .setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
        .setMaxResults(15)
        .build();

要使用默认设置,可以在下一步中使用 FirebaseVisionCloudDetectorOptions.DEFAULT

运行标签检测器

要为图片中的对象添加标签,请将图片作为 ByteBuffer 对象传递给 FirebaseVisionCloudLabelDetectordetectInBuffer 方法,或将图片作为 android.graphics.Bitmap 对象传递给 detectInImage 方法。

  1. 获取 FirebaseVisionCloudLabelDetector 的一个实例:

    FirebaseVisionCloudLabelDetector detector = FirebaseVision.getInstance()
        .getVisionCloudLabelDetector(options);
    
  2. 创建一个包含图片元数据的 FirebaseVisionImageMetadata 对象。

    如果要将图片作为 ByteBuffer 传递,则必须指定图片的高度、宽度、颜色编码格式和显示方向:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    如果要将图片作为 Bitmap 传递,则只需指定图片的显示方向:

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. 最后,将图片传递给 detectInBufferdetectInImage 方法:

    Task<SparseArray<FirebaseVisionCloudLabel>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionCloudLabel>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionCloudLabel> label) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

获取有关已标记对象的信息

如果标签识别操作成功,则系统会向成功侦听器传递一组 FirebaseVisionCloudLabel 对象。每个 FirebaseVisionCloudLabel 对象代表在图片中标记的某些内容。对于每个标签,您可以获取它在输入图片中的边界坐标、标签的知识图谱实体 ID(如果有)以及匹配的置信度分数。例如:

for(int i = 0; i < labels.size(); i++) {
  FirebaseVisionCloudLabel label = labels.valueAt(i);

  Rect bounds = label.getBoundingBox();
  String label = label.getLabel();
  String entityId = label.getEntityId();
  float confidence = label.getScore();
}