Android için resim segmentasyon kılavuzu

MediaPipe Resim Segmenter görevi, görüntüleri önceden tanımlanmış öğelere göre bölgelere bölmenizi sağlar. kategorilerden en iyi şekilde yararlanabilirsiniz. Bu talimatlarında, Android uygulamalarında Resim Segmenter'ın nasıl kullanılacağı gösterilmektedir. Kod bu talimatlarda açıklanan örneği şurada bulabilirsiniz: GitHub'a gidin. Özellikler, modeller ve yapılandırma seçenekleri hakkında daha fazla bilgi Bu görev hakkında daha fazla bilgi için Genel Bakış'ı inceleyin.

Kod örneği

MediaPipe Tasks kod örneği, bir Android için Resim Segmenter uygulaması:

Örnekler, fiziksel bir Android cihazın kamerasını kullanarak canlı kamera feed'inde resim segmentasyonu yapabilir veya cihaz galerisinden video ekleyin. Bu uygulamaları ekip üyelerinizle birlikte konuşup veya mevcut bir uygulamada değişiklik yaparken bu uygulamalara başvurabilirsiniz. İlgili içeriği oluşturmak için kullanılan Resim Segmenter örnek kodu şurada barındırılır: GitHub'a gidin.

Aşağıdaki bölümlerde, Kategori maskesi içeren Resim Segmenter'ı uygulamasını indirin.

Kodu indirme

Aşağıdaki talimatlarda, örneğin yerel bir kopyasını nasıl oluşturacağınız gösterilmektedir kodu oluşturmak için git komut satırı aracını kullanın.

Ö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 yöntemini kullanacak şekilde yapılandırın, Böylece, yalnızca Resim Segmenter örnek uygulamasına ait dosyaları bulursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_segmentation/android
    

Örnek kodun yerel sürümünü oluşturduktan sonra projeyi içe aktarabilirsiniz. Android Studio'ya gidip uygulamayı çalıştırın. Talimatlar için Android için Kurulum Kılavuzu.

Temel bileşenler

Aşağıdaki dosyalar bu resim için önemli kodu içeriyor segmentasyon örneği uygulaması:

  • ImageSegmenterHelper.kt - Resim Segmenter görevini başlatır, modeli ve yetki verme işlemini yürütür seçim.
  • CameraFragment.kt - Kamera için kullanıcı arayüzü ve kontrol kodunu sağlar.
  • GalleryFragment.kt: Resim ve video seçimi için kullanıcı arayüzü ve kontrol kodunu sağlar dosyası olarak da kaydedebilir.
  • OverlayView.kt - Segmentasyon sonuçlarını ele alır ve biçimlendirir.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Resim Segmenter'ı kullanmak için proje kodlayın. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı daha fazla bilgi için Android için kurulum kılavuzu.

Bağımlılıklar

Resim Segmenter, com.google.mediapipe:tasks-vision kitaplığını kullanır. Bunu ekle dosyanızın build.gradle dosyasına bağımlılığı Android uygulama geliştirme projesi. Gerekli bağımlılıkları şu kodu kullanın:

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

Model

MediaPipe Resim Segmenter görevi bu görevi görebilir. Resim Segmenter için eğitilmiş mevcut modeller hakkında daha fazla bilgi için göreve genel bakış Modeller bölümü.

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

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

Yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın modeli tarafından kullanılır. Bu yöntem, bölümüne bakın.

Resim Segmenter'de örnek kod, model, ImageSegmenterHelper.kt sınıfını görüntülemek için setupImageSegmenter() işlevine ekleyin.

Görevi oluşturma

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. İlgili içeriği oluşturmak için kullanılan createFromOptions işlevi, maske çıkışı dahil yapılandırma seçeneklerini kabul eder bulunur. Görev yapılandırması hakkında daha fazla bilgi için bkz. Yapılandırma seçenekleri.

