Android için önemli nokta algılama rehberi

MediaPipe Pose Landmarker görevi, bir resim veya videodaki insan vücutlarının önemli noktalarını algılamanıza olanak tanır. Bu görevi, vücudun önemli konumlarını belirlemek, duruşu analiz etmek ve hareketleri sınıflandırmak için kullanabilirsiniz. Bu görevde, tek resim veya videoyla çalışan makine öğrenimi (ML) modelleri kullanılır. Görev, vücut duruşu yer işaretlerini resim koordinatlarında ve 3 boyutlu dünya koordinatlarında döndürür.

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 bir Poz İşaretçisi uygulamasının basit bir uygulamasıdır. Bu örnekte, kesintisiz bir video akışındaki pozları algılamak için fiziksel bir Android cihazdaki kamera kullanılmaktadır. Uygulama, cihaz galerisindeki resim ve videolardaki pozları da algılayabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Poz Landmarker ö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ırın. Böylece yalnızca Pose Landmarker örnek uygulamasının dosyalarına sahip olursunuz:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/pose_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 poz yer işareti belirleme örneği uygulamasının önemli kodunu içerir:

  • PoseLandmarkerHelper.kt: Poz işaretçisini başlatır ve model ile temsilci seçimini yönetir.
  • CameraFragment.kt: Cihaz kamerasını yönetir ve resim ile video giriş verilerini işler.
  • GalleryFragment.kt: Çıkıştaki resmi veya videoyu görüntülemek için OverlayView ile etkileşim kurar.
  • OverlayView.kt: Algılanan pozların görüntüsünü uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı ve kod projelerinizi özellikle Pose 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ılavuzuna bakın.

Bağımlılıklar

Poz İş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 Pose Landmarker görevi, bu görevle uyumlu bir eğitimli model paketi gerektirir. Poz İş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 göz atın.

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

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

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

val modelName = "pose_landmarker_lite.task"
baseOptionsBuilder.setModelAssetPath(modelName)

Görevi oluşturun

MediaPipe Pose 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 için Yapılandırma seçenekleri başlıklı makaleyi inceleyin.

Poz İşaretçisi, aşağıdaki giriş veri türlerini destekler: sabit resimler, video dosyaları ve canlı video akışları. Görevi oluştururken giriş veri türünüze karşılık gelen çalışma modunu belirtmeniz gerekir. Görevin nasıl oluşturulacağını görmek için giriş veri türünüzün sekmesini seçin.

Resim

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

Video

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

Canlı yayın

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

Pose Landmarker ö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, PoseLandmarkerHelper.kt dosyasında setupPoseLandmarker() 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
numposes Poz İşaretçisi tarafından algılanabilecek maksimum poz sayısı. Integer > 0 1
minPoseDetectionConfidence Poz duruşu algılamanın başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
minPosePresenceConfidence Poz duruşu yer işareti algılamada poz varlığı puanının minimum güven puanı. Float [0.0,1.0] 0.5
minTrackingConfidence Poz izlemenin başarılı kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
outputSegmentationMasks Poz İşaretçisi'nin, algılanan poz için segmentasyon maskesi çıkışı yapıp yapmadığını belirtir. Boolean False
resultListener Sonuç dinleyicisini, Poz Landmarker canlı yayın modundayken yer işaretçisi sonuçlarını asenkron olarak alacak şekilde ayarlar. Yalnızca çalışma modu LIVE_STREAM olarak ayarlandığında kullanılabilir. ResultListener N/A
errorListener İsteğe bağlı bir hata işleyici ayarlar. ErrorListener N/A

Verileri hazırlama

Poz İşaretçisi, resimler, video dosyaları ve canlı video yayınları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()
    

Pose Landmarker örnek kodunda veri hazırlama işlemi PoseLandmarkerHelper.kt dosyasında yapılır.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, söz konusu veri türüne özel poseLandmarker.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ı müdahalesi 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, farklı veri modlarında Poz Landmarker'ın nasıl çalıştırıldığına dair basit örnekler gösterilmektedir:

Resim

val result = poseLandmarker.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

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

Canlı yayın

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

poseLandmarker.detectAsync(mpImage, frameTime)
    

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

  • Video modunda veya canlı yayın modunda çalışırken, giriş çerçevesinin zaman damgasını Pose Landmarker görevine sağlamanız gerekir.
  • Resim veya video modunda çalışırken Pose Landmarker görevi, giriş resmini veya kareyi işlemeyi tamamlayana kadar mevcut iş parçacığını engeller. Kullanıcının müdahalesini engellememek için işlemeyi arka plan iş parçacığında yürütün.
  • Pose Landmarker görevi, canlı yayın modunda çalışırken hemen döndürülür ve mevcut iş parçacığı engellenmez. Her giriş karesini işlemeyi tamamladığında sonuç dinleyicisini algılama sonucuyla çağırır.

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

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

Poz İşaretçisi, her algılama çalıştırması için bir poseLandmarkerResult nesnesi döndürür. Sonuç nesnesi, her bir poz yer işaretinin koordinatlarını içerir.

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

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

Çıkış, her bir yer işareti için hem normalleştirilmiş koordinatları (Landmarks) hem de dünya koordinatlarını (WorldLandmarks) içerir.

Çıkış, aşağıdaki normalleştirilmiş koordinatları (Landmarks) içerir:

  • x ve y: Resim genişliği (x) ve yüksekliği (y) ile 0,0 ile 1,0 arasında normalleştirilmiş yer işareti koordinatları.

  • z: Başlangıç noktası kalçaların orta noktasındaki derinlik olan yer işareti derinliği. 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.

  • visibility: Önemli noktanın resimde görünme olasılığı.

Çıkış, aşağıdaki dünya koordinatlarını (WorldLandmarks) içerir:

  • x, y ve z: Kalçaların orta noktası kaynak olarak kullanılarak metre cinsinden gerçek dünyadaki 3 boyutlu koordinatlar.

  • visibility: Önemli noktanın resimde görünme olasılığı.

Aşağıdaki resimde görev çıktısının görselleştirmesi gösterilmektedir:

Meditasyon yapan bir kadın. Modelin duruşu, uzuvlarının ve gövdesinin konumunu gösteren bir iskeletle vurgulanır.

İsteğe bağlı segmentasyon maskesi, her pikselin algılanan bir kişiye ait olma olasılığını gösterir. Aşağıdaki resim, görev çıktısının segmentasyon maskesidir:

Önceki resmin, kadının şeklini ana hatlarıyla gösteren segmentasyon maskesi

Pose Landmarker ö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.