Android için önemli nokta algılama rehberi

MediaPipe Pose Interester görevi, bir görüntü veya videodaki insan vücudunun önemli noktalarını tespit etmenizi sağlar. Bu görevi önemli vücut konumlarını belirlemek, duruşunuzu analiz etmek ve hareketleri sınıflandırmak için kullanabilirsiniz. Bu görev, tek görüntüler veya videolarla çalışan makine öğrenimi (ML) modellerini kullanır. Görev, vücut pozisyonu yer işaretlerini resim koordinatlarında ve 3 boyutlu dünya koordinatlarında üretir.

Bu talimatlarda açıklanan kod örneğine GitHub'dan ulaşabilirsiniz. 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 Görevleri örnek kodu, Android için Pose Yer İşareti uygulamasının basit bir uygulamasıdır. Örnekte, kesintisiz video akışındaki pozları algılamak için fiziksel bir Android cihazın kamerası kullanılmaktadır. Uygulama, resimlerdeki ve videolardaki pozları da cihaz galerisinden algılayabilir.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya mevcut bir uygulamayı değiştirirken referans olarak kullanabilirsiniz. Posegrounder ö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 Pose Signer örnek uygulamasına ait dosyalara 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 Kurulum Kılavuzu'na bakın.

Temel bileşenler

Aşağıdaki dosyalar, bu poz önemli nokta oluşturma örnek uygulaması için önemli kodu içerir:

  • PoseLandmarkerHelper.kt: Poz işaretleyicisini başlatır, modeli ve yetkiyi seçme işlemini gerçekleştirir.
  • CameraFragment.kt - Cihazın kamerasını işler, görüntü ve video giriş verilerini işler.
  • GalleryFragment.kt - Çıkış resmini veya videoyu görüntülemek için OverlayView ile etkileşim kurar.
  • OverlayView.kt - Görüntüyü, algılanan pozlar için uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı oluşturmak için atılacak önemli adımlar ve projelerinizi, özellikle PoseSIGNer'ı kullanacak şekilde kodlamak için izlemeniz gereken temel adımlar açıklanmaktadır. 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

Pose Referans Aracı 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 Pose {9/} görevi için bu görevle uyumlu, eğitilmiş bir model paketi gerekir. Pose Signer için eğitilmiş modeller hakkında daha fazla bilgi almak isterseniz 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 PoseLandmarkerHelper.kt dosyasında tanımlanır:

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

Görevi oluşturma

MediaPipe Pose Referans Aracı 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.

Pose İşaretleyici, şu giriş verisi türlerini 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ı görmek için giriş verisi türünüze ait sekmeyi 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)
    

Konum İşareti örnek kodu 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 sizin kullanım alanınıza uygun olmayabilir. Bu kodu PoseLandmarkerHelper.kt dosyasındaki setupPoseLandmarker() 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
numposes Pose İşaretleyici tarafından tespit edilebilen maksimum poz sayısı. Integer > 0 1
minPoseDetectionConfidence Poz 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 önemli nokta algılamasında pozisyon varlığı puanının minimum güven puanı. Float [0.0,1.0] 0.5
minTrackingConfidence Poz izlemenin başarılı olarak kabul edilmesi için gereken minimum güven puanı. Float [0.0,1.0] 0.5
outputSegmentationMasks Posegrounder'ın algılanan poz için segmentasyon maskesi oluşturup oluşturmadığı. Boolean False
resultListener Sonuç işleyiciyi, Posegrounder canlı yayın modundayken belirgin işaretleyici sonuçlarını eşzamansız olarak alacak şekilde ayarlar. Yalnızca çalıştırma 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

Pose {9/}er uygulaması resimler, video dosyaları ve canlı video akışları 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()
    

Konum İşareti örnek kodunda, veri hazırlığı PoseLandmarkerHelper.kt dosyasında gerçekleştirilir.

Görevi çalıştırma

Çalıştığınız veri türüne bağlı olarak, ilgili veri türüne özel poseLandmarker.detect...() yöntemini kullanın. Tek tek 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 gerçekleştirirken kullanıcının araya ekleme iş parçacığını engellememek için algılamaları ayrı bir iş parçacığında çalıştırdığınızdan emin olun.

Aşağıdaki kod örneklerinde, Pose Signer'ın bu farklı veri modlarında nasıl çalıştırılacağına ilişkin 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ş karesinin zaman damgasını Konum İşaretçisi görevine sağlamanız gerekir.
  • Resim veya video modunda çalışırken, Pose İşaretleyici görevi giriş resmini veya karesini işlemeyi bitirene kadar geçerli iş parçacığını engeller. Kullanıcının araya girmesini engellemek için işlemi bir arka plan iş parçacığında yürütün.
  • Canlı yayın modunda çalışırken, Pose Referans Aracı görevi anında geri döner ve mevcut ileti dizisini engellemez. Bir giriş karesini işlemeyi her tamamladığında algılama sonucuyla birlikte sonuç işleyiciyi çağırır.

Konum İşareti örnek kodunda, detect, detectForVideo ve detectAsync işlevleri PoseLandmarkerHelper.kt dosyasında tanımlanmıştır.

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

Pose İşaretleyici, her algılama çalıştırması için bir poseLandmarkerResult nesnesi döndürür. Sonuç nesnesi, her bir poz önemli noktası için koordinatları içerir.

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

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 önemli nokta 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: Önemli nokta koordinatları, resim genişliği (x) ve yüksekliğine (y) göre 0,0 ile 1,0 arasında normalleştirilmiştir.

  • z: Referans noktası olarak kalçaların orta noktasındaki derinliğin yer aldığı belirgin nokta derinliği. Değer ne kadar küçükse yer işareti kameraya o kadar yakın olur. Z'nin büyüklüğü, yaklaşık olarak x ile aynı ölçeği kullanır.

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

Çıkış şu dünya koordinatlarını içerir (WorldLandmarks):

  • x, y ve z: Kalçaların orta noktası başlangıç noktası olmak üzere metre cinsinden gerçek dünyadan 3 boyutlu koordinatlar.

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

Aşağıdaki resimde, görev çıkışının görseli gösterilmektedir:

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

Posegrounder örnek kodu, görevden döndürülen sonuçların nasıl görüntüleneceğini gösterir. Daha fazla bilgi için OverlayView sınıfına bakın.