Resim Segmenter görevi şu giriş verisi türlerini destekler: sabit resimler, video dosyaları ve canlı video akışları kullanılabilir. Koşu modunu belirtmelisiniz giriş veri türünüze karşılık gelen bir e-posta alırsınız. Sekmeyi seçin bu görevin nasıl oluşturulacağını görebilirsiniz.

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 farklı olabilir. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale kullanım alanınıza uygun olmayabilir. Bu kodu ImageSegmenterHelper setupImageSegmenter() işlevine göre sınıflandırılır.

Yapılandırma seçenekleri

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

Seçenek Adı Açıklama Değer Aralığı Varsayılan Değer
runningMode Görev için çalışma modunu ayarlar. Üç tane var modlar:

IMAGE: Tek resimli giriş modu.

VIDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.

LIVE_STREAM: Giriş canlı yayını modu kameradan alınan veriler gibi. Bu modda, resultListener, sonuçları almak üzere bir dinleyici ayarlamak için çağrıldı eşzamansız olarak ayarlayabilirsiniz.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
outputCategoryMask True olarak ayarlanırsa çıkışta segmentasyon maskesi bulunur. her piksel değeri kazanan kategoriyi gösteren bir uint8 resmi olarak değer. {True, False} False
outputConfidenceMasks True olarak ayarlanırsa çıkışta segmentasyon maskesi bulunur. her kayan değerin güveni temsil ettiği bir kayan değer resmi olarak ve puan eşlemesini seçin. {True, False} True
displayNamesLocale görev modelinin meta verileri (varsa). Şunun için varsayılan: en İngilizce. Özel bir modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz TensorFlow Lite Metadata Writer API'yi kullanarak Yerel ayar kodu en
resultListener Sonuç işleyiciyi segmentasyon sonuçlarını alacak şekilde ayarlar Resim segmentleyici LIVE_STREAM modundayken eşzamansız olarak. Yalnızca koşu 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

Resim Segmenter; resimler, video dosyaları ve canlı video yayınları ile çalışır. Görev yeniden boyutlandırma, döndürme ve değer de dahil olmak üzere veri girişi ön işlemesini gerçekleştirir. yapabilirsiniz.

Giriş resmini veya çerçevesini com.google.mediapipe.framework.image.MPImage nesnesini Resim Segmenter.

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 segmentLiveStreamFrame() işlevine göre sınıflandırılır.

Görevi çalıştırma

Kullandığınız koşu moduna göre farklı bir segment işlevini çağırıyorsunuz. Resim Segmenter işlevi, giriş resmini veya çerçevesini seçin.

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 şunları da yapmanız gerekir: Resim Segmenter görevine giriş çerçevesinin zaman damgasını sağlar.
  • Resim veya video modunda çalışırken Resim Segmenter görevi giriş resmini işlemeyi tamamlayana kadar geçerli iş parçacığını engeller veya çerçeve. Kullanıcı arayüzünü engellememek için işlemeyi arka plan ileti dizisi.
  • Canlı yayın modunda çalışırken Resim Segmenter görevi, devam eder, ancak hemen geri döner. Sonucunu çağırır algılama sonucuyla birlikte bir izleme sunucusuyla giriş çerçevesine sahip. Resim Segmenter aracı olduğunda segmentAsync işlevi çağrılırsa görev başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayar.

Resim Segmenter örnek kodunda, segment işlevleri ImageSegmenterHelper.kt dosyası olarak kaydedebilirsiniz.

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

Çıkarım çalıştırıldığında, Resim Segmenter görevi bir ImageSegmenterResult döndürür. segmentasyon görevinin sonuçlarını içeren nesne. The content of the çıkış, yapılandırma sırasında ayarladığınız outputType değerine bağlıdır. Görevi yapılandırdınız.

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

Kategori güveni

Aşağıdaki resimlerde, bir kategori için görev çıkışının görselleştirmesi gösterilmektedir güven maskesi oluşturabilirsiniz. Güven maskesi çıkışı, [0, 1]

Orijinal resim ve kategori güven maskesi çıktısı. Şuradaki kaynak resim: VOC 2012'nin Paskalası veri kümesiyle birlikte kullanılamaz.

Kategori değeri

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

Orijinal resim ve kategori maskesi çıktısı. Şuradaki kaynak resim: VOC 2012'nin Paskalası veri kümesiyle birlikte kullanılamaz.