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

MediaPipe El Önemli Noktası Belirleyici görevi, bir resimdeki ellerin önemli noktalarını algılamanıza olanak tanır. Bu talimatlarda, El İşaretçisi'nin Android uygulamalarıyla nasıl kullanılacağı gösterilmektedir. Bu talimatlarda açıklanan kod örneğini GitHub'da bulabilirsiniz.

Bu görevin özellikleri, modelleri ve yapılandırma seçenekleri hakkında daha fazla bilgi için Genel bakış bölümüne bakın.

Kod örneği

MediaPipe Tasks örnek kodu, Android için basit bir El İşaretleyici uygulamasıdır. Bu örnekte, elin önemli noktalarını sürekli olarak algılamak için fiziksel bir Android cihazdaki kamera kullanılır. Elin önemli noktalarını statik olarak algılamak 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 referans olarak kullanabilirsiniz. El İşaretçisi örnek kodu GitHub'da barındırılır.

Kodu indirme

Aşağıdaki talimatlarda, git komut satırı aracını kullanarak örnek kodun yerel bir kopyasının nasıl oluşturulacağı gösterilmektedir.

Ö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 kontrol kullanacak şekilde yapılandırarak yalnızca Hand Landmarker örnek uygulamasının dosyalarını elde edebilirsiniz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/hand_landmarker/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 yer işareti algılama örnek uygulamasının önemli kodunu içerir:

  • HandLandmarkerHelper.kt: El yer işareti algılayıcıyı başlatır, modeli ve temsilci seçimini yönetir.
  • MainActivity.kt: HandLandmarkerHelper çağrısı da dahil olmak üzere uygulamayı uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Hand Landmarker'ı kullanacak şekilde ayarlamayla ilgili temel adımlar açıklanmaktadır. Platform sürümü gereksinimleri dahil olmak üzere, geliştirme ortamınızı MediaPipe görevlerini kullanmak için ayarlama hakkında genel bilgi için Android için kurulum kılavuzu başlıklı makaleyi inceleyin.

Bağımlılıklar

El İşaretçisi görevi com.google.mediapipe:tasks-vision kitaplığını kullanır. Bu bağımlılık, Android uygulamanızın build.gradle dosyasına eklenmelidir:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Model

MediaPipe Hand Landmarker görevi, bu görevle uyumlu eğitilmiş bir model paketi gerektirir. El Yer İşaretçisi için mevcut eğitimli modeller hakkında daha fazla bilgi edinmek isterseniz göreve genel bakıştaki Modeller bölümüne bakın.

Modeli seçip indirin ve proje dizininizde saklayın:

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

ModelAssetPath parametresinde modelin yolunu belirtin. Örnek kodda model, HandLandmarkerHelper.kt dosyasında tanımlanır:

baseOptionBuilder.setModelAssetPath(MP_HAND_LANDMARKER_TASK)

Görevi oluşturun

MediaPipe Hand Landmarker 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 başlıklı makaleyi inceleyin.

El İşaretçisi 3 giriş veri türünü destekler: sabit resimler, video dosyaları ve canlı yayın. Görevi oluştururken giriş veri türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevi nasıl oluşturacağınızı ve çıkarım işlemini nasıl çalıştıracağınızı görmek için giriş veri türünüze karşılık gelen sekmeyi seçin.

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 işleme modları arasında geçiş yapmasına olanak tanır. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale getirir ve kullanım alanınız için uygun olmayabilir. Bu kodu, HandLandmarkerHelper.kt dosyasında setupHandLandmarker() işlevinde görebilirsiniz.

Yapılandırma seçenekleri

Bu görevde, Android uygulamaları için aşağıdaki yapılandırma seçenekleri bulunur:

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 resim girişleri için kullanılan mod.

VIDEO: Bir videonun kod çözülmüş karelerinin modu.

