Python 版图片嵌入指南

通过 MediaPipe Image Embedder 任务,您可以将图片数据转换为数字表示形式 来完成与机器学习相关的图片处理任务,例如将 相似度。以下说明介绍了如何使用 使用 Python 嵌入图片嵌入器。

如需详细了解功能、模型和配置选项 部分,请参阅概览

代码示例

图片嵌入器的示例代码提供了该嵌入的完整实现。 供您参考。此代码可帮助您测试此任务, 开始构建自己的图像嵌入器。您可以查看、运行和修改 图片嵌入器示例 代码 只需网络浏览器即可访问 Google Colab。您可以查看 这个示例位于 GitHub

设置

本部分介绍了设置开发环境和 专门用于使用 Image Embedder 的代码项目。有关 设置开发环境以使用 MediaPipe 任务,包括 平台版本要求,请参阅适用于 Python

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

软件包

Image Embedder 用于执行 mediapipe pip 软件包的任务。你可以安装 替换为以下内容:

$ python -m pip install mediapipe

导入

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

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

型号

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

选择并下载模型,然后将其存储在本地目录中。您可以使用 建议的 MobileNetV3 模型。

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

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

base_options = BaseOptions(model_asset_path=model_path)

创建任务

您可以使用 create_from_options 函数创建任务。通过 create_from_options 函数接受配置选项来设置嵌入器 选项。如需详细了解配置选项,请参阅配置选项 概览

图片嵌入器任务支持 3 种输入数据类型:静态图片、视频文件 和直播视频流选择与输入数据类型对应的标签页,以 了解如何创建任务并运行推理。

映像

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    quantize=True,
    running_mode=VisionRunningMode.IMAGE)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

视频

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    quantize=True,
    running_mode=VisionRunningMode.VIDEO)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

直播

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedderResult = mp.tasks.vision.ImageEmbedder.ImageEmbedderResult
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageEmbedderResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageEmbedderResult result: {}'.format(result))

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    quantize=True,
    result_callback=print_result)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

配置选项

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

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

IMAGE:单图输入的模式。

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

LIVE_STREAM:输入流媒体直播模式 例如来自相机的数据。在此模式下,resultListener 必须为 调用以设置监听器以接收结果 异步执行。
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize 是否使用 L2 范数对返回的特征向量进行归一化。 仅当模型尚未包含原生 L2_NORMALIZATION TFLite 操作大多数情况下已经如此 因此,L2 归一化通过 TFLite 推理实现,无需 。 Boolean False
quantize 是否应通过 标量量化。嵌套被隐式假定为单位范数, 因此任何维度的值都必须在 [-1.0, 1.0] 范围内。使用 则使用 l2_normalize 选项。 Boolean False
result_callback 设置结果监听器以接收嵌入结果 当图片嵌入器位于直播视频流中时异步加载 模式。仅在跑步模式设为“LIVE_STREAM”时才能使用 不适用 未设置

准备数据

将输入准备为图像文件或 Numpy 数组,然后将其转换为 mediapipe.Image 对象。如果您输入的是 网络摄像头,您可以使用外部库,如 OpenCV:以 Numpy 形式加载输入帧 数组。

映像

import mediapipe as mp

# 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)
    

视频

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it 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)
    

直播

import mediapipe as mp

# 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)
    

运行任务

您可以调用与您的跑步模式对应的嵌入函数来触发 推理。Image Embedder API 会返回 输入图片或帧。

映像

# Perform image embedding on the provided single image.
embedding_result = embedder.embed(mp_image)
    

视频

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image embedding on the video frame.
embedding_result = embedder.embed_for_video(mp_image, frame_timestamp_ms)
    

直播

# Send the latest frame to perform image embedding.
# Results are sent to the `result_callback` provided in the `ImageEmbedderOptions`.
embedder.embed_async(mp_image, frame_timestamp_ms)
    

请注意以下几点:

  • 在视频模式或直播模式下投放广告时,您还必须 为图像嵌入器任务提供输入帧的时间戳。
  • 在图片或视频模型中运行时,图片嵌入器任务将 阻塞当前线程,直到它处理完输入图像,或者 帧。
  • 在直播模式下运行时,图片嵌入器任务不会阻止 当前线程,但会立即返回。它将调用其结果 并在每次完成处理后返回嵌入结果的监听器。 输入帧。如果在加载图片嵌入器时调用了 embedAsync 函数, 任务正忙于处理另一个帧,则该任务会忽略新的输入帧。

处理和显示结果

运行推理时,Image Embedder 任务会返回 ImageEmbedderResult 对象,其中包含 输入图片或帧。

以下示例展示了此任务的输出数据:

ImageEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
    head_index: 0

此结果是通过嵌入以下图片获得的:

您可以使用 ImageEmbedder.cosine_similarity 函数。有关 示例。

# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
  embedding_result.embeddings[0],
  other_embedding_result.embeddings[0])