Руководство по встраиванию изображений для Python

Задача MediaPipe Image Embedder позволяет преобразовывать данные изображения в числовое представление для выполнения задач обработки изображений, связанных с машинным обучением, таких как сравнение сходства двух изображений. Эти инструкции покажут вам, как использовать Image Embedder с Python.

Дополнительные сведения о возможностях, моделях и параметрах конфигурации этой задачи см. в разделе Обзор .

Пример кода

В примере кода Image Embedder представлена ​​полная реализация этой задачи на Python. Этот код поможет вам протестировать эту задачу и приступить к созданию собственного средства для внедрения изображений. Вы можете просматривать, запускать и редактировать пример кода Image Embedder, используя только веб-браузер с Google Colab. Посмотреть исходный код этого примера можно на GitHub .

Настраивать

В этом разделе описаны ключевые шаги по настройке среды разработки и проектов кода специально для использования Image Embedder. Общие сведения о настройке среды разработки для использования задач MediaPipe, включая требования к версии платформы, см. в руководстве по настройке Python .

Пакеты

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 требуется обученная модель, совместимая с этой задачей. Дополнительную информацию о доступных обученных моделях для 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 принимает параметры конфигурации для установки параметров внедрения. Дополнительные сведения о параметрах конфигурации см. в разделе Обзор конфигурации .

Задача Image Embedder поддерживает три типа входных данных: неподвижные изображения, видеофайлы и прямые видеопотоки. Выберите вкладку, соответствующую вашему типу входных данных, чтобы узнать, как создать задачу и выполнить вывод.

Изображение

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 Устанавливает режим выполнения задачи. Есть три режима:

ИЗОБРАЖЕНИЕ: Режим для ввода одного изображения.

ВИДЕО: Режим декодированных кадров видео.

LIVE_STREAM: режим прямой трансляции входных данных, например с камеры. В этом режиме необходимо вызвать resultListener, чтобы настроить прослушиватель на асинхронное получение результатов.
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
l2_normalize Нормализовать ли возвращенный вектор признаков по норме L2. Используйте эту опцию, только если модель еще не содержит встроенный L2_NORMALIZATION TFLite Op. В большинстве случаев это уже так, и нормализация L2, таким образом, достигается посредством вывода TFLite без необходимости использования этой опции. Boolean False
quantize Следует ли квантовать возвращенное внедрение в байты посредством скалярного квантования. Неявно предполагается, что вложения имеют единичную норму, и поэтому любое измерение гарантированно имеет значение в [-1.0, 1.0]. Если это не так, используйте опцию l2_normalize. Boolean False
result_callback Настраивает прослушиватель результатов на асинхронное получение результатов внедрения, когда Image Embedder находится в режиме прямого потока. Может использоваться только в том случае, если для режима работы установлено значение LIVE_STREAM Н/Д Не установлено

Подготовьте данные

Подготовьте входные данные в виде файла изображения или массива numpy, а затем преобразуйте их в объект mediapipe.Image . Если ваши входные данные представляют собой видеофайл или прямую трансляцию с веб-камеры, вы можете использовать внешнюю библиотеку, такую ​​как OpenCV, для загрузки входных кадров в виде числовых массивов.

Изображение

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)
    

Запустить задачу

Вы можете вызвать функцию внедрения, соответствующую вашему режиму работы, чтобы инициировать выводы. API Image Embedder вернет векторы внедрения для входного изображения или кадра.

Изображение

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

Обратите внимание на следующее:

  • При работе в режиме видео или режиме прямой трансляции вы также должны предоставить задаче Image Embedder временную метку входного кадра.
  • При запуске изображения или видеомодели задача Image Embedder блокирует текущий поток до тех пор, пока он не завершит обработку входного изображения или кадра.
  • При работе в режиме прямой трансляции задача Image Embedder не блокирует текущий поток, а немедленно возвращается. Он будет вызывать прослушиватель результатов с результатом внедрения каждый раз, когда завершает обработку входного кадра. Если функция embedAsync вызывается, когда задача Image Embedder занята обработкой другого кадра, задача игнорирует новый входной кадр.

Обработка и отображение результатов

После выполнения вывода задача 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])