Android için el ile önemli noktaları algılama rehberi

MediaPipe El İşaretçisi görevi, bir görüntüdeki ellerin önemli noktalarını algılamanızı sağlar. Bu talimatlarda, El İşaretçisi'nin Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir. İlgili içeriği oluşturmak için kullanılan bu talimatlarda açıklanan kod örneğini şu adreste bulabilirsiniz: GitHub'a gidin.

Ö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 El İşaretçisi işlevinin basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla ellerin önemli noktalarını sürekli olarak algılar ve cihaz galerisini kullanarak el önemli noktalarını statik olarak algılayabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. El İşaretçisi örnek kodu 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, Böylece, yalnızca El İşaretçisi örnek uygulamasına ait dosyalara sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/hand_landmarker/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 işareti için önemli kodu içerir algılama örnek uygulaması:

  • HandLandmarkerHelper.kt - El belirgin işareti dedektörünü başlatır, modeli ve yetkiyi işler seçim.
  • MainActivity.kt HandLandmarkerHelper çağrısı da dahil olmak üzere uygulamayı uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili özel olarak El İşaretçisi'ni kullanmak için projeleri kodlayabilirsiniz. Ş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

El İşaretçisi görevi, com.google.mediapipe:tasks-vision 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 El İşaretçisi görevi, oluşturacağım. El İşaretçisi için mevcut eğitilmiş modeller 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: HandLandmarkerHelper.kt dosya:

baseOptionBuilder.setModelAssetPath(MP_HAND_LANDMARKER_TASK)

Görevi oluşturma

MediaPipe El İşaretçisi görevi,createFromOptions() görevi görebilir. createFromOptions() işlevi, yapılandırma için değerleri kabul eder seçenekleri vardır. Yapılandırma seçenekleri hakkında daha fazla bilgi için bkz. Yapılandırma seçenekleri.

El İşaretçisi, 3 giriş verisi türünü destekler: hareketsiz resimler, video dosyaları ve Canlı yayın. Hedefinize uygun koşu modunu temel veri türünü dikkate almanız gerekir. Size uygun olan sekmeyi veri türünü girin.

Resim

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    HandLandmarker.HandLandmarkerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setNumHands(maxNumHands)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()

handLandmarker =
    HandLandmarker.createFromOptions(context, options)
    

Video

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    HandLandmarker.HandLandmarkerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setNumHands(maxNumHands)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

handLandmarker =
    HandLandmarker.createFromOptions(context, options)
    

Canlı yayın

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    HandLandmarker.HandLandmarkerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setNumHands(maxNumHands)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

handLandmarker =
    HandLandmarker.createFromOptions(context, options)
    

El İşaretçisi ö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 setupHandLandmarker() fonksiyonu HandLandmarkerHelper.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 El önemli nokta dedektörü tarafından algılanan maksimum el sayısı. 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 Eldeki el varlığı puanı için minimum güven puanı önemli nokta algılama modelidir. Video ve Canlı yayın modunda El yer işareti modelindeki el varlığı güven puanının altındaysa el İşaretçisi, avuç içi algılama modelini tetikler. Aksi halde, basit bir el izleme algoritması, kullanıcının nerede olduğunu 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: El İşaretçisi, takip başarısız olursa El İşaretçisi eli tetikler tespit edebilir. Aksi takdirde, el algılaması atlanır. 0.0 - 1.0 0.5
resultListener Sonuç işleyiciyi algılama sonuçlarını alacak şekilde ayarlar el işaretleyicisi canlı yayın modundayken eşzamansız olarak ayarlayabilirsiniz. Yalnızca koşu modu LIVE_STREAM olarak ayarlandığında geçerlidir Yok Yok
errorListener İsteğe bağlı bir hata işleyici ayarlar. Yok Yok

Verileri hazırlama

El İşaretçisi; 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()
    

El İşaretçisi örnek kodu ile birlikte, veri hazırlama işlemi HandLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

Görevi çalıştırma

Üzerinde çalıştığınız veri türüne bağlı olarak HandLandmarker.detect...() yöntemini çağırın. Tekliflerinizi otomatikleştirmek ve optimize etmek için Ayrı resimler için detect(), Video dosyalarındaki kareler için detectForVideo() ve Video akışları için detectAsync(). Bir makinede algılamalar bu sorunu önlemek için algılamaları ayrı bir iş parçacığında çalıştırdığınızdan emin olun. ileti dizisi engelleniyor.

Aşağıdaki kod örnekleri, El İşaretçisi'nin nasıl çalıştırılacağına ilişkin basit örnekler göstermektedir. şu farklı veri modlarında kullanabilirsiniz:

Resim

val result = handLandmarker?.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

handLandmarker?.detectForVideo(mpImage, timestampMs)
    ?.let { detectionResult ->
        resultList.add(detectionResult)
    }
    

Canlı yayın

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

handLandmarker?.detectAsync(mpImage, frameTime)
    

Aşağıdakileri göz önünde bulundurun:

  • Video modunda veya canlı yayın modunda çalışırken şunları da yapmanız gerekir: El İşaretçi görevine giriş çerçevesinin zaman damgasını sağlar.
  • Resimde veya video modunda çalışırken El İşaretçisi 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 El İşaretçi görevi, devam eder, ancak hemen geri döner. Sonucunu çağırır algılama sonucuyla birlikte gelen bir hata dinleyicisidir. giriş çerçevesine sahip. El İşaretçisi görevi başlatıldığında algılama işlevi çağrılırsa başka bir kareyi işlemekle meşgulse görev, yeni giriş çerçevesini yoksayacak.

El İşaretçisi örnek kodu, detect, detectForVideo ve detectAsync işlevleri HandLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

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

El İşaretçisi, her algılama için bir el işaretleyici sonuç nesnesi oluşturur gerekir. Sonuç nesnesi, resim koordinatlarında el işaretleri, el algılanan önemli noktanın dünya koordinatlarındaki ve el görüşlerindeki(sol/sağ el) önemli noktalar eller.

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

HandLandmarkerResult çıkışı üç bileşen içerir. Her bileşen bir dizidir. Burada her öğe, algılanan tek bir el için aşağıdaki sonuçları içerir:

  • Uygun Olduğu El

    El tercihi, algılanan ellerin sol el mi yoksa sağ el mi olduğunu belirtir.

  • Ö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 el ö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.

HandLandmarkerResult:
  Handedness:
    Categories #0:
      index        : 0
      score        : 0.98396
      categoryName : Left
  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 resimde, görev çıkışının görselleştirmesi gösterilmektedir:

El İşaretçisi örnek kodu, doğru işareti gösteren daha fazla bilgi edinmek için OverlayView inceleyebilirsiniz.