Panduan segmentasi gambar untuk Python

Tugas MediaPipe Image Segmenter memungkinkan Anda membagi gambar menjadi beberapa area berdasarkan kategori yang telah ditentukan untuk menerapkan efek visual seperti pemburaman latar belakang. Petunjuk ini menunjukkan cara menggunakan Image Segmenter dengan bahasa Python. Untuk mengetahui informasi selengkapnya tentang kemampuan, model, dan opsi konfigurasi tugas ini, lihat Ringkasan.

Contoh kode

Kode contoh untuk Image Segmenter memberikan implementasi lengkap tugas ini di Python sebagai referensi Anda. Kode ini membantu Anda menguji tugas ini dan mulai membangun aplikasi pemisah gambar Anda sendiri. Anda dapat melihat, menjalankan, dan mengedit kode contoh Image Segmenter hanya menggunakan browser web.

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan project kode Anda secara khusus untuk menggunakan Image Segmenter. Untuk informasi umum tentang menyiapkan lingkungan pengembangan untuk menggunakan tugas MediaPipe, termasuk persyaratan versi platform, lihat Panduan penyiapan untuk Python. Anda dapat meninjau kode sumber untuk contoh ini di GitHub

Paket

Tugas MediaPipe Image Segmenter memerlukan paket mediapipe. Anda dapat menginstal dependensi yang diperlukan dengan perintah berikut:

$ python -m pip install mediapipe

Impor

Impor class berikut untuk mengakses fungsi tugas Image Segmenter:

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

Model

Tugas MediaPipe Image Segmenter memerlukan model terlatih yang kompatibel dengan tugas ini. Untuk mengetahui informasi selengkapnya tentang model terlatih yang tersedia untuk Image Segmenter, lihat bagian Model ringkasan tugas.

Pilih dan download model, lalu simpan dalam direktori project Anda:

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

Tentukan jalur model dalam parameter Nama Model, seperti yang ditunjukkan di bawah ini:

base_options = BaseOptions(model_asset_path=model_path)

Membuat tugas

Tugas MediaPipe Image Segmenter menggunakan fungsi create_from_options untuk menyiapkan tugas. Fungsi create_from_options menerima nilai untuk opsi konfigurasi yang akan ditangani. Untuk mengetahui informasi selengkapnya tentang konfigurasi tugas, lihat Opsi konfigurasi.

Contoh ini juga menunjukkan variasi konstruksi tugas untuk gambar, file video, dan streaming video live.

Gambar

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:
  

Live stream

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:
    

Opsi konfigurasi

Tugas ini memiliki opsi konfigurasi berikut untuk aplikasi Python:

Nama Opsi Deskripsi Rentang Nilai Nilai Default
running_mode Menetapkan mode berjalan untuk tugas. Ada tiga mode:

GAMBAR: Mode untuk input gambar tunggal.

VIDEO: Mode untuk frame video yang didekode.

LIVE_STREAM: Mode untuk live stream data input, seperti dari kamera. Dalam mode ini, resultListener harus dipanggil untuk menyiapkan pemroses guna menerima hasil secara asinkron.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask Jika ditetapkan ke True, output akan menyertakan mask segmentasi sebagai gambar uint8, dengan setiap nilai piksel menunjukkan nilai kategori pemenang. {True, False} False
output_confidence_masks Jika ditetapkan ke True, output akan menyertakan mask segmentasi sebagai gambar nilai float, dengan setiap nilai float mewakili peta skor keyakinan kategori. {True, False} True
display_names_locale Menetapkan bahasa label yang akan digunakan untuk nama tampilan yang diberikan dalam metadata model tugas, jika tersedia. Default-nya adalah en untuk bahasa Inggris. Anda dapat menambahkan label yang dilokalkan ke metadata model kustom menggunakan TensorFlow Lite Metadata Writer API Kode lokalitas id
result_callback Menetapkan pemroses hasil untuk menerima hasil segmentasi secara asinkron saat pemisah gambar berada dalam mode LIVE_STREAM. Hanya dapat digunakan jika mode berjalan disetel ke LIVE_STREAM T/A T/A

Menyiapkan data

Siapkan input Anda sebagai file gambar atau array numpy, lalu konversikan ke objek mediapipe.Image. Jika input Anda adalah file video atau live stream dari webcam, Anda dapat menggunakan library eksternal seperti OpenCV untuk memuat frame input sebagai array numpy.

Gambar

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

Live stream

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

Untuk contoh kode yang menunjukkan persiapan data untuk Image Segmenter, lihat contoh kode.

Menjalankan tugas

Image Segmenter menggunakan fungsi segment, segment_for_video, dan segment_async untuk memicu inferensi. Untuk segmentasi gambar, hal ini melibatkan prapemrosesan data input, menjalankan model segmentasi, dan pascapemrosesan output model mentah ke mask yang tersegmentasi.

Contoh kode berikut menunjukkan cara menjalankan pemrosesan dengan model tugas.

Gambar

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

Live stream

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

Perhatikan hal berikut:

  • Saat berjalan dalam mode video atau mode live stream, Anda juga harus memberikan stempel waktu frame input ke tugas Image Segmenter.
  • Saat berjalan dalam model gambar atau video, tugas Image Segmenter akan memblokir thread saat ini hingga selesai memproses gambar atau frame input.

Untuk contoh yang lebih lengkap tentang cara menjalankan inferensi Image Segmenter, lihat contoh kode.

Menangani dan menampilkan hasil

Image Segmenter menghasilkan daftar data Image. Jika output_type adalah CATEGORY_MASK, output-nya adalah daftar yang berisi satu mask tersegmentasi sebagai gambar uint8. Piksel menunjukkan indeks kategori yang dikenali dari gambar input. Jika output_type adalah CONFIDENCE_MASK, output-nya adalah vektor dengan ukuran jumlah kategori. Setiap mask yang tersegmentasi adalah gambar float dalam rentang [0,1], yang mewakili skor keyakinan piksel yang termasuk dalam kategori.

Bagian berikut menunjukkan contoh data output dari tugas ini:

Keyakinan kategori

Gambar berikut menunjukkan visualisasi output tugas untuk mask keyakinan kategori. Output mask keyakinan berisi nilai float antara [0, 1].

Dua gadis menunggang kuda dan satu gadis berjalan di samping kuda Mask gambar yang menguraikan bentuk gadis dan kuda dari foto sebelumnya. Setengah kiri garis batas gambar diambil, tetapi setengah kanan gambar tidak diambil

Output mask keyakinan kategori dan gambar asli. Gambar sumber dari set data Pascal VOC 2012.

Nilai kategori

Gambar berikut menunjukkan visualisasi output tugas untuk mask nilai kategori. Rentang mask kategori adalah [0, 255] dan setiap nilai piksel mewakili indeks kategori pemenang dari output model. Indeks kategori pemenang memiliki skor tertinggi di antara kategori yang dapat dikenali model.

Dua gadis menunggang kuda dan satu gadis berjalan di samping kuda Mask gambar yang menguraikan bentuk gadis dan kuda dari gambar sebelumnya. Bentuk ketiga gadis dan kuda disamarkan dengan akurat

Output mask kategori dan gambar asli. Gambar sumber dari set data Pascal VOC 2012.