Android için önemli nokta algılama rehberi

MediaPipe Poz İşaretçisi görevi, bir görüntüdeki insan vücuduna ait önemli noktaları tespit etmenizi ya da videosunu izleyin. Bu görevi vücutla ilgili önemli konumları belirlemek, duruşunuzu analiz etmek, ve hareketleri kategorilere ayırabilirsiniz. Bu görev, makine öğrenimi (ML) modellerini kullanır. tek resim veya videoyla çalışır. Görev, görüntüdeki vücut duruşunda önemli noktaları gösterir koordinatlarla ve 3 boyutlu dünya koordinatlarında gösterir.

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 Konum İşaretçisi işlevinin basit bir uygulamasıdır Android için uygulama. Örnekte, fiziksel bir Android cihazın kamerasıyla pozları tespit edebilir. Uygulama aynı zamanda cihaz galerisinden resim ve videolar yükleyin.

Uygulamayı kendi Android uygulamanız için başlangıç noktası olarak kullanabilir veya buna başvurabilirsiniz mevcut bir uygulamada değişiklik yaparken. Poz İş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 Poz İşaretçisi örnek uygulamasına ait dosyalar için:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/pose_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 bkz. Android.

Temel bileşenler

Aşağıdaki dosyalar, bu poz işaret oluşturma örneği için önemli kodu içerir uygulama:

  • PoseLandmarkerHelper.kt - Poz işaretleyiciyi başlatır, model ve yetki verme işlemini işler seçim.
  • CameraFragment.kt - Cihaz kamerasını işleyip resim ve video giriş verilerini işler.
  • GalleryFragment.kt - Çıkış resmini veya videosunu görüntülemek için OverlayView ile etkileşim kurar.
  • OverlayView.kt - Algılanan pozlar için görüntüyü uygular.

Kurulum

Bu bölümde, geliştirme ortamınızı ve ayarlarınızı yönetmeyle ilgili Pose Dönen Aracı'nı kullanmak için özel olarak proje kodlayacak. Şu konularda genel bilgi için: dahil olmak üzere MediaPipe görevlerini kullanmak için geliştirme ortamınızı platform sürümü gereksinimleri hakkında daha fazla bilgi için Android.

Bağımlılıklar

Poz İşaretçisi görevi com.google.mediapipe:tasks-vision kitaplığını kullanır. Ekle bu bağımlılığı Android uygulamanızın build.gradle dosyasına eklemeniz gerekir:

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

Model

MediaPipe Pose İşaretleyici görevi, oluşturacağım. Poz İş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. varsa, model PoseLandmarkerHelper.kt dosya:

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

Görevi oluşturma

MediaPipe Konum İş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 edinmek için Yapılandırma seçenekleri bulabilirsiniz.

Poz İşaretçisi şu giriş verisi türlerini destekler: hareketsiz resimler, video dosyaları ve canlı video akışları kullanılabilir. Koşu modunu belirtmeniz gerekiyor giriş veri türünüze karşılık gelen bir e-posta alırsınız. Sekmeyi seçin girin.

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)
    

Poz İşaretçisi örnek kod uygulaması, kullanıcının farklı konumlar arasında farklı olabilir. Bu yaklaşım, görev oluşturma kodunu daha karmaşık hale kullanım alanınıza uygun olmayabilir. Bu kodu setupPoseLandmarker() fonksiyonu PoseLandmarkerHelper.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
numposes tarafından algılanabilecek maksimum poz sayısı Poz İşaretçisi. Integer > 0 1
minPoseDetectionConfidence Poz algılamanın olması için gereken minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
minPosePresenceConfidence Pozlamanın minimum güven puanı puanının yüksek olması gerekir. Float [0.0,1.0] 0.5
minTrackingConfidence Poz izleme için minimum güven puanı kabul edilir. Float [0.0,1.0] 0.5
outputSegmentationMasks Poz İşaretçisi'nin algılanan öğe için bir segmentasyon maskesi verip vermediği poz verin. Boolean False
resultListener Sonuç işleyiciyi işaretleyici sonuçlarını alacak şekilde ayarlar otomatik olarak senkronize edilir. Yalnızca koşu 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 akışları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. Bu ö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()
    

Poz İşaretçisi örnek kodunda, veri hazırlama işlemi PoseLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

Görevi çalıştırma

Üzerinde çalıştığınız veri türüne bağlı olarak poseLandmarker.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. kullanıcının araya girmesine engel olan bir ileti dizisidir.

Aşağıdaki kod örnekleri, Poz İş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 = 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 Poz İşaretçisi görevine giriş çerçevesinin zaman damgası.
  • Görüntü veya video modunda çalışırken Poz İşaretçisi görevi, devam eder. Alıcı: kullanıcının araya gelmesini engellemekten kaçının, işlemi arka planda yürütün ileti dizisi.
  • Canlı yayın modunda çalışırken Poz İşaretçisi görevi geri dönüyor derhal geçerli olur ve mevcut ileti dizisi engellenmez. Sonucu çağırır dinleyiciye bir öğeyi işlemeyi bitirdiği her seferinde giriş çerçevesine sahip.

Poz İşaretçisi örnek kodunda, detect, detectForVideo ve detectAsync işlevleri PoseLandmarkerHelper.kt dosyası olarak kaydedebilirsiniz.

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

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

Aşağıda, bu görevdeki çı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ış, hem normalleştirilmiş koordinatlar (Landmarks) hem de dünya içeriyor koordinatları (WorldLandmarks) girin.

Çıkış şu normalleştirilmiş koordinatları içerir (Landmarks):

  • x ve y: Önemli nokta koordinatları: resim genişliği (x) ve yüksekliği (y).

  • z: Yer işareti derinliği; kalçaların orta noktasına kadar gelen derinliği kaynak. Değer ne kadar küçükse önemli nokta kameraya o kadar yakındır. İlgili içeriği oluşturmak için kullanılan z büyüklüğü, x ile hemen hemen 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: Metre cinsinden gerçek 3 boyutlu koordinatlar kalçanın orta noktasını bulun.

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

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

İsteğe bağlı segmentasyon maskesi, her bir pikselin ait olma olasılığını temsil eder. geri bildirim gönderebilirsiniz. Aşağıdaki resimde, Google Etiket Yöneticisi'nin görev çıkışı:

Poz İşaretçisi örnek kodu, döndürülen sonuçların nasıl görüntüleneceğini gösterir. bu görevlerin OverlayView inceleyebilirsiniz.