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:
- Aşağıdaki komutu kullanarak git deposunu klonlayın:
git clone https://github.com/google-ai-edge/mediapipe-samples
- İ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:
- ImageClassifierHelper.kt - Resim sınıflandırıcıyı başlatır, model ve yetki seçimini işler.
- MainActivity.kt -
Uygulamayı,
ImageClassificationHelper
veClassificationResultsAdapter
çağrılarını da içerecek şekilde uygular. - ClassificationResultsAdapter.kt - Sonuçları ele alır ve biçimlendirir.
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]
}
}
}