Hướng dẫn nhúng hình ảnh cho Python

Nhiệm vụ của MediaPipe Image Embeddedder (Trình nhúng hình ảnh MediaPipe) cho phép bạn chuyển đổi dữ liệu hình ảnh thành bản trình bày dạng số thực hiện các nhiệm vụ xử lý hình ảnh liên quan đến học máy, chẳng hạn như so sánh điểm tương đồng của hai hình ảnh. Những hướng dẫn này chỉ cho bạn cách sử dụng Công cụ nhúng hình ảnh với Python.

Để biết thêm thông tin về tính năng, kiểu máy và các lựa chọn cấu hình của nhiệm vụ này, xem phần Tổng quan.

Ví dụ về mã

Mã ví dụ cho Trình nhúng hình ảnh cung cấp cách triển khai hoàn chỉnh cho công việc bằng Python để bạn tham khảo. Mã này giúp bạn kiểm thử công việc này và hãy bắt đầu tạo trình nhúng hình ảnh của riêng bạn. Bạn có thể xem, chạy và chỉnh sửa Ví dụ về Công cụ nhúng hình ảnh mã chỉ bằng trình duyệt web có Google Colab. Bạn có thể xem mã nguồn cho ví dụ này trên GitHub.

Thiết lập

Phần này mô tả các bước chính để thiết lập môi trường phát triển và mã dự án cụ thể để sử dụng Công cụ nhúng hình ảnh. Để biết thông tin chung về thiết lập môi trường phát triển để sử dụng các tác vụ MediaPipe, bao gồm yêu cầu về phiên bản nền tảng, hãy xem Hướng dẫn thiết lập cho Python.

Gói

Tác vụ của Trình nhúng hình ảnh là gói pip mediapipe. Bạn có thể cài đặt phần phụ thuộc này bằng các tính năng sau:

$ python -m pip install mediapipe

Nhập

Nhập các lớp sau để truy cập vào các chức năng của tác vụ cho Trình nhúng hình ảnh:

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

Mẫu

Nhiệm vụ của Trình nhúng hình ảnh MediaPipe cần có một mô hình đã qua huấn luyện tương thích với công việc. Để biết thêm thông tin về các mô hình đã huấn luyện hiện có cho Trình nhúng hình ảnh, hãy xem tổng quan về nhiệm vụ phần Mô hình.

Chọn và tải mô hình xuống rồi lưu trữ mô hình đó trong một thư mục trên máy. Bạn có thể sử dụng được đề xuất MobileNetV3 mô hình.

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

Chỉ định đường dẫn của mô hình trong tham số model_asset_path, như minh hoạ dưới đây:

base_options = BaseOptions(model_asset_path=model_path)

Tạo việc cần làm

Bạn có thể sử dụng hàm create_from_options để tạo công việc. Chiến lược phát hành đĩa đơn Hàm create_from_options chấp nhận các lựa chọn cấu hình để đặt trình nhúng . Để biết thêm thông tin về các chế độ cấu hình, hãy xem phần Cấu hình Tổng quan.

Nhiệm vụ của Trình nhúng hình ảnh hỗ trợ 3 loại dữ liệu đầu vào: ảnh tĩnh, tệp video và luồng video trực tiếp. Chọn thẻ tương ứng với loại dữ liệu nhập của bạn để xem cách tạo tác vụ và chạy suy luận.

Bài đăng có hình ảnh

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

Video

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

Sự kiện phát trực tiếp

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

Các lựa chọn về cấu hình

Tác vụ này có các lựa chọn cấu hình sau cho các ứng dụng Python:

Tên lựa chọn Mô tả Khoảng giá trị Giá trị mặc định
running_mode Thiết lập chế độ chạy cho tác vụ. Có ba chế độ:

HÌNH ẢNH: Chế độ cho đầu vào một hình ảnh.

VIDEO: Chế độ cho các khung đã giải mã của video.

