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

Nhiệm vụ MediaPipe Image Segmenter cho phép bạn chia hình ảnh thành các khu vực dựa trên danh mục được xác định trước để áp dụng các 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 Công cụ 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à lựa chọn cấu hình của nhiệm vụ này, hãy xem phần Tổng quan.

Ví dụ về mã

Mã ví dụ cho Image Segmenter cung cấp cách triển khai đầy đủ của tác vụ này trong Python để bạn tham khảo. Mã này giúp bạn kiểm thử công việc này và bắt đầu xây dựng ứng dụng phân đoạn hình ảnh của riêng bạn. Bạn có thể xem, chạy và chỉnh sửa mã mẫu của Image Segmenter 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à lập trình cho các dự án cụ thể để sử dụng Image Segmenter. Để biết thông tin chung về cách thiết lập môi trường phát triển nhằm sử dụng các tác vụ của 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 cho ví dụ này trên GitHub

Gói

Tác vụ Trình phân đoạn hình ảnh MediaPipe cần có 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 chức năng tác vụ của Công cụ 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 cần có 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 cho Công cụ phân đoạn hình ảnh, hãy xem phần Mô hình tổng quan về tác vụ.

Chọn và tải mô hình xuống rồi lưu trữ trong thư mục dự án của bạ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ụ MediaPipe Image Segmenter 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 cần 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 quá trình tạo tác vụ cho hình ảnh, tệp video và luồng video trực tiếp.

Bài đăng có 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 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 lựa chọn cấu hình sau đây cho các ứng dụng Python:

Tên lựa chọn Nội dung mô tả Khoảng giá trị Giá trị mặc định
running_mode Đặt chế độ chạy cho tác vụ. Có 3 chế độ:

IMAGE: Chế độ nhập một hình ảnh.

VIDEO: Chế độ 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 quay. Ở chế độ này, bạn phải gọi resultsListener để thiết lập trình nghe nhằm nhận kết quả không đồng bộ.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask Nếu bạn đặt thành True, thì 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ị số thực, trong đó mỗi giá trị số thực đạ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 của tác vụ, nếu có. Giá trị 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 viết siêu dữ liệu TensorFlow Lite Mã ngôn ngữ vi
result_callback Thiết lập 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 đang ở chế độ phát trực tiếp. Chỉ có thể sử dụng khi bạn đặt chế độ chạy 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 sự kiện phát trực tiếp từ webcam, bạn có thể sử dụng một thư viện bên ngoài, chẳng hạn như OpenCV để tải khung hình đầu vào dưới dạng các mảng numpy.

Bài đăng có 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 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 việc chuẩn bị dữ liệu cho Công cụ 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 thông tin dự đoán. Đối với phân đoạn hình ảnh, quá trình này liên quan đến việc xử lý trước dữ liệu đầu vào, chạy mô hình phân đoạn và xử lý hậu kỳ đầu ra của mô hình thô cho các mặt nạ được phân đoạn.

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

Bài đăng có 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 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 dấu thời gian của khung hình đầu vào cho tác vụ Phân đoạn hình ảnh.
  • Khi chạy trong hình ảnh hoặc mô hình video, tác vụ Image Segmenter (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 đầu vào.

Để biết ví dụ đầy đủ hơn về cách chạy suy luận của Công cụ 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 một danh sách dữ liệu Image. Nếu output_typeCATEGORY_MASK, 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. Pixel này cho biết chỉ mục danh mục được công nhận của hình ảnh đầu vào. Nếu output_typeCONFIDENCE_MASK, đầu ra là một vectơ có kích thước theo số danh mục. Mỗi mặt nạ được phân đoạn là một hình ảnh nổi trong phạm vi [0,1], thể hiện đ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 minh hoạ kết quả đầu ra của tác vụ cho một 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ị số thực giữa [0, 1].

Đầu ra của mặt nạ tin cậy cho danh mục và hình ảnh gố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 kết quả đầu ra của tác vụ cho một 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 giành chiến thắng có điểm số cao nhất trong các danh mục mà mô hình có thể công nhận.

Đầ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.