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:
- Aşağıdaki komutu kullanarak git deposunu klonlayın:
git clone https://github.com/google-ai-edge/mediapipe-samples
- İ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
vey
: 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
vez
: 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:
İ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:
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.