通过 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)
有关展示如何为图像分割器准备数据的代码示例,请参阅 代码示例。
运行任务
图片分割器使用 segment
、segment_for_video
和 segment_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_type
为 CATEGORY_MASK
,输出为列表
包含单个分段掩码作为 uint8 图片。像素表示
输入图像的已识别类别索引。如果output_type
CONFIDENCE_MASK
,则输出是一个类别编号大小的矢量。每个
分割掩码是 [0,1]
范围内的一张浮动图片,表示
属于该类别的像素置信度分数。
以下各部分显示了此任务的输出数据示例:
类别置信度
下图显示了某个类别的任务输出的可视化图表
置信度掩码。置信度掩码输出包含介于
[0, 1]
。
原始图片和类别置信度蒙版输出。来自 2012 年 Pascal VOC 数据集。
类别值
下图显示了某个类别的任务输出的可视化图表
值掩码。类别掩码范围为 [0, 255]
,每个像素值
表示模型输出的胜出类别索引。获奖类别
指数是模型可识别的类别中得分最高的。
原始图片和类别遮罩输出。来自 2012 年 Pascal VOC 数据集。