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

Nhiệm vụ của 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 để áp dụng hiệu ứng hình ảnh như làm mờ nền. Các hướng dẫn này sẽ 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. Cho thông tin khác về tính năng, kiểu máy và tuỳ 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 Trình phân đoạn hình ảnh cung cấp cách triển khai hoàn chỉnh trình phân đoạn này 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à bắt đầu tạo ứ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 Trình phân đoạn hình ảnh mã ví dụ 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à mã dự án cụ thể để sử dụng Trình phân đoạn 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. Bạn có thể xem 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 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

Nhiệm vụ về Trình phân đoạn hình ảnh MediaPipe cần có một mô hình đã qua đào tạo 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 phân đoạn hình ảnh, hãy xem phần Mô hình tổng quan về nhiệm vụ.

Chọn và tải mô hình xuống rồi 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 thông số Tên mô hình, như được hiển thị 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 việc cần làm. Hàm create_from_options chấp nhận các giá trị để biết 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.

Những mẫu này cũng cho thấy các biến thể của quá trình tạo tác vụ đối với 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 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 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
output_category_mask Nếu bạn đặ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 danh mục chiến thắng giá trị. {True, False} False
output_confidence_masks Nếu bạn đặ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 biểu thị độ tin cậy bản đồ điểm số 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 về mô hình của công việc (nếu có). Mặc định là en cho 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 TensorFlow Lite Metadata Writer API 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 không đồng bộ khi trình phân đoạn hình ảnh đang ở chế độ LIVE_STREAM. Chỉ sử dụng được 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 thành đối tượng mediapipe.Image. Nếu nội dung bạn nhập là tệp video hoặc phát trực tiếp trên webcam, thì bạn có thể 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

# 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 việc chuẩn bị dữ liệu cho Trình phân đoạn hình ảnh, hãy xem mã ví dụ.

Chạy tác vụ

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

Các ví dụ về mã 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 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 nhập.
  • Khi chạy trong hình ảnh hoặc mô hình 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 đầu vào hoặc khung.

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

Xử lý và hiện 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ả là một danh sách chứa mặt nạ đơn phân đoạn dưới dạng hình ảnh uint8. Pixel biểu thị 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 là số danh mục. Một mặt nạ được phân đoạn là một hình ảnh nổi trong phạm vi [0,1], biểu thị đ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 tác 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 danh mục mặt nạ tin cậy. Đầu ra mặt nạ tin cậy chứa các giá trị số thực giữa [0, 1].

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

Giá trị 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 danh mục mặt nạ giá trị. Phạm vi mặt nạ danh mục là [0, 255] và mỗi giá trị pixel biểu thị chỉ mục danh mục chiến thắng của đầu ra của mô hình. Hạng mục chiến thắng chỉ mục có điểm cao nhất trong số các danh mục mà mô hình có thể nhận ra.

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