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. tanınan el hareketi sonuçlarını ve el işaretlerini sağlar tespit etti. Bu talimatlarda Hareket Tanımlayıcı'nın nasıl kullanılacağı gösterilmektedir harika bir seçenektir. Bu talimatlarda açıklanan kod örneği şu anda kullanılabilir: GitHub'da bulabilirsiniz.

Bu görevi, web demosunu inceleyin. Ö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 Hareket Tanımlayıcı'nın basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla El hareketlerini sürekli algılamakta ve ayrıca cihaz galerisini kullanabilirsiniz.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. Hareket Tanıyıcı örnek kodu şurada barındırılır: 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:

  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 seyrek ödeme yöntemini kullanacak şekilde yapılandırın, Dolayısıyla, yalnızca Hareket Tanımlayı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 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 el hareketi için önemli kodu içeriyor tanıma örneği uygulaması:

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Hareket Tanıyıcı'yı kullanmak için özel olarak kod projeleri oluşturalım. Ş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

Hareket Tanıma görevi, com.google.mediapipe:tasks-vision işlevini kullanır. kitaplığını açar. 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, oluşturacağım. Hareket Tanıyıcı'nın mevcut eğitilmiş modelleri hakkında daha fazla bilgi için göreve genel bakışın Modeller bölümünü inceleyin.

Modeli seçin, indirin ve proje dizininizde depolayın:

<dev-project-root>/src/main/assets

ModelAssetPath parametresi içinde modelin yolunu belirtin. örnek kod, model şurada tanımlanmıştır: GestureRecognizerHelper.kt dosya:

baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)

Görevi oluşturma

