Android 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 Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz. 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

MediaPipe Tasks kod örneği, Android için bir resim segmentleyici uygulamasının iki basit uygulamasını içerir:

Örneklerde, canlı kamera feed'inde görüntü segmentasyonu yapmak için fiziksel bir Android cihazdaki kamera kullanılır. Dilerseniz cihaz galerisinden resim ve video da seçebilirsiniz. Bu uygulamaları kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken bu uygulamalara başvurabilirsiniz. Resim Segmentleyici örnek kodu GitHub'da barındırılır.

Aşağıdaki bölümlerde, Kategori maskesi içeren resim segmentleyici uygulaması ele alınmaktadır.

Kodu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasının nasıl oluşturulacağı gösterilmektedir.

Örnek kodu indirmek için:

  1. Aşağıdaki komutu kullanarak git deposunu klonlayın:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. İsteğe bağlı olarak, git örneğinizi seyrek ödeme özelliğini kullanacak şekilde yapılandırın. Böylece yalnızca Resim Segmentörü örnek uygulamasının dosyalarına sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_segmentation/android
    

Örnek kodun yerel bir sürümünü oluşturduktan sonra projeyi Android Studio'ya aktarabilir ve uygulamayı çalıştırabilirsiniz. Talimatlar için Android için Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu resim segmentasyonu örnek uygulamasının önemli kodunu içerir:

  • ImageSegmenterHelper.kt: Görüntü segmentasyon görevini başlatır, modeli ve temsilci seçimini yönetir.
  • CameraFragment.kt: Bir kameranın kullanıcı arayüzünü ve kontrol kodunu sağlar.
  • GalleryFragment.kt: Resim ve video dosyalarını seçmeyle ilgili kullanıcı arayüzünü ve kontrol kodunu sağlar.
  • OverlayView.kt: Segmentasyon sonuçlarını işler ve biçimlendirir.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi Görüntü 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 Android için kurulum kılavuzu başlıklı makaleyi inceleyin.

Bağımlılıklar

Resim Segmentleyici, com.google.mediapipe:tasks-vision kitaplığını kullanır. Bu bağımlılık, Android uygulama geliştirme projenizin build.gradle dosyasına eklenmelidir. Aşağıdaki kodla gerekli bağımlılıkları içe aktarın:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Model

MediaPipe Görüntü Segmentleyici görevi, bu görevle uyumlu bir eğitimli model gerektirir. Resim segmentleyici için mevcut eğitimli 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:

<dev-project-root>/src/main/assets

Modelin kullandığı yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın. Bu yöntem, sonraki bölümdeki kod örneğinde belirtilmiştir.

Görsel Segmentleyici örnek kodunda model, setupImageSegmenter() işlevindeki ImageSegmenterHelper.kt sınıfında tanımlanır.

Görevi oluşturun

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. createFromOptions işlevi, maske çıkışı türleri dahil olmak üzere yapılandırma seçeneklerini kabul eder. Görev yapılandırması hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Görüntü Segmentleyici görevi, aşağıdaki giriş veri türlerini destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş veri türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Bu görevin nasıl oluşturulacağını görmek için giriş veri türünüzün sekmesini seçin.

Resim

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

Video

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

Canlı yayın

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })
    .build()
imagesegmenter = ImageSegmenter.createFromOptions(context, options)
    

Resim Segmentleyici örnek kod uygulaması, kullanıcının işleme modları arasında geçiş yapmasına olanak tanır. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve kullanım alanınız için uygun olmayabilir. Bu kodu, setupImageSegmenter() işlevinin bulunduğu ImageSegmenterHelper sınıfında görebilirsiniz.

Yapılandırma seçenekleri

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

Seçenek Adı Açıklama Değer Aralığı Varsayılan değer
runningMode 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
outputCategoryMask 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
outputConfidenceMasks 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
displayNamesLocale 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
resultListener 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
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Ayarlanmadı

Verileri hazırlama

Görüntü Segmentleyici, resimler, video dosyaları ve canlı yayın videolarıyla çalışır. Görev, yeniden boyutlandırma, döndürme ve değer normalleştirme dahil olmak üzere veri girişi ön işleme işlemlerini yönetir.

Giriş resmini veya çerçevesini Görüntü Segmentleyici'ye iletmeden önce com.google.mediapipe.framework.image.MPImage nesnesine dönüştürmeniz gerekir.

Resim

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

Video

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load a video file on the user's device using MediaMetadataRetriever

// From the videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. Youll need them
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

Canlı yayın

import com.google.mediapipe.framework.image.MediaImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Create a CameraXs ImageAnalysis to continuously receive frames
// from the devices camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Androids ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Androids Image object and convert it to
// a MediaPipes Image object.
android.media.Image mediaImage = imageProxy.getImage()
Image mpImage = new MediaImageBuilder(mediaImage).build();
    

Görsel Segmentleyici örnek kodunda veri hazırlama işlemi, segmentLiveStreamFrame() işlevi tarafından ImageSegmenterHelper sınıfında gerçekleştirilir.

Görevi çalıştırma

Kullandığınız çalışma moduna bağlı olarak farklı bir segment işlevi çağırırsınız. Resim Segmentleyici işlevi, giriş resmi veya çerçevesi içindeki tanımlanmış segment bölgelerini döndürür.

Resim

ImageSegmenterResult segmenterResult = imagesegmenter.segment(image);
    

Video

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ImageSegmenterResult segmenterResult =
    imagesegmenter.segmentForVideo(image, frameTimestampMs);
    

Canlı yayın

// Run inference on the frame. The segmentations results will be available via
// the `resultListener` provided in the `ImageSegmenterOptions` when the image
// segmenter was created.
imagesegmenter.segmentAsync(image, frameTimestampMs);
    

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.
  • Resim veya video modunda çalışırken Resim Segmentleyici görevi, giriş resmini veya kareyi işlemeyi tamamlayana kadar mevcut iş parçacığını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemeyi arka plan iş parçacığında yürütün.
  • Görüntü Segmentleyici görevi, canlı yayın modunda çalışırken mevcut iş parçacığını engellemez ancak hemen döndürülür. Her giriş çerçevesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. Resim Segmentleyici görevi başka bir kareyi işlemekle meşgulken segmentAsync işlevi çağrılırsa görev yeni giriş karesini yoksayar.

Resim Segmenteri örnek kodunda segment işlevleri ImageSegmenterHelper.kt dosyasında tanımlanır.

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

Tahmin çalıştırıldığında Görüntü Segmentör görevi, segmentasyon görevinin sonuçlarını içeren bir ImageSegmenterResult nesnesi döndürür. Çıktının içeriği, görevi yapılandırırken belirlediğiniz outputType değerine bağlı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.