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 nasıl kullanılacağı gösterilmektedir harika bir seçenektir. Bu talimatlarda açıklanan kod örneği şu anda kullanılabilir: açık GitHub'a gidin.
Web demosunu görüntüleyerek bu görevin nasıl yerine getirildiğini öğrenebilirsiniz. Ö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 Resim Sınıflandırıcı'nın basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla nesneleri sürekli olarak sınıflandırır ve ayrıca, 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. Resim Sınıflandırıcı ö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:
- 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 dosyalarınız olur:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/image_classification/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 bu resim için önemli kodu içeriyor sınıflandırma örneği uygulaması:
- ImageClassifierHelper.kt - Resim sınıflandırıcıyı başlatır, modeli ve yetki verme işlemini işler seçim.
- MainActivity.kt
ImageClassificationHelper
veClassificationResultsAdapter
. - ClassificationResultsAdapter.kt - Sonuçları ele alır ve biçimlendirir.
Kurulum
Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Resim Sınıflandırıcı'yı kullanmak için projeleri kodlayın. Ş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
Resim Sınıflandırı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 Görüntü Sınıflandırıcı görevi bu görevi görebilir. Resim Sınıflandırıcı için eğitilmiş modeller hakkında daha fazla bilgi için bkz. 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. Bu yöntem,
bölümüne bakın.
Resim Sınıflandırıcı örnek kodu,
model, ImageClassifierHelper.kt
dosyası olarak kaydedebilirsiniz.
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,
izin verilenler listesi veya ret listesi ekleyin. Yapılandırma hakkında daha fazla bilgi için
Yapılandırmaya Genel Bakış bölümüne göz atı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ı 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
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
farklı olabilir. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale
kullanım alanınıza uygun olmayabilir. Bu kodu
setupImageClassifier()
ImageClassifierHelper.kt
dosyası olarak kaydedebilirsiniz.
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 |
displayNamesLocale |
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 puanlı sınıflandırma sonucu sayısını şu değere ayarlar: dön. < 0 ise tüm mevcut sonuçlar döndürülür. | Pozitif sayılar | -1 |
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 sınıflandırma 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 sınıflandırma 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 sınıflandırma sonuçlarını alacak şekilde ayarlar
Resim Sınıflandırıcı canlı yayındayken eşzamansız olarak
yatırım yapmanız önemlidir. Yalnızca koşu modu LIVE_STREAM olarak ayarlandığında kullanılabilir |
Yok | Ayarlanmadı |
errorListener |
İsteğe bağlı bir hata işleyici ayarlar. | Yok | Ayarlanmadı |
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 de dahil olmak üzere veri girişi ön işlemesini gerçekleştirir. yapabilirsiniz.
Giriş resmini veya karesini
com.google.mediapipe.framework.image.MPImage
nesnesini
Resim Sınıflandırıcı.
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 kodu, veri hazırlama işlemi
ImageClassifierHelper.kt
dosyası olarak kaydedebilirsiniz.
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 şunları da yapmanız gerekir: Resim Sınıflandırıcı görevine giriş çerçevesinin zaman damgasını sağlar.
- Görüntü veya video modunda çalışırken Görüntü Sınıflandırıcı görevi giriş resmini işlemeyi tamamlayana kadar geçerli iş parçacığını engeller veya çerçeve. Kullanıcı arayüzünü engellememek için işlemeyi arka plan ileti dizisi.
- Canlı yayın modunda çalışırken Resim Sınıflandırı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. Resim Sınıflandırıcı sırasında
classifyAsync
işlevi çağrılırsa görev başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayar.
Resim Sınıflandırıcı örnek kodu, classify
işlevleri
ImageClassifierHelper.kt
dosyası olarak kaydedebilirsiniz.
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ç, Bird Classifier (Bird Sınıflandırıcı) çalıştırılarak elde edilmiştir. tarih:
Resim Sınıflandırıcı örnek kodu, ClassificationResultsAdapter
ClassificationResultsAdapter.kt
dosyası 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]
}
}
}