Panduan segmentasi gambar untuk Python

Tugas Segmentasi Gambar MediaPipe memungkinkan Anda membagi gambar ke dalam wilayah berdasarkan kategori untuk menerapkan efek visual seperti pemburaman latar belakang. Ini petunjuk menunjukkan cara menggunakan Image Segmenter dengan bahasa Python. Sebagai informasi lebih lanjut tentang kemampuan, model, dan opsi konfigurasi dari tugas ini, lihat Ringkasan.

Contoh kode

Kode contoh untuk Segmentasi Gambar menyediakan penerapan lengkap dari di Python untuk referensi Anda. Kode ini membantu Anda menguji tugas ini dan mendapatkan membuat aplikasi pengelompok gambar Anda sendiri. Anda dapat melihat, menjalankan, dan edit Segmentasi Gambar kode contoh hanya dengan menggunakan {i>browser<i} web.

Penyiapan

Bagian ini menjelaskan langkah-langkah utama untuk menyiapkan lingkungan pengembangan dan kode project secara khusus untuk menggunakan Segmentasi Gambar. 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 Segmentasi Gambar:

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 Anda. Untuk informasi selengkapnya tentang model terlatih yang tersedia untuk Segmentasi Gambar, lihat bagian ringkasan tugas, yaitu Models.

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 menangani opsi konfigurasi. Untuk informasi lebih lanjut tentang konfigurasi tugas, lihat Opsi konfigurasi.

Contoh-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 moda:

IMAGE: Mode untuk input gambar tunggal.

VIDEO: Mode untuk frame video yang didekode.

LIVE_STREAM: Mode untuk live stream input besar, seperti dari kamera. Dalam mode ini, resultListener harus dipanggil untuk menyiapkan pemroses yang akan 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 kategori pemenang dengan sejumlah nilai. {True, False} False
output_confidence_masks Jika ditetapkan ke True, output akan menyertakan mask segmentasi sebagai gambar nilai {i>float<i}, dengan setiap nilai {i>float<i} mewakili tingkat keyakinan skor kategori kategori. {True, False} True
display_names_locale Menyetel bahasa label yang akan digunakan untuk nama tampilan yang diberikan di 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 pembagi 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 melakukan live stream dari webcam, Anda dapat menggunakan library eksternal seperti OpenCV untuk memuat frame input sebagai 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 Segmentasi Gambar, lihat contoh kode.

Menjalankan tugas

Segmentasi Gambar menggunakan segment, segment_for_video, dan segment_async fungsi untuk memicu inferensi. Untuk segmentasi gambar, diperlukan pra-pemrosesan data, menjalankan model segmentasi, dan pascapemrosesan, output model mentah ke mask 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 dalam mode video atau mode live stream, Anda juga harus berikan stempel waktu {i>frame<i} input ke tugas Image Segmenter.
  • Saat berjalan dalam model gambar atau video, tugas Segmentasi Gambar akan memblokir utas saat ini hingga selesai memproses gambar input atau {i>frame<i}.

Untuk contoh yang lebih lengkap dari menjalankan inferensi Segmentasi Gambar, lihat contoh kode.

Menangani dan menampilkan hasil

Segmentasi Gambar menghasilkan daftar data Image. Jika output_type adalah CATEGORY_MASK, output-nya adalah daftar yang berisi mask bersegmen tunggal sebagai gambar uint8. Piksel menunjukkan indeks kategori gambar input yang dikenali. Jika output_type adalah CONFIDENCE_MASK, output-nya adalah vektor dengan ukuran nomor kategori. Masing-masing mask yang tersegmentasi adalah gambar mengambang dalam rentang [0,1], yang menunjukkan skor keyakinan piksel yang termasuk dalam kategori tersebut.

Bagian berikut menunjukkan contoh data output dari tugas ini:

Tingkat keyakinan kategori

Gambar berikut menunjukkan visualisasi output tugas untuk suatu kategori masker untuk kepercayaan diri. Output samaran berisi nilai float antara [0, 1].

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

Nilai kategori

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

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