LIVE_STREAM: Kameradan alınan giriş verilerinin canlı yayını için kullanılan mod. Bu modda, sonuçları asenkron olarak alacak bir dinleyici oluşturmak için resultListener çağrılmalıdır.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numHands El yer işareti algılayıcısı tarafından algılanan maksimum el sayısı. Any integer > 0 1
minHandDetectionConfidence Avuç içi algılama modelinde el algılamanın başarılı olarak kabul edilmesi için gereken minimum güven puanı. 0.0 - 1.0 0.5
minHandPresenceConfidence El yer işareti algılama modelindeki el varlığı puanı için minimum güven puanı. Video modu ve canlı yayın modunda, el yer işareti modelinden elde edilen el varlığı güven puanı bu eşiğin altındaysa El Yer İşareti Belirleyici, avuç içi algılama modelini tetikler. Aksi takdirde, sonraki önemli nokta algılamaları için ellerin konumunu hafif bir el izleme algoritması belirler. 0.0 - 1.0 0.5
minTrackingConfidence El izlemenin başarılı kabul edilmesi için gereken minimum güven puanı. Bu, geçerli çerçevedeki ve son çerçevedeki eller arasındaki sınırlayıcı kutu IoU eşiğidir. El İşaretçisi'nin Video modu ve Akış modunda, izleme başarısız olursa El İşaretçisi el algılamayı tetikler. Aksi takdirde el algılama atlanır. 0.0 - 1.0 0.5
resultListener Sonuç dinleyicisini, el yer işaretleyicisi canlı yayın modundayken algılama sonuçlarını asenkron olarak alacak şekilde ayarlar. Yalnızca çalışma 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 dosyaları ve canlı yayın videolarıyla çalışır. Görev, yeniden boyutlandırma, döndürme ve değer normalleştirme dahil olmak üzere veri girişi ön işleme işlemlerini yönetir.

Aşağıdaki kod, verilerin işlenmek üzere nasıl aktarılacağını gösterir. Bu örneklerde, resimlerden, video dosyalarından ve canlı video yayınlarından elde edilen verilerin nasıl işleneceğine dair ayrıntılar yer alır.

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 kodunda veri hazırlama işlemi HandLandmarkerHelper.kt dosyasında gerçekleştirilir.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, söz konusu veri türüne özel HandLandmarker.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 gerçekleştirirken 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 örneklerinde, Hand Landmarker'ın bu farklı veri modlarında nasıl çalıştırılacağına dair basit örnekler gösterilmektedir:

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, giriş karesinin zaman damgasını da El İşaretçisi görevine sağlamanız gerekir.
  • El İşaretleyici görevi, resim veya video modunda çalışırken giriş resmini ya da kareyi işlemeye başlayana kadar mevcut iş parçacığını engeller. Kullanıcı arayüzünün engellenmesini önlemek için işlemeyi arka plan iş parçacığında yürütün.
  • El İşaretleyici görevi, canlı yayın modunda çalışırken mevcut iş parçacığını engellemez ancak hemen döndürülür. Her giriş çerçevesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır. El Yer İşaretçisi görevi başka bir kareyi işlemekle meşgulken algılama işlevi çağrılırsa görev yeni giriş karesini yoksayar.

El İşaretçisi örnek kodunda detect, detectForVideo ve detectAsync işlevleri HandLandmarkerHelper.kt dosyasında tanımlanır.

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

El yer işaretleyici, her algılama çalıştırması için bir el yer işaretleyicisi sonuç nesnesi oluşturur. Sonuç nesnesi, resim koordinatlarında el yer işaretlerini, dünya koordinatlarında el yer işaretlerini ve algılanan ellerin el hakimiyetini(sol/sağ el) içerir.

Aşağıda, bu görevin çıkış verilerine örnek verilmiştir:

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

  • El tercihi

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

  • Önemli noktalar

    Her biri x, y ve z koordinatlarından oluşan 21 el yer işareti vardır. x ve y koordinatları, sırasıyla resim genişliği ve yüksekliğine göre [0,0; 1,0] aralığında normalleştirilir. z koordinatı, bilekteki derinliğin orijin olduğu yer işareti derinliğini temsil eder. Değer ne kadar küçükse yer işareti kameraya o kadar yakındır. z büyüklüğü, x ile yaklaşık olarak aynı ölçeği kullanır.

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

    21 el yer işareti de dünya koordinatlarında sunulur. Her önemli nokta, x, y ve z değerlerinden oluşur. Bu değerler, orijini elin geometrik merkezinde olan, gerçek dünyadaki 3D koordinatları metre cinsinden temsil eder.

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 çıktısının görselleştirmesi gösterilmektedir:

Başparmağını kaldıran bir elin iskelet yapısının haritalandığı resim

El İşaretçisi örnek kodunda, görevden döndürülen sonuçların nasıl görüntüleneceği gösterilmektedir. Daha fazla bilgi için OverlayView sınıfına bakın.