Android için görüntü sınıflandırma kılavuzu

MediaPipe Görüntü Sınıflandırıcı görevi, görüntüler üzerinde sınıflandırma yapmanıza olanak tanır. Bu görevi, eğitim zamanında tanımlanan bir dizi kategori arasından bir resmin neyi temsil ettiğini belirlemek için kullanabilirsiniz. Bu talimatlarda, Resim Sınıflandırıcı'nın Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz.

Web demosunu görüntüleyerek bu görevin nasıl yerine getirildiğini öğrenebilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış bölümünü inceleyin.

Kod örneği

MediaPipe Tasks örnek kodu, Android için bir Resim Sınıflandırıcı uygulamasının basit bir kullanımıdır. Örnekte, nesneleri sürekli olarak sınıflandırmak için fiziksel bir Android cihazdaki kamera kullanılmaktadır. Ayrıca, nesneleri statik olarak sınıflandırmak 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. Resim Sınıflandırıcı örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınız 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 seyrek ödeme yöntemini kullanacak şekilde yapılandırın. Böylece, yalnızca Resim Sınıflandırıcı örnek uygulamasına ait dosyalara sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_classification/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 dosyalarda, bu görüntü sınıflandırma örnek uygulaması için önemli kodlar bulunur:

Kurulum

Bu bölümde, geliştirme ortamınızı kurma ve projelerinizi Görüntü Sınıflandırıcı'yı kullanacak şekilde kodlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri de dahil olmak üzere MediaPipe görevlerini kullanmak üzere geliştirme ortamınızı ayarlama hakkında genel bilgiler için Android için kurulum kılavuzuna bakın.

Bağımlılıklar

Resim Sınıflandırıcı, com.google.mediapipe:tasks-vision kitaplığını kullanır. Bu bağımlılığı Android uygulama geliştirme projenizin build.gradle dosyasına ekleyin. Aşağıdaki kodu kullanarak gerekli bağımlılıkları içe aktarın:

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

Model

MediaPipe Görüntü Sınıflandırıcı görevi, bu görevle uyumlu olan eğitilmiş bir model gerektirir. Resim Sınıflandırıcı için eğitilmiş modeller hakkında daha fazla bilgi için göreve genel bakış Modeller bölümüne bakın.

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

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

Model tarafından kullanılan yolu belirtmek için BaseOptions.Builder.setModelAssetPath() yöntemini kullanın. Bu yöntem, bir sonraki bölümde yer alan kod örneğinde açıklanmıştır.

Resim Sınıflandırıcı örnek kodunda, model ImageClassifierHelper.kt dosyasında tanımlanmıştır.

Görevi oluşturma

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 ve kategoriye izin verilenler listesi veya reddetme listesi 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.

Resim Sınıflandırıcı görevi, 3 giriş verisi türünü destekler: hareketsiz resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş verilerinizin türüne karşılık gelen çalışma modunu belirtmeniz gerekir. Görevin nasıl oluşturulacağını ve çıkarımda bulunulacağını görmek için giriş verisi türünüze karşılık gelen sekmeyi seçin.

Resim

ImageClassifierOptions options =
  ImageClassifierOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setMaxResults(5)
    .build();
imageClassifier = ImageClassifier.createFromOptions(context, options);
    

Video

ImageClassifierOptions options =
  ImageClassifierOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setMaxResults(5)
    .build();
imageClassifier = ImageClassifier.createFromOptions(context, options);
    

Canlı yayın

ImageClassifierOptions options =
  ImageClassifierOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setMaxResults(5)
    .setResultListener((result, inputImage) -> {
         // Process the classification result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the classification errors here.
    })
    .build()
imageClassifier = ImageClassifier.createFromOptions(context, options)
    

Resim Sınıflandırı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 sizin kullanım alanınız için uygun olmayabilir. Bu kodu ImageClassifierHelper.kt dosyasının setupImageClassifier() işlevinde görebilirsiniz.

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. Üç mod vardır:

IMAGE: Tek resimli girişlerin modu.

VİDEO: Bir videonun kodu çözülmüş karelerine yönelik mod.

