Nesne Algılayıcı görevi, birden fazla nesne sınıfının varlığını ve konumunu tespit etmenize olanak tanır. Örneğin, bir nesne algılayıcı, bir görüntünün içindeki köpeklerin yerini belirleyebilir. Bu talimatlar, Android'de Nesne Dedektörü görevinin nasıl kullanılacağını gösterir. Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz. Bu Web demosunu görüntüleyerek bu görevi çalışırken görebilirsiniz. Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel Bakış'a bakın.
Kod örneği
MediaPipe Tasks örnek kodu, Android için Nesne Algılayıcı uygulamasının basit bir uygulamasıdır. Örnekte, nesneleri sürekli olarak algılamak için fiziksel bir Android cihazın kamerası kullanılır. Ayrıca, nesnelerin statik olarak algılanması 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 başvuruda bulunabilirsiniz. Nesne Algılayıcı örnek kodu GitHub'da barındırılır.
Kodu indirme
Aşağıdaki talimatlar, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasını nasıl oluşturacağınızı göstermektedir.
Ö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 az ödeme yöntemini kullanacak şekilde yapılandırın. Böylece 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 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 Algılayıcı örnek uygulaması için önemli kodu içerir:
- ObjectDetectorHelper.kt: Nesne algılayıcıyı başlatır, modeli işler ve seçim yetkisi verir
- MainActivity.kt - Uygulamayı uygular ve kullanıcı arayüzü bileşenlerini bir araya getirir
- OverlayView.kt - Sonuçları işler ve görüntüler.
Kurulum
Bu bölümde, Nesne Algılayıcı'yı kullanmak için geliştirme ortamınızı ve kod projelerinizi ayarlamanın temel adımları açıklanmaktadır. Platform sürümü gereksinimleri de dahil olmak üzere, MediaPipe görevlerini kullanmak amacıyla geliştirme ortamınızı ayarlama hakkında genel bilgiler için Android için kurulum kılavuzuna bakın.
Bağımlılıklar
Nesne Algılayıcı, com.google.mediapipe:tasks-vision
kitaplığını kullanır. Bu bağımlılığı, Android uygulaması geliştirme projenizin build.gradle
dosyasına ekleyin. Gerekli bağımlılıkları aşağıdaki kodla içe aktarın:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
MediaPipe Nesne Dedektörü görevi için bu görevle uyumlu, eğitilmiş bir model gerekir. Nesne Algılayıcı için eğitilmiş modeller hakkında daha fazla bilgi edinmek için göreve genel bakış Modeller bölümüne bakın.
Modeli seçip indirin ve ardından proje dizininizde depolayı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şturma
Görevi oluşturmak için createFromOptions
işlevini kullanabilirsiniz. createFromOptions
işlevi; çalıştırma modu, görünen adlar yerel ayarı, maksimum sonuç sayısı, güven eşiği, kategori izin verilenler listesi ve reddedilenler listesi gibi yapılandırma seçeneklerini kabul eder. Bir 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ış bölümüne bakın.
Nesne Algılayıcı görevi 3 giriş veri türünü destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş verisi türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarımı nasıl yapacağınızı görmek için giriş verisi 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ını sağlar. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale
getirir ve sizin kullanım alanınıza uygun olmayabilir. Bu kodu ObjectDetectorHelper
sınıfı setupObjectDetector()
işlevinde görebilirsiniz.
Yapılandırma seçenekleri
Bu görev, Android uygulamaları için aşağıdaki yapılandırma seçeneklerine sahiptir:
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 resimli girişler için mod. VİDEO: Bir videonun kodu çözülmüş karelerine yönelik mod. LIVE_STREAM: Kamera gibi giriş verilerini içeren bir canlı yayın modu. Bu modda, sonuçları eşzamansız olarak almak üzere bir işleyici ayarlamak için resultListener çağrılmalıdır. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
displayNamesLocales |
Varsa görev modelinin meta verilerinde sağlanan görünen adlar için kullanılacak etiketlerin dilini ayarlar. İngilizce için varsayılan değer en şeklindedir. TensorFlow Lite Metadata Writer API'yi kullanarak özel modelin meta verilerine yerelleştirilmiş etiketler ekleyebilirsiniz
|
Yerel ayar kodu | en |
maxResults |
İsteğe bağlı olarak döndürülecek en yüksek puanlı algılama sonuçlarının isteğe bağlı maksimum sayısını ayarlar. | Pozitif sayılar | -1 (tüm sonuçlar döndürülür) |
scoreThreshold |
Model meta verilerinde belirtilen eşiği (varsa) geçersiz kılan tahmin puanı eşiğini ayarlar. Bu değerin altındaki sonuçlar reddedilir. | Tüm kayan | Belirlenmedi |
categoryAllowlist |
İsteğe bağlı olarak izin verilen kategori adları listesini ayarlar. Boş değilse kategori adı bu grupta yer almayan algılama 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ı hataya neden olur. |
Herhangi bir dize | Belirlenmedi |
categoryDenylist |
İzin verilmeyen kategori adlarının isteğe bağlı listesini ayarlar. Boş değilse kategori adı bu kümede yer alan algılama sonuçları filtrelenir. Yinelenen veya bilinmeyen kategori adları yoksayılır. Bu seçenek categoryAllowlist ile birlikte kullanılamaz ve her iki sonucun da kullanılması hataya neden olur. |
Herhangi bir dize | Belirlenmedi |
resultListener |
Sonuç işleyiciyi, nesne dedektörü canlı yayın modundayken algılama sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Bu seçeneği yalnızca runningMode ayarını LIVE_STREAM olarak ayarladığınızda kullanabilirsiniz. | Geçerli değil | Belirlenmedi |
Verileri hazırlama
Giriş resmini veya çerçevesini Nesne Algılayıcı'ya iletmeden önce bir 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şlenmek üzere 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ırlığı detectImage()
, detectVideoFile()
ve detectLivestreamFrame()
işlevlerindeki ObjectDetectorHelper
sınıfında ele alınır.
Görevi çalıştırma
Çalıştığınız veri türüne bağlı olarak, ilgili 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 yaparken 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 örnekleri, Nesne Algılayıcı'nın bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterir:
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ı kod örneğinde, bu modların detect()
, detectVideoFile()
ve detectAsync()
uygulamaları daha ayrıntılı bir şekilde gösterilmektedir.
Örnek kod, kullanıcının işleme modları arasında geçiş yapmasını sağlar. Bu, kullanım alanınızda gerekli olmayabilir.
Aşağıdakileri göz önünde bulundurun:
- Video modunda veya canlı yayın modunda çalışırken Nesne Algılayıcı görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
- Nesne Algılayıcı görevi, görüntü veya video modunda çalışırken giriş görüntüsünü veya karesini işlemeyi bitirene kadar geçerli iş parçacığını engeller. Geçerli iş parçacığını engellemekten kaçınmak için işlemeyi bir arka plan iş parçacığında yürütün.
- Canlı yayın modunda çalışırken Nesne Algılayıcı görevi mevcut iş parçacığını engellemez ancak hemen geri döner. Bir giriş karesini işlemeyi her tamamladığında algılama sonucuyla birlikte sonuç işleyicisini çağırır. Nesne Algılayıcı görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa yeni giriş çerçevesi yoksayılır.
Sonuçları işleme ve görüntüleme
Çıkarım yaptıktan sonra, Nesne Algılayıcısı görevi, giriş görüntüsünde bulduğu nesneleri açıklayan bir ObjectDetectorResult
nesnesi döndürür.
Aşağıda, bu görevden alınan çı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örseli gösterilmektedir:
Nesne Algılayıcı örnek kodu, görevden döndürülen algılama sonuçlarının nasıl görüntüleneceğini gösterir. Daha fazla bilgi için OverlayView
sınıfına bakın.