Hướng dẫn phân đoạn hình ảnh cho Python

Tác vụ Trình phân đoạn hình ảnh MediaPipe cho phép bạn chia hình ảnh thành các vùng dựa trên các danh mục được xác định trước để áp dụng hiệu ứng hình ảnh như làm mờ nền. Các hướng dẫn này cho bạn biết cách sử dụng Trình phân đoạn hình ảnh bằng ngôn ngữ Python. Để biết thêm thông tin về các tính năng, mô hình và tuỳ chọn cấu hình của tác vụ này, hãy xem phần Tổng quan.

Ví dụ về mã

Mã mẫu cho Trình phân đoạn hình ảnh cung cấp cách triển khai hoàn chỉnh nhiệm vụ này trong Python để bạn tham khảo. Mã này giúp bạn kiểm thử nhiệm vụ này và bắt đầu xây dựng ứng dụng phân đoạn hình ảnh của riêng mình. Bạn có thể xem, chạy và chỉnh sửa mã ví dụ của Trình phân đoạn hình ảnh chỉ bằng trình duyệt web.

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à dự án mã dành riêng cho việc sử dụng Trình phân đoạn hình ảnh. Để biết thông tin chung về cách thiết lập môi trường phát triển cho việc sử dụng các tác vụ MediaPipe, bao gồm cả các 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. Bạn có thể xem lại mã nguồn của ví dụ này trên GitHub

Gói

Tác vụ Trình phân đoạn hình ảnh MediaPipe yêu cầu gói mediapipe. Bạn có thể cài đặt các phần phụ thuộc bắt buộc bằng lệnh sau:

$ python -m pip install mediapipe

Nhập

Nhập các lớp sau để truy cập vào các hàm tác vụ của Trình phân đoạn hình ảnh:

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

Mẫu

Tác vụ Trình phân đoạn hình ảnh MediaPipe yêu cầu một mô hình đã huấn luyện tương thích với tác vụ này. Để biết thêm thông tin về các mô hình đã huấn luyện hiện có cho Trình phân đoạn hình ảnh, hãy xem phần Mô hình trong phần tổng quan về tác vụ.

Chọn và tải mô hình xuống, sau đó lưu trữ mô hình đó trong thư mục dự án:

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

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

base_options = BaseOptions(model_asset_path=model_path)

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

Tác vụ Trình phân đoạn hình ảnh MediaPipe sử dụng hàm create_from_options để thiết lập tác vụ. Hàm create_from_options chấp nhận các giá trị cho các tuỳ chọn cấu hình để xử lý. Để biết thêm thông tin về cấu hình tác vụ, hãy xem phần Tuỳ chọn cấu hình.

Các mẫu này cũng cho thấy các biến thể của cấu trúc tác vụ cho hình ảnh, tệp video và luồng video trực tiếp.

Hình ảnh

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:
  

Video

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:
  

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

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:
    

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

Tác vụ này có các tuỳ chọn cấu hình sau đây cho các ứng dụng Python:

Tên tuỳ chọn Mô tả Phạm vi giá trị Giá trị mặc định
running_mode Đặt chế độ chạy cho tác vụ. Có 3 chế độ:

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

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

LIVE_STREAM: Chế độ phát trực tiếp dữ liệu đầu vào, chẳng hạn như từ máy ảnh. Ở chế độ này, bạn phải gọi resultListener để 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
output_category_mask Nếu được đặt thành True, kết quả sẽ bao gồm một mặt nạ phân đoạn dưới dạng hình ảnh uint8, trong đó mỗi giá trị pixel cho biết giá trị danh mục chiến thắng. {True, False} False
output_confidence_masks Nếu được đặt thành True, kết quả sẽ bao gồm một mặt nạ phân đoạn dưới dạng hình ảnh giá trị float, trong đó mỗi giá trị float đại diện cho bản đồ điểm số tin cậy của danh mục. {True, False} True
display_names_locale Đặt ngôn ngữ của nhãn để sử dụng cho tên hiển thị được cung cấp trong siêu dữ liệu của mô hình tác vụ, nếu có. Mặc định là en đối với tiếng Anh. Bạn có thể thêm nhãn đã bản địa hoá vào siêu dữ liệu của mô hình tuỳ chỉnh bằng cách sử dụng API Trình ghi siêu dữ liệu TensorFlow Lite Mã ngôn ngữ vi
result_callback Đặt trình nghe kết quả để nhận kết quả phân đoạn một cách không đồng bộ khi trình phân đoạn hình ảnh ở chế độ LIVE_STREAM. Chỉ có thể sử dụng khi chế độ chạy được đặt thành LIVE_STREAM Không áp dụng Không áp dụng

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 dữ liệu đó thành đối tượng mediapipe.Image. Nếu dữ liệu đầu vào là tệp video hoặc luồng 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 hình đầu vào dưới dạng mảng numpy.