MediaPipe Hareket Tanıyıcı görevi, aşağıdakileri ayarlamak için createFromOptions() işlevini kullanır: düşünmelisiniz. createFromOptions() işlevi, yapılandırma seçeneklerini ayarlayın. Yapılandırma seçenekleri hakkında daha fazla bilgi için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Hareket Tanıyıcı, 3 giriş verisi türünü destekler: hareketsiz resimler, video dosyaları ve canlı video akışları 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

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 farklı olabilir. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale kullanım alanınıza uygun olmayabilir. Bu kodu setupGestureRecognizer() fonksiyonu GestureRecognizerHelper.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
numHands Maksimum el sayısı şu kullanıcı tarafından algılanabilir: GestureRecognizer. Any integer > 0 1
minHandDetectionConfidence El algılama için minimum güven puanı için başarılı bir yöntem olarak nitelendiriliyor. 0.0 - 1.0 0.5
minHandPresenceConfidence Elde tutma puanının minimum güven puanı önemli nokta algılama modelidir. Hareket Tanıyıcı'nın Video ve Canlı yayın modunda ise el yer işareti modelinin el varlığı güven puanı aşağıdaysa avuç içi algılama modelini tetikler. Aksi halde, konumunu belirlemek için basit bir el izleme algoritması ellerinizi rahatça kullanabileceksiniz. 0.0 - 1.0 0.5
minTrackingConfidence El takibi için dikkate alınacak minimum güven puanı işidir. Bu, testteki eller arasındaki sınırlayıcı kutu IoU eşiğidir geçerli kareyi ve son kareyi gösterir. Video modunda ve Akış modunda: Hareket Tanıyıcı, izleme başarısız olursa Hareket Tanıyıcı eli tetikler tespit edebilir. Aksi takdirde, 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 ile belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç sayısı: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise tüm mevcut sonuçlar döndürülür.
  • Puan eşiği: Aşağıdaki sonuçların reddedildiği puan. 0 değerine 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 kümede bulunmayan sınıflandırma sonuçları filtrelenir. Ret listesiyle birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse, kategorisi bu kümede bulunan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte hariç tutulur.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuç sayısı: 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ç sayısı: -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 ile belirtilen görünen adlar için kullanılacak yerel ayar.
  • Maksimum sonuç sayısı: Döndürülecek en yüksek puanlı sınıflandırma sonuçlarının maksimum sayısı. < 0 ise tüm mevcut sonuçlar döndürülür.
  • Puan eşiği: Aşağıdaki sonuçların reddedildiği puan. 0 değerine 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 kümede bulunmayan sınıflandırma sonuçları filtrelenir. Ret listesiyle birlikte kullanılamaz.
  • Kategori ret listesi: Kategori adlarının ret listesi. Boş değilse, kategorisi bu kümede bulunan sınıflandırma sonuçları filtrelenir. İzin verilenler listesi ile birlikte hariç tutulur.
    • Görünen adlar yerel ayarı: any string
    • Maksimum sonuç sayısı: 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ç sayısı: -1
    • Puan eşiği: 0
    • Kategori izin verilenler listesi: boş
    • Kategori ret listesi: boş
    resultListener Sonuç işleyiciyi sınıflandırma sonuçlarını alacak şekilde ayarlar hareket tanıyıcı canlı yayın modundayken eşzamansız olarak ayarlayabilirsiniz. Yalnızca koşu 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ıyıcı; resimler, video dosyası ve canlı yayın videolarıyla ç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.

    Aşağıdaki kod, verilerin işlenmek üzere nasıl aktarılacağını göstermektedir. Bunlar örnekler, resimlerden, video dosyalarından ve canlı yayınlardan verilerin nasıl işleneceğine dair ayrıntılar içerir video akışları üzerinden takip edebilirsiniz.

    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ımlayıcı örnek kodu ise verilerin hazırlanması GestureRecognizerHelper.kt dosyası olarak kaydedebilirsiniz.

    Görevi çalıştırma

    Hareket Tanımlayıcı, recognize, recognizeForVideo ve recognizeAsync özelliklerini kullanır fonksiyonları kullanmaktır. Hareket tanıma için bu işlem giriş verilerini ön işleme, resimdeki elleri algılama, el algılama ve önemli noktalardaki el hareketlerini tanırsınız.

    Aşağıdaki kod, görev modeliyle işlemin nasıl yürütüleceğini gösterir. Bu örneklerde, resimlerden, video dosyalarından ve ve canlı video akışları kullanılabilir.

    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 şunları da yapmanız gerekir: Hareket Tanımlayıcı görevine giriş çerçevesinin zaman damgasını sağlar.
    • Görüntü veya video modunda çalışırken Hareket Tanıyıcı görevi giriş resmini işlemeyi bitirene 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 Hareket Tanıyıcı görevi, devam eder, ancak hemen geri döner. Sonucunu çağırır dinleyiciye bildirme işlemini tamamladığında giriş çerçevesine sahip. Hareket Tanıyıcı açıkken tanıma işlevi çağrılırsa görev başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayacak.

    Hareket Tanımlayıcı örnek kodu, recognize, recognizeForVideo ve recognizeAsync işlevleri GestureRecognizerHelper.kt dosyası olarak kaydedebilirsiniz.

    Sonuçları işleme ve görüntüleme

    Hareket Tanıyıcı, her hareket için birer hareket algılama sonuç nesnesi oluşturur çalışmasıdır. Sonuç nesnesi, resim koordinatlarında el işaretleri içerir dünya koordinatlarındaki el önemli noktaları, el tercihi(sol/sağ el) ve el algılanan ellerin hareket kategorilerini içerir.

    Aşağıda, bu görevdeki çıkış verilerinin bir örneği gösterilmektedir:

    Sonuç olarak elde edilen GestureRecognizerResult dört bileşen içerir ve her bileşen bir dizidir. Burada her öğe, algılanan tek bir elin algılanan sonucunu içerir.

    • Uygun Olduğu El

      El tercihi, 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 el önemli noktası vardır. İlgili içeriği oluşturmak için kullanılan x ve y koordinatları, resim genişliğine göre [0,0, 1,0] değerine yüksekliğine dikkat edin. z koordinatı, belirgin işaret derinliğini gösterir oryantasyon yani bilek derinliği. Değer ne kadar küçükse kameraya kadar uzanıyorum. z boyutu ile yaklaşık olarak aynı ölçeği kullanır x.

    • Dünyanın Sınırları

      21 elin önemli noktaları da dünya koordinatlarıyla gösterilir. Her bir önemli nokta gerçek dünya 3D koordinatlarını temsil eden x, y ve z birleşiminden oluşur metre cinsinden, başlangıç noktası avucunun geometrik merkezinde yer alır.

    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 görüntülerde, görev çıkışının görselleştirmesi gösterilmektedir:

    Hareket Tanımlayıcı örnek kodu, GestureRecognizerResultsAdapter GestureRecognizerResultsAdapter.kt dosyası sonuçları işler.