Python 图像分割指南

通过 MediaPipe Image Segmenter 任务,您可以根据预定义的 用于应用视觉效果的类别,例如背景模糊处理。这些 说明如何通过 Python 语言使用图像分割器。对于 功能、模型和配置选项 此任务,请参阅概览

代码示例

图像分割器的示例代码提供了上述代码的完整实现, 供您参考。此代码可帮助您测试此任务, 开始构建您自己的图像分割器应用。您可以查看、运行 编辑图像分割器 示例代码 只需使用网络浏览器即可。

设置

本部分介绍了设置开发环境和 专门针对使用 Image Segmenter 的项目的代码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅 Python 设置指南。 您可以在以下位置查看此示例的源代码: GitHub

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

软件包

MediaPipe Image Segmenter 任务需要 mediapipe 软件包。您可以安装 所需的依赖项:

$ python -m pip install mediapipe

导入

导入以下类以访问 Image Segmenter 任务函数:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

型号

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

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

model_path = '/absolute/path/to/model.tflite'

在 Model Name 参数中指定模型的路径,如下所示:

base_options = BaseOptions(model_asset_path=model_path)

创建任务

MediaPipe Image Segmenter 任务使用 create_from_options 函数 设置任务。create_from_options 函数接受值 处理配置选项如需详细了解任务配置 请参阅配置选项

这些示例还展示了图片任务构建的不同变体, 视频文件和直播视频流

映像

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

视频

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

直播

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

配置选项

此任务具有以下适用于 Python 应用的配置选项:

选项名称 说明 值范围 默认值
running_mode 设置任务的运行模式。有三个 模式:

IMAGE:单图输入的模式。

VIDEO:视频已解码帧的模式。

LIVE_STREAM:输入流媒体直播模式 例如来自相机的数据。 在此模式下,resultListener 必须为 调用以设置监听器以接收结果 异步执行。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask 如果设置为 True,则输出将包含细分掩码 表示为 uint8 图片,其中每个像素值都表示胜出的类别 值。 {True, False} False
output_confidence_masks 如果设置为 True,则输出将包含细分掩码 表示为浮点值图片,其中每个浮点值表示置信度 该类别的得分图。 {True, False} True
display_names_locale 设置要用于 任务模型的元数据(如果有)。默认值为 en, 英语。您可以向自定义模型的元数据中添加本地化标签 使用 TensorFlow Lite Metadata Writer API 语言区域代码 en
result_callback 设置结果监听器以接收细分结果 在图像分割器处于 LIVE_STREAM 模式时异步执行。 仅在跑步模式设为“LIVE_STREAM”时才能使用 不适用 不适用

准备数据

将输入准备为图片文件或 Numpy 数组, 然后将其转换为 mediapipe.Image 对象。如果输入是视频文件 或使用摄像头进行直播时,您可以使用外部媒体库,例如 OpenCV:以 Numpy 形式加载输入帧 数组。

映像

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

视频

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate to calculate the timestamp for each frame.
# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

直播

# Use OpenCV’s VideoCapture to start capturing from the webcam.
# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

有关展示如何为图像分割器准备数据的代码示例,请参阅 代码示例

运行任务

图片分割器使用 segmentsegment_for_videosegment_async 函数来触发推理。对于图像分割,这涉及 预处理输入数据、运行分割模型并进行后处理 原始模型输出到分割掩码。

以下代码示例展示了如何使用任务模型执行处理任务。

映像

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

视频

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

直播

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

请注意以下几点:

  • 在视频模式或直播模式下投放广告时,您还必须 为图像分割器任务提供输入帧的时间戳。
  • 在图片或视频模型中运行时,图片分割器任务将 阻塞当前线程,直到它处理完输入图像,或者 帧。

有关运行图像分割器推断的更完整示例,请参阅 代码示例

处理和显示结果

图像分割器会输出 Image 数据的列表。如果 output_typeCATEGORY_MASK,输出为列表 包含单个分段掩码作为 uint8 图片。像素表示 输入图像的已识别类别索引。如果output_type CONFIDENCE_MASK,则输出是一个类别编号大小的矢量。每个 分割掩码是 [0,1] 范围内的一张浮动图片,表示 属于该类别的像素置信度分数。

以下各部分显示了此任务的输出数据示例:

类别置信度

下图显示了某个类别的任务输出的可视化图表 置信度掩码。置信度掩码输出包含介于 [0, 1]

原始图片和类别置信度蒙版输出。来自 2012 年 Pascal VOC 数据集。

类别值

下图显示了某个类别的任务输出的可视化图表 值掩码。类别掩码范围为 [0, 255],每个像素值 表示模型输出的胜出类别索引。获奖类别 指数是模型可识别的类别中得分最高的。

原始图片和类别遮罩输出。来自 2012 年 Pascal VOC 数据集。