Hình ảnh

# 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

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

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

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

Để xem ví dụ về mã cho thấy cách chuẩn bị dữ liệu cho Trình phân đoạn hình ảnh, hãy xem ví dụ về mã.

Chạy tác vụ

Trình phân đoạn hình ảnh sử dụng các hàm segment, segment_for_videosegment_async để kích hoạt các suy luận. Đối với việc phân đoạn hình ảnh, quy trình này bao gồm việc xử lý trước dữ liệu đầu vào, chạy mô hình phân đoạn và xử lý sau đầu ra mô hình thô thành mặt nạ được phân đoạn.

Các ví dụ về mã sau đây cho biết cách thực thi quá trình xử lý bằng mô hình tác vụ.

Hình ảnh

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

Video

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

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

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

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 phân đoạn hình ảnh dấu thời gian của khung hình đầu vào.
  • Khi chạy trong mô hình hình ảnh hoặc video, tác vụ Trình phân đoạn hình ảnh sẽ chặn luồng hiện tại cho đến khi xử lý xong hình ảnh hoặc khung hình đầu vào.

Để biết ví dụ đầy đủ hơn về cách chạy các suy luận của Trình phân đoạn hình ảnh, hãy xem ví dụ về mã.

Xử lý và hiển thị kết quả

Trình phân đoạn hình ảnh sẽ xuất ra danh sách dữ liệu Image. Nếu output_typeCATEGORY_MASK, thì kết quả sẽ là một danh sách chứa một mặt nạ được phân đoạn dưới dạng hình ảnh uint8. Điểm ảnh cho biết chỉ mục danh mục được nhận dạng của hình ảnh đầu vào. Nếu output_typeCONFIDENCE_MASK, thì kết quả sẽ là một vectơ có kích thước là số lượng danh mục. Mỗi mặt nạ được phân đoạn là một hình ảnh float trong phạm vi [0,1], đại diện cho điểm số tin cậy của pixel thuộc danh mục.

Các phần sau đây trình bày ví dụ về dữ liệu đầu ra của nhiệm vụ này:

Độ tin cậy của danh mục

Các hình ảnh sau đây cho thấy hình ảnh trực quan của kết quả tác vụ cho mặt nạ độ tin cậy của danh mục. Đầu ra của mặt nạ độ tin cậy chứa các giá trị float trong khoảng [0, 1].

Hai cô gái cưỡi ngựa và một cô gái đi bộ bên cạnh ngựa Mặt nạ hình ảnh phác thảo hình dạng của các cô gái và con ngựa trong bức ảnh trước. Nửa bên trái của đường viền hình ảnh được chụp, nhưng nửa bên phải của hình ảnh thì không

Đầu ra mặt nạ độ tin cậy của hình ảnh gốc và danh mục. Hình ảnh nguồn từ tập dữ liệu Pascal VOC 2012.

Giá trị danh mục

Các hình ảnh sau đây cho thấy hình ảnh trực quan của kết quả tác vụ cho mặt nạ giá trị danh mục. Phạm vi mặt nạ danh mục là [0, 255] và mỗi giá trị pixel đại diện cho chỉ mục danh mục chiến thắng của đầu ra mô hình. Chỉ mục danh mục chiến thắng có điểm số cao nhất trong số các danh mục mà mô hình có thể nhận dạng.

Hai cô gái cưỡi ngựa và một cô gái đi bộ bên cạnh ngựa Mặt nạ hình ảnh phác thảo hình dạng của các cô gái và con ngựa trong hình ảnh trước. Hình dạng của cả ba cô gái và con ngựa đều được che chính xác

Kết quả đầu ra của mặt nạ danh mục và hình ảnh gốc. Hình ảnh nguồn từ tập dữ liệu Pascal VOC 2012.