Android için etkileşimli resim segmentasyon kılavuzu

MediaPipe Etkileşimli Resim Segmenter görevi, bir görüntüdeki konumu alır, bu konumdaki bir nesnenin sınırlarını tahmin eder ve nesne için segmentasyonu görüntü verisi olarak döndürür. Bu talimatlar, Etkileşimli Resim Segmenter'i Android uygulamalarıyla nasıl kullanacağınızı gösterir. 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 Etkileşimli Resim Segmenter uygulamasının basit bir uygulamasıdır. Örnek, cihaz galerisinden seçilen resimlerle çalışır.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Interactive Image Segmenter örnek kodu GitHub'da barındırılmaktadır.

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ırarak yalnızca Etkileşimli Resim Segmenti örnek uygulamasının dosyalarına sahip olabilirsiniz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/interactive_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:

Kurulum

Bu bölümde, geliştirme ortamınızı kurmanın temel adımları ve Etkileşimli 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

Etkileşimli 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 Etkileşimli Resim Segmenter görevi, bu görevle uyumlu, eğitilmiş bir model gerektirir. Etkileşimli 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 gösterilmiştir.

Etkileşimli Resim Segmenter örnek kodunda model, setupInteractiveSegmenter() işlevindeki InteractiveSegmenterHelper.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ürleri de dahil olmak üzere yapılandırma seçeneklerini kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırmaya Genel Bakış bölümüne bakın.

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

Bu görevi ayarlamayla ilgili daha ayrıntılı bir örnek için InteractiveSegmenterHelper sınıfı setupInteractiveSegmenter() işlevine bakın.

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
outputCategoryMask True olarak ayarlanırsa çıkış, uint8 resmi olarak bir segmentasyon maskesi içerir. Her piksel değeri, pikselin ilgilenilen alanda bulunan nesnenin bir parçası olup olmadığını gösterir. {True, False} False
outputConfidenceMasks True olarak ayarlanırsa çıkış, kayan değer resmi olarak bir segmentasyon maskesi içerir. Burada her kayan değer, pikselin ilgili alanda bulunan nesnenin bir parçası olduğuna dair güveni 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
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Belirlenmedi

Verileri hazırlama

Etkileşimli Resim Segmenti Aracı, resimlerle çalışır ve görev; yeniden boyutlandırma, döndürme ve değer normalleştirmesi dahil olmak üzere, veri girişi ön işlemesini gerçekleştirir. Giriş görüntüsünü göreve iletmeden önce bir com.google.mediapipe.framework.image.MPImage nesnesine dönüştürmeniz gerekir.

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();

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

Görevi çalıştırma

Tahmini çalıştırmak ve segment oluşturmak için segment işlevini çağırın. Etkileşimli Resim Segmenteri görevi, giriş görüntüsündeki tanımlanan segment bölgelerini döndürür.

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

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

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

Çıkarım çalıştırıldıktan sonra, Etkileşimli Resim 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 ayarlara bağlı olarak bir kategori maskesi, güven maskesi veya her ikisini birden içerebilir.

Aşağıdaki bölümlerde bu görevden elde edilen çıkış verileri daha ayrıntılı şekilde açıklanmaktadır:

Kategori maskesi

Aşağıdaki resimlerde, bir önemli noktanın belirtildiği bir kategori değeri maskesi için görev çıktısının görselleştirilmiş hali gösterilmektedir. Her bir piksel, pikselin ilgilenilen alanda bulunan nesnenin bir parçası olup olmadığını gösteren bir uint8 değeridir. İkinci resimdeki siyah beyaz daire, seçilen ilgi alanını gösterir.

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

Güven maskesi

Güven maskesi çıkışı, her bir görüntü giriş kanalı için [0, 1] arasında kayan değerler içerir. Daha yüksek değerler, resim pikselinin ilgili alanda bulunan nesnenin parçası olduğuna dair daha yüksek bir güven olduğunu gösterir.