Android için resim segmentasyon kılavuzu

MediaPipe Resim 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ızı sağlar. Bu talimatlarda, Android uygulamalarıyla Resim Segmenter'in nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış'a bakın.

Kod örneği

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

Örneklerde, canlı kamera feed'inde görüntü segmentasyonu gerçekleştirmek için fiziksel bir Android cihazın kamerası kullanılır veya resim ve videolar cihaz galerisinden seçebilirsiniz. Bu uygulamaları kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans alabilirsiniz. Resim Segmenter örnek kodu GitHub'da barındırılır.

Aşağıdaki bölümler, kategori maskesine sahip Resim Segmenter uygulamasıyla ilgilidir.

Kodu indirme

Aşağıdaki talimatlar, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınızı göstermektedir.

Ö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 az ödeme yöntemini kullanacak şekilde yapılandırın. Böylece yalnızca Image Segmenter örnek uygulamasına ait dosyalara 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 segmentasyon örnek uygulaması için önemli kodu içerir:

  • ImageSegmenterHelper.kt - Resim Segmenter görevini başlatır, modeli ve yetki verme işlemini gerçekleştirir.
  • CameraFragment.kt - Bir kamera için kullanıcı arayüzü ve denetim kodu sağlar.
  • GalleryFragment.kt - Resim ve video dosyalarının seçilmesi için kullanıcı arayüzü ve kontrol kodu sağlar.
  • OverlayView.kt - Segmentasyon sonuçlarını işler ve biçimlendirir.

Kurulum

Bu bölümde, geliştirme ortamınızı kurmanın temel adımları ve Resim Segmenter'ı kullanmak için kod projeleriniz açıklanmaktadır. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgiler için Android için kurulum kılavuzuna bakın.

Bağımlılıklar

Resim Segmenter, com.google.mediapipe:tasks-vision kitaplığını kullanır. Bu bağımlılığı, Android uygulaması geliştirme projenizin build.gradle dosyasına ekleyin. Gerekli bağımlılıkları aşağıdaki kodla içe aktarın:

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

Model

MediaPipe Resim Segmenter görevi, bu görevle uyumlu, eğitilmiş bir model gerektirir. Resim Segmenter için eğitilmiş modeller hakkında daha fazla bilgi almak isterseniz göreve genel bakış Modeller bölümüne bakın.

Modeli seçip indirin ve ardından proje dizininizde depolayın:

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

Modelin kullandığı yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın. Bu yöntem, bir sonraki bölümde yer alan kod örneğinde ele alınmaktadır.

Resim Segmenter örnek kodunda model, setupImageSegmenter() işlevindeki ImageSegmenterHelper.kt sınıfında tanımlanmıştır.

Görevi oluşturma

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. createFromOptions işlevi, maske çıkış türlerini de içeren yapılandırma seçeneklerini kabul eder. Görev yapılandırması hakkında daha fazla bilgi için Yapılandırma seçenekleri bölümüne bakın.

Resim Segmenter görevi şu giriş verisi türlerini destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş verisi türünüze karşılık gelen çalıştırma modunu belirtmeniz gerekir. Nasıl oluşturacağınızı görmek için giriş verisi türünüze ait sekmeyi 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 Segmenter örnek kod uygulaması, kullanıcının işleme modları arasında geçiş yapmasını sağlar. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve sizin kullanım alanınıza uygun olmayabilir. Bu kodu, setupImageSegmenter() işlevinin ImageSegmenterHelper sınıfında görebilirsiniz.

Yapılandırma seçenekleri

Bu görev, Android uygulamaları için aşağıdaki yapılandırma seçeneklerine sahiptir:

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 resimli girişler için mod.

VİDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.

LIVE_STREAM: Kamera gibi giriş verilerini içeren bir canlı yayın modu. Bu modda, sonuçları eşzamansız olarak almak üzere bir işleyici ayarlamak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
outputCategoryMask True olarak ayarlanırsa çıkış, uint8 görüntüsü olarak bir segmentasyon maskesi içerir. Her piksel değeri, kazanan kategori değerini gösterir. {True, False} False
outputConfidenceMasks True olarak ayarlanırsa çıktı, kayan değer resmi olarak bir segmentasyon maskesi içerir. Burada her kayan değer, kategorinin güven puanı haritasını temsil eder. {True, False} True
displayNamesLocale Varsa görev modelinin meta verilerinde sağlanan görünen adlar için kullanılacak etiketlerin dilini ayarlar. İngilizce için varsayılan değer en şeklindedir. TensorFlow Lite Metadata Writer API'yi kullanarak özel modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz Yerel ayar kodu en
resultListener Sonuç işleyiciyi, görüntü segmentleyici canlı yayın modundayken segmentasyon sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalıştırma modu LIVE_STREAM olarak ayarlandığında kullanılabilir Yok Yok
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Belirlenmedi

Verileri hazırlama

Resim Segmenter; resimler, video dosyası ve canlı video yayını ile çalışır. Görev; yeniden boyutlandırma, döndürme ve değer normalleştirmesi dahil olmak üzere, veri girişinin ön işlemesini yönetir.

Giriş resmini veya çerçevesini Resim Segmenter'a iletmeden önce bir 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 user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s 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 video’s metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. You’ll need them
// to calculate the timestamp of each frame later.

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

// Convert the Android’s Bitmap object to a MediaPipe’s 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 CameraX’s ImageAnalysis to continuously receive frames
// from the device’s camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

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

Resim Segmenter örnek kodunda, veri hazırlığı ImageSegmenterHelper sınıfında segmentLiveStreamFrame() işlevi tarafından işlenir.

Görevi çalıştırma

Kullandığınız çalıştırma 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ımlanan 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 Resim Segmenter görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
  • Resim veya video modunda çalışırken, Resim Segmenter görevi giriş resmini veya karesini işlemeyi bitirene kadar geçerli iş parçacığını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemeyi bir arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalışırken Resim Segmenter görevi mevcut ileti dizisini engellemez ancak hemen geri döner. Bir giriş karesini işlemeyi her tamamladığında algılama sonucuyla birlikte sonuç işleyicisini çağırır. Resim Segmenter görevi başka bir kareyi işlemekle meşgulken segmentAsync işlevi çağrılırsa görev yeni giriş çerçevesini yoksayar.

Resim Segmenter örnek kodunda, segment işlevleri ImageSegmenterHelper.kt dosyasında tanımlanmıştır.

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

Çıkarım çalıştırıldığında, Görüntü Segmenter görevi segmentasyon görevinin sonuçlarını içeren bir ImageSegmenterResult nesnesi döndürür. Çıkışın içeriği, görevi yapılandırırken ayarladığınız outputType değerine bağlıdır.

Aşağıdaki bölümlerde, bu görevden elde edilen çıkış verilerinin örnekleri gösterilmektedir:

Kategori güveni

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

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

Kategori değeri

Aşağıdaki resimlerde, bir kategori değeri maskesi için görev çıkışının görselleştirmesi gösterilmektedir. Kategori maskesi aralığı [0, 255] ve her piksel değeri, model çıktısının kazanan kategori dizinini temsil eder. Kazanan kategori dizini, modelin tanıyabileceği kategoriler arasında en yüksek puana sahiptir.

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