MediaPipe Hareket Tanımlayıcı görevi, el hareketlerini gerçek zamanlı olarak tanımanızı sağlar ve algılanan el hareketi sonuçlarını ve algılanan el işaretlerini sağlar. Bu talimatlarda Hareket Tanıyıcı'nın Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz.
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 Hareket Tanıyıcı uygulamasının basit bir uygulamasıdır. Örnekte, el hareketlerini sürekli olarak algılamak için fiziksel bir Android cihazın kamerası kullanılmış ve hareketleri statik olarak algılamak için cihaz galerisindeki resim ve videolar da kullanılabilmektedir.
Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken başvuruda bulunabilirsiniz. Hareket Tanıyı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 Hareket Tanıyıcı örnek uygulamasına ait dosyalara sahip olursunuz:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/gesture_recognizer/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, bu el hareketi tanıma örnek uygulaması için önemli kodu içerir:
- GestureRecognizerHelper.kt - Hareket tanıyıcıyı başlatır, modeli işler ve seçim yetkisi verir.
- MainActivity.kt -
GestureRecognizerHelper
veGestureRecognizerResultsAdapter
çağrıları da dahil olmak üzere uygulamayı uygular. - GestureRecognizerResultsAdapter.kt - Sonuçları işler ve biçimlendirir.
Kurulum
Bu bölümde, geliştirme ortamınızı kurmanın temel adımları açıklanmaktadır ve projelerinizi özel olarak Hareket Tanıyıcı'yı kullanacak şekilde kodlamalısınız. 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
Hareket Tanıyıcı görevi, com.google.mediapipe:tasks-vision
kitaplığını kullanır. Bu bağımlılığı Android uygulamanızın build.gradle
dosyasına ekleyin:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Model
MediaPipe Hareket Tanıyıcı görevi, bu görevle uyumlu, eğitilmiş bir model paketi gerektirir. Hareket Tanıyıcı için eğitilmiş modeller hakkında daha fazla bilgi edinmek üzere göreve genel bakış Modeller bölümüne bakın.
Modeli seçip indirin ve proje dizininizde depolayın:
<dev-project-root>/src/main/assets
ModelAssetPath
parametresinde modelin yolunu belirtin. Örnek kodda, model GestureRecognizerHelper.kt
dosyasında tanımlanmıştır:
baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)
Görevi oluşturma
MediaPipe Hareket Tanımlayıcı görevi, görevi ayarlamak için createFromOptions()
işlevini kullanır. createFromOptions()
işlevi, yapılandırma seçenekleri için değerleri kabul eder. Yapılandırma seçenekleri hakkında daha fazla bilgi edinmek için Yapılandırma seçenekleri bölümüne bakın.
Hareket Tanıma Aracı 3 giriş veri türünü destekler: hareketsiz 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
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
Video
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
Canlı yayın
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
Hareket Tanıyı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 GestureRecognizerHelper.kt
dosyasındaki setupGestureRecognizer()
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 |
|
numHands |
GestureRecognizer , maksimum el sayısını algılayabilir.
|
Any integer > 0 |
1 |
|
minHandDetectionConfidence |
El algılamasının, avuç içi algılama modelinde başarılı olarak değerlendirilebilmesi için gereken minimum güven puanı. | 0.0 - 1.0 |
0.5 |
|
minHandPresenceConfidence |
El önemli nokta algılama modelinde el varlığının minimum güven puanı. Hareket Tanıma Aracı'nın Video ve Canlı yayın modunda, el önemli nokta modelindeki el varlığı güven puanı bu eşiğin altındaysa avuç içi algılama modelini tetikler. Aksi takdirde, daha sonraki önemli nokta tespiti için ellerin konumunu belirlemek üzere hafif bir el takip algoritması kullanılır. | 0.0 - 1.0 |
0.5 |
|
minTrackingConfidence |
Elle izlemenin başarılı olarak kabul edilmesi için gereken minimum güven puanı. Bu, geçerli çerçevede ve son karede bulunan eller arasındaki sınırlayıcı kutu IoU eşiğidir. Hareket Tanıyıcı'nın Video ve Yayın modunda, izleme başarısız olursa Hareket Tanıyıcı el algılamayı tetikler. Aksi halde, el algılama özelliği atlanır. | 0.0 - 1.0 |
0.5 |
|
cannedGesturesClassifierOptions |
Hazır hareketler sınıflandırıcı davranışını yapılandırma seçenekleri. Hazır hareketler: ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"] |
|
|
|
customGesturesClassifierOptions |
Özel hareketler sınıflandırıcı davranışını yapılandırma seçenekleri. |
|
|
|
resultListener |
Hareket tanıyıcı canlı yayın modundayken sınıflandırma sonuçlarını eşzamansız olarak almak için sonuç işleyiciyi ayarlar.
Yalnızca çalıştırma modu LIVE_STREAM olarak ayarlandığında kullanılabilir |
ResultListener |
Yok | Yok |
errorListener |
İsteğe bağlı bir hata işleyici ayarlar. | ErrorListener |
Yok | Yok |
Verileri hazırlama
Hareket Tanıma Aracı resimler, video dosyası ve canlı video yayını ile çalışır. Görev; yeniden boyutlandırma, döndürme ve değer normalleştirmesi dahil olmak üzere, veri girişinin ön işlemesini yönetir.
Aşağıdaki kod, verilerin işlenmek üzere nasıl aktarılacağını gösterir. Bu örnekler resimler, video dosyaları ve canlı video akışlarındaki verilerin nasıl işleneceğine dair ayrıntılar içerir.
Resim
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
Video
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
Canlı yayın
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
Hareket Tanıyıcı örnek kodunda, veri hazırlığı GestureRecognizerHelper.kt
dosyasında gerçekleştirilir.
Görevi çalıştırma
Hareket Tanıyıcı, çıkarımları tetiklemek için recognize
, recognizeForVideo
ve recognizeAsync
işlevlerini kullanır. Hareket tanıma için bu, giriş verilerinin ön işlenmesini, resimdeki ellerin algılanmasını, el işaretlerinin ve önemli noktalardaki el hareketlerinin tanınmasını içerir.
Aşağıdaki kod, işlemenin görev modeliyle nasıl yürütüleceğini gösterir. Bu örnekler resimler, video dosyaları ve canlı video akışlarındaki verilerin nasıl işleneceğine dair ayrıntılar içerir.
Resim
val result = gestureRecognizer?.recognize(mpImage)
Video
val timestampMs = i * inferenceIntervalMs gestureRecognizer?.recognizeForVideo(mpImage, timestampMs) ?.let { recognizerResult -> resultList.add(recognizerResult) }
Canlı yayın
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() gestureRecognizer?.recognizeAsync(mpImage, frameTime)
Aşağıdakileri göz önünde bulundurun:
- Video modunda veya canlı yayın modunda çalışırken Hareket Tanıyıcı görevine giriş karesinin zaman damgasını da sağlamanız gerekir.
- Hareket Tanımlayıcı görevi, resim veya video modunda çalıştırılırken giriş resmini veya karesini işlemeyi bitirene kadar mevcut iş parçacığını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemeyi bir arka plan iş parçacığında yürütün.
- Hareket Tanıma Aracı, canlı yayın modunda çalışırken geçerli iş parçacığını engellemez ancak hemen geri döner. Bir giriş çerçevesini işlemeyi tamamladığında tanıma sonucuyla birlikte sonuç işleyicisini çağırır. Hareket Tanıyıcı görevi başka bir kareyi işlemekle meşgulken tanıma işlevi çağrılırsa görev yeni giriş çerçevesini yoksayar.
Hareket Tanımlayıcı örnek kodunda recognize
, recognizeForVideo
ve recognizeAsync
işlevleri GestureRecognizerHelper.kt
dosyasında tanımlanmıştır.
Sonuçları işleme ve görüntüleme
Hareket Tanıyıcı, her tanıma çalıştırması için bir hareket algılama sonuç nesnesi oluşturur. Sonuç nesnesi; resim koordinatlarında el yer işaretleri, dünya koordinatlarındaki el yer işaretleri, el tercihi(sol/sağ el) kategorileri ve algılanan ellerin el hareketi kategorilerini içerir.
Aşağıda, bu görevden alınan çıkış verilerinin bir örneği gösterilmektedir:
Sonuçta elde edilen GestureRecognizerResult
, dört bileşen içerir ve her bileşen bir dizidir. Bu dizide her öğe, algılanan tek bir elin algılanan sonucunu içerir.
Uygun Olduğu El
El bilgisi, algılanan ellerin sol el mi yoksa sağ el mi olduğunu belirtir.
Hareketler
Algılanan ellerin tanınan hareket kategorileri.
Önemli noktalar
Her biri
x
,y
vez
koordinatlarından oluşan 21 önemli nokta vardır.x
vey
koordinatları, sırasıyla resim genişliği ve yüksekliğine göre [0,0, 1,0] olacak şekilde normalleştirilir.z
koordinatı, önemli nokta derinliğini temsil eder. Bilekteki derinlik ise başlangıç noktasıdır. Değer ne kadar küçükse nokta kameraya o kadar yakın olur.z
ölçeğinin büyüklüğü,x
ile yaklaşık olarak aynı ölçeği kullanır.Dünyanın Sınırları
21 önemli nokta, dünya koordinatlarında da gösterilir. Her önemli nokta,
x
,y
vez
öğelerinden oluşur. Bu noktalar, başlangıç noktası elin geometrik merkezinde olmak üzere gerçek dünyadaki 3D koordinatları metre cinsinden temsil eder.
GestureRecognizerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Gestures:
Categories #0:
score : 0.76893
categoryName : Thumb_Up
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
Aşağıdaki resimlerde görev çıktısının görselleştirmesi gösterilmektedir:
Hareket Tanıyıcı örnek kodunda, sonuçları GestureRecognizerResultsAdapter.kt
dosyasındaki GestureRecognizerResultsAdapter
sınıfı işler.