LIVE_STREAM: Giriş verilerinin canlı yayınlanması (ör. kameradan) modu. Bu modda, sonuçları eşzamansız olarak alacak bir işleyici ayarlamak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
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 dil en şeklindedir. TensorFlow Lite Metadata Writer API'yi kullanarak özel modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz. Yerel ayar kodu en
maxResults Döndürülecek isteğe bağlı maksimum puanlı sınıflandırma sonucu sayısını ayarlar. 0'dan küçükse tüm mevcut sonuçlar döndürülür. Pozitif sayılar -1
scoreThreshold Model meta verilerinde (varsa) belirtilen 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 Belirlenmedi
categoryAllowlist İzin verilen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede bulunmayan sınıflandırma 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ında hatayla sonuçlanır. Tüm dizeler Belirlenmedi
categoryDenylist İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede bulunan sınıflandırma sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek categoryAllowlist ile karşılıklı olarak hariç tutulup her iki sonucun da hatalı olarak kullanılmasıdır. Tüm dizeler Belirlenmedi
resultListener Sonuç işleyiciyi, Görüntü Sınıflandırıcı canlı yayın modundayken sınıflandırma sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca koşu modu LIVE_STREAM olarak ayarlandığında kullanılabilir Yok Belirlenmedi
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Belirlenmedi

Verileri hazırlama

Resim Sınıflandırıcı; resimler, video dosyaları ve canlı yayın videoları ile çalışır. 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ş resmini veya çerçeveyi, Resim Sınıflandırıcı'ya iletmeden önce bir com.google.mediapipe.framework.image.MPImage nesnesine dönüştürmeniz gerekir.

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 Sınıflandırıcı örnek kodunda, veri hazırlama işlemi ImageClassifierHelper.kt dosyasında gerçekleştirilir.

Görevi çalıştırma

Çıkarımları tetiklemek için koşu modunuza karşılık gelen classify işlevini çağırabilirsiniz. Image Classifier API, giriş görüntüsünün veya çerçevesinin içindeki nesne için olası kategorileri döndürür.

Resim

ImageClassifierResult classifierResult = imageClassifier.classify(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.
ImageClassifierResult classifierResult =
    imageClassifier.classifyForVideo(image, frameTimestampMs);
    

Canlı yayın


// Run inference on the frame. The classifications results will be available 
// via the `resultListener` provided in the `ImageClassifierOptions` when 
// the image classifier was created.
imageClassifier.classifyAsync(image, frameTimestampMs);
    

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

  • Video modunda veya canlı yayın modunda çalışırken Resim Sınıflandırıcı görevine giriş çerçevesinin zaman damgasını da sağlamanız gerekir.
  • Görüntü veya video modunda çalışırken, Resim Sınıflandırıcı görevi giriş resmini veya kareyi işlemeyi bitirene kadar geçerli iş parçacığını engeller. Kullanıcı arayüzünü engellememek için işlemeyi bir arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalışırken Görüntü Sınıflandırıcı görevi mevcut ileti dizisini engellemez ancak hemen geri döner. Bir giriş çerçevesini işlemeyi her bitirdiğinde, algılama sonucuyla birlikte sonuç işleyicisini çağırır. Resim Sınıflandırıcı görevi başka bir kareyi işlemekle meşgulken classifyAsync işlevi çağrılırsa görev, yeni giriş çerçevesini yoksayar.

Resim Sınıflandırıcı örnek kodunda, classify işlevleri ImageClassifierHelper.kt dosyasında tanımlanmıştır.

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

Çıkarım çalıştırıldıktan sonra Resim Sınıflandırıcı görevi, giriş görüntüsü veya çerçevesindeki nesneler için olası kategorilerin listesini içeren bir ImageClassifierResult nesnesi döndürür.

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

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

Bu sonuç, aşağıdaki cihazda Bird Classifier çalıştırılarak elde edilmiştir:

Resim Sınıflandırıcı örnek kodunda, ClassificationResultsAdapter.kt dosyasındaki ClassificationResultsAdapter sınıfı sonuçları işler:

fun updateResults(imageClassifierResult: ImageClassifierResult? = null) {
    categories = MutableList(adapterSize) { null }
    if (imageClassifierResult != null) {
        val sortedCategories = imageClassifierResult.classificationResult()
            .classifications()[0].categories().sortedBy { it.index() }
        val min = kotlin.math.min(sortedCategories.size, categories.size)
        for (i in 0 until min) {
            categories[i] = sortedCategories[i]
        }
    }
}