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 Segmentasi Gambar dengan bahasa Python. Untuk mengetahui informasi selengkapnya tentang kemampuan, model, dan opsi konfigurasi tugas ini, lihat Ringkasan.

Contoh kode

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

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan project kode khusus untuk menggunakan Image Segmenter. Untuk informasi umum tentang menyiapkan lingkungan pengembangan Anda 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 Segmentasi Gambar, lihat bagian Model ringkasan tugas.

Pilih dan download model, lalu simpan dalam direktori project:

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

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

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 ditangani opsi konfigurasi. 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:

IMAGE: Mode untuk input gambar tunggal.

VIDEO: Mode untuk frame video yang didekode.

LIVE_STREAM: Mode untuk livestream data input, seperti dari kamera. Dalam mode ini, resultListener harus dipanggil untuk menyiapkan pemroses yang menerima hasil secara asinkron.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask Jika ditetapkan ke True, output-nya akan menyertakan mask segmentasi sebagai gambar uint8, dengan setiap nilai piksel menunjukkan nilai kategori yang menang. {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 dari kategori tersebut. {True, False} True
display_names_locale Menetapkan bahasa label yang akan digunakan untuk nama tampilan yang diberikan dalam metadata model tugas, jika tersedia. Defaultnya adalah en untuk bahasa Inggris. Anda dapat menambahkan label yang dilokalkan ke metadata model kustom menggunakan TensorFlow Lite Metadata Writer API Kode lokal id
result_callback Menetapkan pemroses hasil untuk menerima hasil segmentasi secara asinkron saat segmentasi gambar berada dalam mode live stream. Hanya dapat digunakan saat mode lari disetel ke LIVE_STREAM T/A T/A

Menyiapkan data

Siapkan input Anda sebagai file gambar atau array numpy, lalu konversikan menjadi 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

Segmentasi Gambar 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 tugas Segmentasi Gambar stempel waktu frame input.
  • Saat berjalan pada model gambar atau video, tugas Segmentasi Gambar akan memblokir thread saat ini hingga selesai memproses gambar atau frame input.

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

Menangani dan menampilkan hasil

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

Bagian berikut menunjukkan contoh data output dari tugas ini:

Keyakinan kategori

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

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

Nilai kategori

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

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