Android için nesne algılama rehberi

Nesne Algılayıcı görevi, birden fazla nesne sınıfının varlığını ve konumunu tespit etmenize olanak tanır. Örneğin, bir nesne algılayıcı, bir görüntünün içindeki köpeklerin yerini belirleyebilir. Bu talimatlar, Android'de Nesne Dedektörü görevinin nasıl kullanılacağını gösterir. Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz. Bu Web demosunu görüntüleyerek bu görevi çalışırken görebilirsiniz. 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 örnek kodu, Android için Nesne Algılayıcı uygulamasının basit bir uygulamasıdır. Örnekte, nesneleri sürekli olarak algılamak için fiziksel bir Android cihazın kamerası kullanılır. Ayrıca, nesnelerin statik olarak algılanması 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 başvuruda bulunabilirsiniz. Nesne Algılayıcı örnek kodu GitHub'da barındırılı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ırın. Böylece yalnızca Nesne Algılayıcı örnek uygulamasına ait dosyalara sahip olursunuz:
    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 Algılayıcı örnek uygulaması için önemli kodu içerir:

Kurulum

Bu bölümde, Nesne Algılayıcı'yı kullanmak için geliştirme ortamınızı ve kod projelerinizi ayarlamanın temel adımları 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

Nesne Algılayıcı, 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 Nesne Dedektörü görevi için bu görevle uyumlu, eğitilmiş bir model gerekir. Nesne Algılayıcı için eğitilmiş modeller hakkında daha fazla bilgi edinmek için 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. Kod örneği için sonraki bölüme bakın.

Görevi oluşturma

Görevi oluşturmak için createFromOptions işlevini kullanabilirsiniz. createFromOptions işlevi; çalıştırma modu, görünen adlar yerel ayarı, maksimum sonuç sayısı, güven eşiği, kategori izin verilenler listesi ve reddedilenler listesi gibi yapılandırma seçeneklerini kabul eder. Bir 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ış bölümüne bakın.

Nesne Algılayıcı görevi 3 giriş veri türünü 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ışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarımı nasıl yapacağınızı görmek için giriş verisi 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ı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 ObjectDetectorHelper sınıfı setupObjectDetector() işlevinde 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
displayNamesLocales 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
maxResults İsteğe bağlı olarak döndürülecek en yüksek puanlı algılama sonuçlarının isteğe bağlı maksimum sayısını ayarlar. Pozitif sayılar -1 (tüm sonuçlar döndürülür)
scoreThreshold Model meta verilerinde belirtilen eşiği (varsa) geçersiz kılan tahmin puanı eşiğini ayarlar. Bu değerin altındaki sonuçlar reddedilir. Tüm kayan Belirlenmedi
categoryAllowlist İsteğe bağlı olarak izin verilen kategori adları listesini ayarlar. Boş değilse kategori adı bu grupta yer almayan algılama sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek, categoryDenylist ile birlikte kullanılamaz ve her iki sonucun da kullanılması hataya neden olur. Herhangi bir dize Belirlenmedi
categoryDenylist İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede yer alan algılama sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek categoryAllowlist ile birlikte kullanılamaz ve her iki sonucun da kullanılması hataya neden olur. Herhangi bir dize Belirlenmedi
resultListener Sonuç işleyiciyi, nesne dedektörü canlı yayın modundayken algılama sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Bu seçeneği yalnızca runningMode ayarını LIVE_STREAM olarak ayarladığınızda kullanabilirsiniz. Geçerli değil Belirlenmedi

Verileri hazırlama

Giriş resmini veya çerçevesini Nesne Algılayıcı'ya iletmeden önce bir 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şlenmek üzere 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 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 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 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()
MPImage mpImage = new MediaImageBuilder(mediaImage).build();
    

Nesne Algılayıcı örnek kodunda, veri hazırlığı detectImage(), detectVideoFile() ve detectLivestreamFrame() işlevlerindeki ObjectDetectorHelper sınıfında ele alınır.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, ilgili 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 yaparken 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 örnekleri, Nesne Algılayıcı'nın bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterir:

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ılayıcı kod örneğinde, bu modların detect(), detectVideoFile() ve detectAsync() uygulamaları daha ayrıntılı bir şekilde gösterilmektedir. Örnek kod, kullanıcının işleme modları arasında geçiş yapmasını sağlar. Bu, kullanım alanınızda gerekli olmayabilir.

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

  • Video modunda veya canlı yayın modunda çalışırken Nesne Algılayıcı görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
  • Nesne Algılayıcı görevi, görüntü veya video modunda çalışırken giriş görüntüsünü veya karesini işlemeyi bitirene kadar geçerli iş parçacığını engeller. Geçerli iş parçacığını engellemekten kaçınmak için işlemeyi bir arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalışırken Nesne Algılayıcı görevi mevcut iş parçacığını engellemez ancak hemen geri döner. Bir giriş karesini işlemeyi her tamamladığında algılama sonucuyla birlikte sonuç işleyicisini çağırır. Nesne Algılayıcı görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa yeni giriş çerçevesi yoksayılır.

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

Çıkarım yaptıktan sonra, Nesne Algılayıcısı görevi, giriş görüntüsünde bulduğu nesneleri açıklayan bir ObjectDetectorResult nesnesi döndürür.

Aşağıda, bu görevden alınan çıkış verilerinin bir örneği gösterilmektedir:

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 çıkışının görseli gösterilmektedir:

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