Python için resim segmentasyon kılavuzu

MediaPipe Image Segmenter görevi, arka plan bulanıklaştırma gibi görsel efektler uygulamak için resimleri önceden tanımlanmış kategorilere göre bölgelere ayırmanıza olanak tanır. Bu talimatlarda, Görüntü Segmentleyici'nin Python dilinde nasıl kullanılacağı gösterilmektedir. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel bakış bölümüne bakın.

Kod örneği

Görüntü Segmenteri'nin örnek kodunda, bu görevin Python'da tam bir uygulaması referans olarak verilmiştir. Bu kod, bu görevi test etmenize ve kendi görüntü segmentleyici uygulamanızı oluşturmaya başlamanıza yardımcı olur. Yalnızca web tarayıcınızı kullanarak Görüntü Segmentleyici örnek kodunu görüntüleyebilir, çalıştırabilir ve düzenleyebilirsiniz.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Resim Segmentleyici'yi kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi için Python için kurulum kılavuzu başlıklı makaleyi inceleyin. Bu örneğin kaynak kodunu GitHub'da inceleyebilirsiniz.

Paketler

MediaPipe Image Segmenter görevi için mediapipe paketi gereklidir. Gerekli bağımlılıkları aşağıdaki komutla yükleyebilirsiniz:

$ python -m pip install mediapipe

İçe aktarılanlar

Resim Segmentleyici görev işlevlerine erişmek için aşağıdaki sınıfları içe aktarın:

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

Model

MediaPipe Görüntü Segmentleyici görevi, bu görevle uyumlu bir eğitimli model gerektirir. Resim segmentleyici için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi edinmek istiyorsanız göreve genel bakıştaki Modeller bölümüne bakın.

Modeli seçip indirin ve proje dizininizde saklayın:

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

Model Adı parametresinde modelin yolunu aşağıda gösterildiği gibi belirtin:

base_options = BaseOptions(model_asset_path=model_path)

Görevi oluşturun

MediaPipe Görüntü Segmentasyon görevi, görevi ayarlamak için create_from_options işlevini kullanır. create_from_options işlevi, yapılandırma seçeneklerinin işleyeceği değerleri kabul eder. Görev yapılandırması hakkında daha fazla bilgi için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Bu örneklerde resimler, video dosyaları ve canlı video akışları için görev oluşturma varyasyonları da gösterilmektedir.

Resim

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:
  

Canlı yayın

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:
    

Yapılandırma seçenekleri

Bu görevde, Python uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:

Seçenek Adı Açıklama Değer Aralığı Varsayılan değer
running_mode Görevin çalışma modunu ayarlar. Üç mod vardır:

RESİM: Tek resim girişleri için kullanılan mod.

VIDEO: Bir videonun kod çözülmüş karelerinin modu.

LIVE_STREAM: Kameradan alınan giriş verilerinin canlı yayını için kullanılan mod. Bu modda, sonuçları asenkron olarak alacak bir dinleyici oluşturmak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask True olarak ayarlanırsa çıkış, her piksel değerinin kazanan kategori değerini gösterdiği uint8 görüntü olarak bir segmentasyon maskesi içerir. {True, False} False
output_confidence_masks True olarak ayarlanırsa çıkış, her kayan nokta değerinin kategorinin güven puanı haritasını temsil ettiği, kayan nokta değeri resmi olarak bir segmentasyon maskesi içerir. {True, False} True
display_names_locale Görevin modelinin meta verilerinde sağlanan görünen adlar için kullanılacak etiketlerin dilini belirler (varsa). Varsayılan değer, İngilizce için en'tir. TensorFlow Lite Meta Veri Yazıcı API'yi kullanarak özel bir modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz Yer kodu en
result_callback Sonuç dinleyiciyi, resim segmentörü LIVE_STREAM modundayken segmentasyon sonuçlarını asenkron olarak alacak şekilde ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında kullanılabilir. Yok Yok

Verileri hazırlama

Girişinizi resim dosyası veya numpy dizisi olarak hazırlayın, ardından mediapipe.Image nesnesine dönüştürün. Girişiniz bir video dosyası veya web kamerasından canlı yayınsa giriş karelerinizi numpy dizileri olarak yüklemek için OpenCV gibi harici bir kitaplık kullanabilirsiniz.

Resim

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

Canlı yayın

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

Resim Segmentleyici için verilerin hazırlanmasını gösteren bir kod örneği için kod örneğine bakın.

Görevi çalıştırma

Resim Segmentleyici, çıkarım tetiklemek için segment, segment_for_video ve segment_async işlevlerini kullanır. Görüntü segmentasyonu için bu işlem, giriş verilerini ön işleme, segmentasyon modelini çalıştırma ve ham model çıkışlarını segmentlere ayrılmış maskelere dönüştürmek için son işleme uygulamayı içerir.

Aşağıdaki kod örnekleri, görev modeliyle işlemenin nasıl yürütüleceğini gösterir.

Resim

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

Canlı yayın

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

Aşağıdakileri göz önünde bulundurun:

  • Video modunda veya canlı yayın modunda çalışırken Görüntü Segmentleyici görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
  • Görüntü veya video modelinde çalışırken Görüntü Segmentleyici görevi, giriş resmini veya kareyi işlemeye başlayana kadar mevcut iş parçacısını engeller.

Resim segmentleyici çıkarımlarını çalıştırmaya dair daha kapsamlı bir örnek için kod örneğine bakın.

Sonuçları işleme ve görüntüleme

Resim Segmentleyici, Image verilerinin bir listesini döndürür. output_type CATEGORY_MASK ise çıkış, uint8 resim olarak tek segmentli maske içeren bir liste olur. Piksel, giriş resminin tanınan kategori indeksini gösterir. output_type CONFIDENCE_MASK ise çıkış, kategori numarasının boyutuna sahip bir vektördür. Her segmentlere ayrılmış maske, kategoriye ait pikselin güven puanını temsil eden [0,1] aralığındaki bir kayan nokta görüntüsüdür.

Aşağıdaki bölümlerde, bu görevden elde edilen çıkış verilerine örnekler verilmiştir:

Kategori güveni

Aşağıdaki resimlerde, bir kategori güven maskesi için görev çıktısının görselleştirmesi gösterilmektedir. Güven maskesi çıkışı, [0, 1] arasında kayan değerler içerir.

Ata binen iki kız ve atın yanında yürüyen bir kız Önceki fotoğraftaki kızların ve atın şeklini ana hatlarıyla gösteren resim maskesi. Resmin sol yarısının dış çizgisi yakalanmış ancak sağ yarısı yakalanmamış

Orijinal resim ve kategori güven maskesi çıkışı. Pascal VOC 2012 veri kümesinden kaynak resim.

Kategori değeri

Aşağıdaki resimlerde, bir kategori değeri maskesi için görev çıktısının görselleştirmesi gösterilmektedir. Kategori maskesi aralığı [0, 255]'tür ve her piksel değeri, model çıktısının kazanan kategori dizinidir. Kazanan kategori dizini, modelin tanıyabildiği kategoriler arasında en yüksek puana sahip olan kategoridir.

Ata binen iki kız ve atın yanında yürüyen bir kız Önceki resimdeki kızların ve atın şeklini ana hatlarıyla gösteren resim maskesi. Üç kızın ve atın şekli doğru şekilde maskelenmelidir.

Orijinal resim ve kategori maskesi çıkışı. Pascal VOC 2012 veri kümesinden kaynak resim.