Android için hareket tanıma rehberi

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:

  1. Aşağıdaki komutu kullanarak git deposunu klonlayın:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. İ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:

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"]
  • Görünen adlar yerel ayarı: Varsa TFLite Model Meta Verileri aracılığıyla belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise mevcut tüm sonuçlar döndürülür.
  • Puan eşiği: Altına düşen sonuçların reddedildiği puan. 0 olarak ayarlanırsa mevcut tüm sonuçlar döndürülür.
  • Kategori izin verilenler listesi: Kategori adlarının izin verilenler listesi. Boş değilse kategorisi bu grupta bulunmayan sınıflandırma sonuçları filtrelenir. Reddetme listesi ile birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse kategorisi bu grupta yer alan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte kullanılamaz.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuçlar: any integer
    • Puan eşiği: 0.0-1.0
    • Kategori izin verilenler listesi: vector of strings
    • Kategori ret listesi: vector of strings
    • Görünen adlar yerel ayarı: "en"
    • Maksimum sonuçlar: -1
    • Puan eşiği: 0
    • Kategori izin verilenler listesi: boş
    • Kategori ret listesi: boş
    customGesturesClassifierOptions Özel hareketler sınıflandırıcı davranışını yapılandırma seçenekleri.
  • Görünen adlar yerel ayarı: Varsa TFLite Model Meta Verileri aracılığıyla belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise mevcut tüm sonuçlar döndürülür.
  • Puan eşiği: Altına düşen sonuçların reddedildiği puan. 0 olarak ayarlanırsa mevcut tüm sonuçlar döndürülür.
  • Kategori izin verilenler listesi: Kategori adlarının izin verilenler listesi. Boş değilse kategorisi bu grupta bulunmayan sınıflandırma sonuçları filtrelenir. Reddetme listesi ile birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse kategorisi bu grupta yer alan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte kullanılamaz.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuçlar: any integer
    • Puan eşiği: 0.0-1.0
    • Kategori izin verilenler listesi: vector of strings
    • Kategori ret listesi: vector of strings
    • Görünen adlar yerel ayarı: "en"
    • Maksimum sonuçlar: -1
    • Puan eşiği: 0
    • Kategori izin verilenler listesi: boş
    • Kategori ret listesi: boş
    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 ve z koordinatlarından oluşan 21 önemli nokta vardır. x ve y 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 ve z öğ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.