Nesne Algılama görevi, birden fazla nesne sınıfının varlığını ve konumunu algılamanıza olanak tanır. Örneğin, bir nesne algılayıcı bir resimdeki köpekleri bulabilir. Bu talimatlarda, Android'de Nesne Tarayıcısı görevinin nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz. Bu görevi çalışırken görmek için web demosunu inceleyebilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel bakış bölümüne bakın.
Kod örneği
MediaPipe Tasks örnek kodu, Android için bir nesne algılama uygulamasının basit bir uygulamasıdır. Örnekte, nesneleri sürekli olarak algılamak için fiziksel bir Android cihazdaki kamera kullanılır. Nesneleri statik olarak algılamak 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. Nesne Tanımlayıcı örnek kodu GitHub'da barındırılmaktadır.
Kodu indirme
Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasının nasıl oluşturulacağı 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, yalnızca nesne algılayıcı örnek uygulamasının dosyalarını içerecek şekilde seyrek kontrol kullanacak şekilde yapılandırın:
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 Tarayıcısı örnek uygulamasının önemli kodunu içerir:
- ObjectDetectorHelper.kt: Nesne algılayıcıyı başlatır, modeli ve temsilci seçimini yönetir
- MainActivity.kt: Uygulamayı uygular ve kullanıcı arayüzü bileşenlerini bir araya getirir
- OverlayView.kt: Sonuçları işler ve gösterir
Kurulum
Bu bölümde, geliştirme ortamınızı ve kod projelerinizi Nesne Tarayıcısı'nı kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi için Android için kurulum kılavuzu başlıklı makaleyi inceleyin.
Bağımlılıklar
Nesne algılayıcı, com.google.mediapipe:tasks-vision
kitaplığını kullanır. Bu bağımlılık, Android uygulama geliştirme projenizin build.gradle
dosyasına eklenmelidir. Aşağıdaki kodla gerekli bağımlılıkları içe aktarın:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
MediaPipe Nesne Algılama görevi, bu görevle uyumlu bir eğitimli model gerektirir. Nesne Algılama için kullanılabilen eğitilmiş modeller hakkında daha fazla bilgi edinmek istiyorsanız göreve genel bakıştaki Modeller bölümüne göz atın.
Modeli seçip indirin ve proje dizininizde saklayı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şturun
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, kategori izin verilenler listesi ve yasaklananlar listesi gibi yapılandırma seçeneklerini kabul eder. 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ış başlıklı makaleyi inceleyin.
Nesne algılama görevi 3 giriş veri türünü destekler: hareketsiz resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş veri türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarım işlemini nasıl çalıştıracağınızı görmek için giriş veri 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ına olanak tanır. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve kullanım alanınız için uygun olmayabilir. Bu kodu ObjectDetectorHelper
sınıfının setupObjectDetector()
işlevinde görebilirsiniz.
Yapılandırma seçenekleri
Bu görevde, Android uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:
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 resim girişleri için kullanılan mod. VIDEO: Bir videonun kod çözülmüş karelerinin modu. LIVE_STREAM: Kameradan alınan giriş verilerinin canlı yayını için kullanılan mod. Bu modda, sonuçları asenkron olarak alacak bir dinleyici oluşturmak için resultListener çağrılmalıdır. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
displayNamesLocales |
Görevin modelinin meta verilerinde sağlanan görünen adlar için kullanılacak etiketlerin dilini belirler (varsa). Varsayılan değer, İngilizce için en 'tir. TensorFlow Lite Meta Veri Yazıcı API'yi kullanarak özel bir modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz
|
Yer kodu | en |
maxResults |
Döndürülecek isteğe bağlı maksimum puana sahip algılama sonucu sayısını ayarlar. | Tüm pozitif sayılar | -1 (tüm sonuçlar döndürülür) |
scoreThreshold |
Model meta verilerinde (varsa) sağlanan 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 | 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ı filtrelenir. Yinelenen veya bilinmeyen kategori adları yok sayılır.
Bu seçenek, categoryDenylist ile birbirini hariç tutar ve her ikisinin de kullanılması hatayla sonuçlanır. |
Herhangi bir dize | Ayarlanmadı |
categoryDenylist |
İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu grupta bulunan algılama sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yok sayılır. Bu seçenek, categoryAllowlist ile birlikte kullanılamaz. İkisinin birlikte kullanılması hataya neden olur. |
Herhangi bir dize | Ayarlanmadı |
resultListener |
Nesne algılayıcı canlı yayın modundayken sonuç dinleyicisini, algılama sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Bu seçeneği yalnızca runningMode parametresini LIVE_STREAM olarak ayarlarken kullanabilirsiniz. | Geçerli değil | Ayarlanmadı |
Verileri hazırlama
Giriş resmini veya karesini Nesne Tarayıcısı'na iletmeden önce 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şlemeye 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ırlama işlemi, detectImage()
, detectVideoFile()
, detectLivestreamFrame()
işlevleri içindeki ObjectDetectorHelper
sınıfında gerçekleştirilir.
Görevi çalıştırma
Çalıştığınız veri türüne bağlı olarak, söz konusu 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 gerçekleştirirken 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 örneklerinde, Nesne Bulucu'nun bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterilmektedir:
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ılama kodu örneğinde, bu modların her birinin detect()
,
detectVideoFile()
ve detectAsync()
uygulamalarının daha ayrıntılı bir görünümü gösterilmektedir.
Örnek kod, kullanıcının işleme modları arasında geçiş yapmasına olanak tanır. 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 Nesne Tarayıcısı görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
- Nesne algılama görevi, resim veya video modunda çalışırken giriş resmini ya da kareyi işlemeye başlayana kadar mevcut iş parçacığını engeller. Mevcut ileti dizisinin engellenmesini önlemek için işlemeyi arka planda bir ileti dizisinde yürütün.
- Canlı yayın modunda çalışırken nesne algılama görevi, geçerli iş parçacığını engellemez ancak hemen döndürülür. Her giriş çerçevesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. Nesne algılama görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa yeni giriş karesi yoksayılır.
Sonuçları işleme ve görüntüleme
Nesne algılama görevi, çıkarım çalıştırıldığında giriş görüntüsünde bulduğu nesneleri açıklayan bir ObjectDetectorResult
nesnesi döndürür.
Aşağıda, bu görevin çıkış verilerine örnek verilmiştir:
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 çıktısının görselleştirmesi gösterilmektedir:
Nesne Algılama örnek kodunda, görevden döndürülen algılama sonuçlarının nasıl görüntüleneceği gösterilmektedir. Daha fazla bilgi için OverlayView
sınıfına bakın.