LIVE_STREAM: Chế độ phát trực tiếp đầu vào chẳng hạn như từ máy ảnh. Trong chế độ này, ResultsListener phải là để thiết lập trình nghe để nhận kết quả một cách không đồng bộ.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize Liệu có chuẩn hoá vectơ đối tượng được trả về với chuẩn L2 hay không. Chỉ sử dụng tuỳ chọn này nếu mô hình không chứa đoạn mã gốc L2_NORMALIZATION TFLite Op. Trong hầu hết các trường hợp, điều này đã đúng và Do đó, quá trình chuẩn hoá L2 đạt được thông qua suy luận TFLite mà không cần cho tuỳ chọn này. Boolean False
quantize Liệu có cần lượng tử hoá mục nhúng trả về thành byte qua hay không lượng tử vô hướng. Các lượt nhúng được ngầm xem là quy chuẩn đơn vị và do đó mọi chiều đều được đảm bảo có giá trị trong [-1.0, 1.0]. Sử dụng tùy chọn l2_normalize nếu không phải vậy. Boolean False
result_callback Thiết lập trình nghe kết quả để nhận kết quả nhúng không đồng bộ khi Trình nhúng hình ảnh đang phát trực tiếp . Chỉ sử dụng được khi bạn đặt chế độ chạy thành LIVE_STREAM Không áp dụng Chưa đặt

Chuẩn bị dữ liệu

Chuẩn bị dữ liệu đầu vào dưới dạng tệp hình ảnh hoặc mảng numpy, sau đó chuyển đổi tệp đó thành Đối tượng mediapipe.Image. Nếu dữ liệu đầu vào của bạn là tệp video hoặc chương trình phát trực tiếp từ webcam, bạn có thể sử dụng thư viện bên ngoài như OpenCV để tải các khung đầu vào của bạn dưới dạng numpy mảng.

Bài đăng có hình ảnh

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)
    

Video

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)
    

Sự kiện phát trực tiếp

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)
    

Chạy tác vụ

Bạn có thể gọi hàm nhúng tương ứng với chế độ chạy của mình để kích hoạt suy luận. Image Nhúng API sẽ trả về các vectơ nhúng cho đầu vào hình ảnh hoặc khung.

Bài đăng có hình ảnh

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

Video

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

Sự kiện phát trực tiếp

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

Xin lưu ý những điều sau:

  • Khi chạy ở chế độ video hoặc chế độ phát trực tiếp, bạn cũng phải cung cấp cho tác vụ Trình nhúng hình ảnh dấu thời gian của khung nhập.
  • Khi chạy trong hình ảnh hoặc mô hình video, tác vụ Trình nhúng hình ảnh sẽ chặn luồng hiện tại cho đến khi xử lý xong hình ảnh đầu vào hoặc khung.
  • Khi chạy ở chế độ phát trực tiếp, tác vụ Trình nhúng hình ảnh sẽ không chặn luồng hiện tại nhưng trả về ngay lập tức. Tham số này sẽ gọi ra kết quả với kết quả nhúng mỗi khi trình nghe xử lý xong một khung đầu vào. Nếu hàm embedAsync được gọi khi Trình nhúng hình ảnh tác vụ đang bận xử lý một khung khác, tác vụ sẽ bỏ qua khung đầu vào mới.

Xử lý và hiện kết quả

Sau khi chạy dự đoán, tác vụ Trình nhúng hình ảnh sẽ trả về một ImageEmbedderResult đối tượng chứa danh sách các danh mục có thể có cho các đối tượng trong đầu vào hình ảnh hoặc khung.

Sau đây là ví dụ về dữ liệu đầu ra của tác vụ này:

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

Kết quả này thu được bằng cách nhúng hình ảnh sau:

Bạn có thể so sánh điểm tương đồng của hai nhúng bằng cách sử dụng Hàm ImageEmbedder.cosine_similarity. Hãy xem mã sau đây để biết ví dụ:

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