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:
- 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 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
vey
: Ö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 olarakx
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
vez
: 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.