适用于 Android 的交互式图像分割指南

MediaPipe Interactive Image Segmenter 任务会获取图片中的一个位置, 并将该对象的细分作为 图片数据。这些说明将向您介绍如何使用交互式图像分割器 Android 应用。本说明中描述的代码示例可以在 GitHub 如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

MediaPipe Tasks 代码示例是交互式图像分割器的简单实现 Android 版应用。 此示例使用了从设备图库中选择的图片。

您可以用该应用作为基础来开发自己的 Android 应用,也可以指代该应用 对现有应用进行了修改。交互式图像分割器示例代码托管在 GitHub

下载代码

以下说明介绍了如何创建示例的本地副本 使用 git 命令行工具运行 git 代码库。

<ph type="x-smartling-placeholder">

如需下载示例代码,请执行以下操作:

  1. 使用以下命令克隆 git 代码库:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. (可选)将您的 Git 实例配置为使用稀疏检出, 因此您只有交互式图像分割器示例应用的文件:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_segmentation/android
    

创建示例代码的本地版本后,您可以导入项目 进入 Android Studio 并运行应用。有关说明,请参阅 Android 版设置指南

关键组件

以下文件包含此图片的关键代码 细分示例应用:

设置

本部分介绍了设置开发环境和 代码项目使用交互式图像分割器。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅 Android 版设置指南

<ph type="x-smartling-placeholder">

依赖项

交互式图像分割器使用 com.google.mediapipe:tasks-vision 库。添加此项 依赖项的 build.gradle 文件 Android 应用开发项目。使用以下代码导入所需的依赖项: 以下代码:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

型号

MediaPipe Interactive Image Segmenter 任务需要一个与此训练兼容的模型, 任务。如需详细了解适用于交互式图像分割器的经过训练的模型,请参阅 任务概览的“模型”部分

选择并下载模型,然后将其存储在项目目录中:

<dev-project-root>/src/main/assets

使用 BaseOptions.Builder.setModelAssetPath() 方法指定路径 模型所用的指标。下一张幻灯片中的代码示例显示了此方法 部分。

在交互式图像分割器中 示例代码, 该模型在 InteractiveSegmenterHelper.kt 中定义, setupInteractiveSegmenter() 函数中的类。

创建任务

您可以使用 createFromOptions 函数创建任务。通过 “createFromOptions”函数接受配置选项,包括 遮盖输出类型。如需详细了解配置 选项,请参阅配置概览

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener(exception -> {
         // Process the segmentation errors here.
    })    
    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);
outputCategoryMask 如果设置为 True,则输出将包含细分掩码 作为 uint8 图像,其中每个像素值表示该像素是否属于 该对象位于相关区域。 {True, False} False outputConfidenceMasks 如果设置为 True,则输出将包含细分掩码 表示为浮点值图片,其中每个浮点值表示置信度 该像素是位于关注区域的对象的一部分。 {True, False} True displayNamesLocale 设置要用于 任务模型的元数据(如果有)。默认值为 en, 英语。您可以向自定义模型的元数据中添加本地化标签 使用 TensorFlow Lite Metadata Writer API 语言区域代码 en errorListener 设置一个可选的错误监听器。 不适用 未设置

准备数据

交互式图像分割器处理图像,任务处理数据输入 包括调整大小、旋转和值归一化。 您需要将输入图片 com.google.mediapipe.framework.image.MPImage 对象,然后再将其传递给 任务。

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
MPImage mpImage = new BitmapImageBuilder(bitmap).build();
RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);