Android için nesne algılama rehberi

Nesne Algılama görevi, birden fazla nesne sınıfının varlığını ve konumunu algılamanıza olanak tanır. Örneğin, bir nesne algılayıcı bir resimdeki köpekleri bulabilir. Bu talimatlarda, Android'de Nesne Tarayıcısı görevinin nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz. Bu görevi çalışırken görmek için web demosunu inceleyebilirsiniz. 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 örnek kodu, Android için bir nesne algılama uygulamasının basit bir uygulamasıdır. Örnekte, nesneleri sürekli olarak algılamak için fiziksel bir Android cihazdaki kamera kullanılır. Nesneleri statik olarak algılamak için cihaz galerisindeki resim ve videolar da kullanılabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Nesne Tanımlayıcı örnek kodu GitHub'da barındırılmaktadı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, yalnızca nesne algılayıcı örnek uygulamasının dosyalarını içerecek şekilde seyrek kontrol kullanacak şekilde yapılandırın:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/object_detection/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, Nesne Tarayıcısı örnek uygulamasının önemli kodunu içerir:

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi Nesne Tarayıcısı'nı 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

Nesne algılayıcı, 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 Nesne Algılama görevi, bu görevle uyumlu bir eğitimli model gerektirir. Nesne Algılama 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 göz atı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. Kod örneği için sonraki bölüme bakın.

Görevi oluşturun

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. createFromOptions işlevi; çalışma modu, görünen adlar yerel ayarı, maksimum sonuç sayısı, güven eşiği, kategori izin verilenler listesi ve yasaklananlar listesi gibi yapılandırma seçeneklerini kabul eder. Yapılandırma seçeneği belirtilmezse varsayılan değer kullanılır. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırmaya Genel Bakış başlıklı makaleyi inceleyin.

Nesne algılama görevi 3 giriş veri türünü destekler: hareketsiz 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. Görevi nasıl oluşturacağınızı ve çıkarım işlemini nasıl çalıştıracağınızı görmek için giriş veri türünüze karşılık gelen sekmeyi seçin.

Resim

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.IMAGE)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

Video

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.VIDEO)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

Canlı yayın

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(model.tflite).build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setMaxResults(5)
    .setResultListener((result, inputImage) -> {
      // Process the detection result here.
    })
    .setErrorListener((result, inputImage) -> {
      // Process the classification errors here.
    })
   .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

Nesne algılayıcı ö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 ObjectDetectorHelper sınıfının setupObjectDetector() işlevinde 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
displayNamesLocales 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
maxResults Döndürülecek isteğe bağlı maksimum puana sahip algılama sonucu sayısını ayarlar. Tüm pozitif sayılar -1 (tüm sonuçlar döndürülür)
scoreThreshold Model meta verilerinde (varsa) sağlanan eşiği geçersiz kılan tahmin puanı eşiğini belirler. Bu değerin altındaki sonuçlar reddedilir. Herhangi bir kayan nokta Ayarlanmadı
categoryAllowlist İzin verilen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede bulunmayan algılama sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yok sayılır. Bu seçenek, categoryDenylist ile birbirini hariç tutar ve her ikisinin de kullanılması hatayla sonuçlanır. Herhangi bir dize Ayarlanmadı
categoryDenylist İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu grupta bulunan algılama sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yok sayılır. Bu seçenek, categoryAllowlist ile birlikte kullanılamaz. İkisinin birlikte kullanılması hataya neden olur. Herhangi bir dize Ayarlanmadı
resultListener Nesne algılayıcı canlı yayın modundayken sonuç dinleyicisini, algılama sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Bu seçeneği yalnızca runningMode parametresini LIVE_STREAM olarak ayarlarken kullanabilirsiniz. Geçerli değil Ayarlanmadı

Verileri hazırlama

Giriş resmini veya karesini Nesne Tarayıcısı'na iletmeden önce com.google.mediapipe.framework.image.MPImage nesnesine dönüştürmeniz gerekir.

Aşağıdaki örneklerde, mevcut veri türlerinin her biri için verilerin işlemeye nasıl hazırlanacağı açıklanmakta ve gösterilmektedir:

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 values. Use these values
// 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()
MPImage mpImage = new MediaImageBuilder(mediaImage).build();
    

Nesne algılayıcı örnek kodunda veri hazırlama işlemi, detectImage(), detectVideoFile(), detectLivestreamFrame() işlevleri içindeki ObjectDetectorHelper sınıfında gerçekleştirilir.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, söz konusu veri türüne özel ObjectDetector.detect...() yöntemini kullanın. Ayrı resimler için detect(), video dosyalarındaki kareler için detectForVideo() ve video akışları için detectAsync() kullanın. Bir video akışında algılama işlemi gerçekleştirirken kullanıcı arayüzü iş parçacığının engellenmesini önlemek için algılamaları ayrı bir iş parçacığında çalıştırdığınızdan emin olun.

Aşağıdaki kod örneklerinde, Nesne Bulucu'nun bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterilmektedir:

Resim

ObjectDetectorResult detectionResult = objectDetector.detect(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.
ObjectDetectorResult detectionResult =
    objectDetector.detectForVideo(image, frameTimestampMs);
    

Canlı yayın

// Run inference on the frame. The detection results will be available
// via the `resultListener` provided in the `ObjectDetectorOptions` when
// the object detector was created.
objectDetector.detectAsync(image, frameTimestampMs);
    

Nesne Algılama kodu örneğinde, bu modların her birinin detect(), detectVideoFile() ve detectAsync() uygulamalarının daha ayrıntılı bir görünümü gösterilmektedir. Örnek kod, kullanıcının işleme modları arasında geçiş yapmasına olanak tanır. Bu, kullanım alanınız için gerekli olmayabilir.

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

  • Video modunda veya canlı yayın modunda çalışırken Nesne Tarayıcısı görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
  • Nesne algılama görevi, resim veya video modunda çalışırken giriş resmini ya da kareyi işlemeye başlayana kadar mevcut iş parçacığını engeller. Mevcut ileti dizisinin engellenmesini önlemek için işlemeyi arka planda bir ileti dizisinde yürütün.
  • Canlı yayın modunda çalışırken nesne algılama görevi, geçerli 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. Nesne algılama görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa yeni giriş karesi yoksayılır.

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

Nesne algılama görevi, çıkarım çalıştırıldığında giriş görüntüsünde bulduğu nesneleri açıklayan bir ObjectDetectorResult nesnesi döndürür.

Aşağıda, bu görevin çıkış verilerine örnek verilmiştir:

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

Aşağıdaki resimde görev çıktısının görselleştirmesi gösterilmektedir:

Sınırlayıcı kutularla vurgulanan iki köpek

Nesne Algılama örnek kodunda, görevden döndürülen algılama sonuçlarının nasıl görüntüleneceği gösterilmektedir. Daha fazla bilgi için OverlayView sınıfına bakın.