Android için nesne algılama rehberi

Nesne Dedektörü görevi, birden fazla öğenin mevcut olup olmadığını düşünme egzersizlerini teşvik edersiniz. Örneğin, bir nesne dedektörü belirli bir yerde, görüntüsüdür. Bu talimatlar, cihazınızda Nesne Algılayıcı görevini nasıl Android Bu talimatlarda açıklanan kod örneğini şu adreste bulabilirsiniz: GitHub'a gidin. Bunu görüntüleyerek bu görevi uygulamalı olarak görebilirsiniz Web demosu. Ö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 örnek kodu, bir Nesne Dedektörü'nün kullanımı ve Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla nesneleri sürekli olarak algılar ve ayrıca fotoğraf makinelerinden cihaz galerisini kullanır.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. Nesne Algılayıcısı örnek kodu, GitHub'a gidin.

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, Dolayısıyla, 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 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, Object Detector için önemli kodu içerir örnek uygulama:

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili kod projelerini kullanır. Ş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

Nesne Algılayıcı 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 Nesne Dedektörü görevi bu görevi görebilir. Nesne Algılayıcı için eğitilen 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. 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. İlgili içeriği oluşturmak için kullanılan createFromOptions işlevi, çalıştırma da dahil olmak üzere yapılandırma seçeneklerini kabul eder mod, görünen adlar yerel ayarı, maksimum sonuç sayısı, güven eşiği, kategori izin verilenler listesi ve ret listeleri. Bir yapılandırma seçeneği belirtilmemişse 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ş verisi türünü destekler: hareketsiz görüntüler, video dosyaları ve canlı video akışları kullanılabilir. Hedefe uygun koşu modunu giriş verilerinin türünü belirler. Şuna karşılık gelen sekmeyi seçin: giriş veri türünüzü inceleyerek görevi nasıl oluşturacağınızı ve çıkarımda bulunacağınızı öğrenin.

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 Dedektörü ö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 ObjectDetectorHelper setupObjectDetector() sınıf işlevi.

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
displayNamesLocales 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
maxResults İsteğe bağlı maksimum üst puanlı algılama sonucu sayısını şu değere ayarlar: dön. Pozitif sayılar -1 (tüm sonuçlar döndürülür)
scoreThreshold Şu kriterde sağlanan tahmini geçersiz kılan bir tahmin puanı eşiğini belirler: model meta verileri (varsa). 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ı filtrelendi. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek categoryDenylist ile birlikte kullanılamaz ve her ikisi de hataya neden olur. Tüm dizeler Ayarlanmadı
categoryDenylist İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Eğer Boş olmayan, kategori adı bu kümede bulunan algılama sonuçları filtrelenir çıkar. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek birlikte hariç tutmanın yanı sıra her iki sonucun da hatalı olarak kullanılmasıdır.categoryAllowlist Tüm dizeler Ayarlanmadı
resultListener Sonuç işleyiciyi algılama sonuçlarını alacak şekilde ayarlar nesne algılayıcı canlı yayındayken eşzamansız olarak yatırım yapmanız önemlidir. Bu seçeneği yalnızca runningMode'u LIVE_STREAM olarak ayarladığınızda kullanabilirsiniz. Geçerli değil Ayarlanmadı

Verileri hazırlama

Giriş resmini veya çerçevesini com.google.mediapipe.framework.image.MPImage nesnesini Nesne Algılayıcı.

Aşağıdaki örneklerde verilerin işlenmek üzere nasıl hazırlanacağı açıklanmakta ve gösterilmektedir tıklayın:

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ısı örnek kodunda, veri hazırlığı ObjectDetectorHelper detectImage(), detectVideoFile(), detectLivestreamFrame() içindeki sınıf işlevlerine dahildir.

Görevi çalıştırma

Üzerinde çalıştığınız veri türüne bağlı olarak ObjectDetector.detect...() yöntemini çağırın. Tekliflerinizi otomatikleştirmek ve optimize etmek için Ayrı resimler için detect(), Video dosyalarındaki kareler için detectForVideo() ve Video akışları için detectAsync(). Bir makinede algılamalar bu sorunu önlemek için algılamaları ayrı bir iş parçacığında çalıştırdığınızdan emin olun. ileti dizisi engelleniyor.

Aşağıdaki kod örnekleri, Object Detector'ın nasıl çalıştırılacağına ilişkin basit örnekleri gösterir şu farklı veri modlarında kullanabilirsiniz:

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ı kodu örneği, bu özelliklerden her birinin, hakkında daha fazla bilgi edinin detect() detectVideoFile(), ve detectAsync(). Örnek kod, kullanıcının işleme modları arasında geçiş yapmasını sağlar 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 şunları da yapmanız gerekir: Giriş çerçevesinin zaman damgasını Nesne Algılayıcı görevine sağlar.
  • Görüntü veya video modunda çalışırken Nesne Dedektörü görevi, giriş resmini işlemeyi bitirene kadar geçerli iş parçacığını engeller veya çerçeve. Mevcut iş parçacığının engellenmesini önlemek için işlemeyi arka plan ileti dizisi.
  • Canlı yayın modunda çalışırken Nesne Algılayıcı görevi, devam eder, ancak hemen geri döner. Sonucunu çağırır algılama sonucuyla birlikte gelen bir hata dinleyicisidir. giriş çerçevesine sahip. Nesne Dedektörü görevi başka bir kareyi işlemekle meşgulse yeni giriş çerçevesi yoksayılacak.

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

Çıkarım çalıştırıldığında, Nesne Algılayıcı görevi bir Bulunduğu nesneleri açıklayan ObjectDetectorResult nesnesi giriş resmine bakalım.

Aşağıda, bu görevdeki çı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örselleştirmesi gösterilmektedir:

Nesne Algılayıcısı örnek kodu, algılamanın nasıl görüntüleneceğini daha fazla bilgi edinmek için OverlayView inceleyebilirsiniz.