Pose Detection, insan vücudunun konumunu kilit noktalara (landmarks) göre belirleyen bir bilgisayar görüşü teknolojisidir: baş, omuzlar, dirsekler, bilekler, kalçalar, dizler, ayak bilekleri. Her noktanın 2B uzayda (x, y) koordinatları vardır ve gelişmiş modeller (MediaPipe BlazePose 3D) derinlik için z-koordinatı ekler. Mobil uygulamalarda Pose Detection, fitness takipçilerinde, yoga uygulamalarında, AR filtrelerinde, rehabilitasyon programlarında ve spor analiz sistemlerinde kullanılır. Google ML Kit, 2025'e göre, cihaz üzerinde Pose Detection, %94 PCK doğrulukla saniyede 30 kareye kadar işler.
Önemli Noktalar
Pose Detection (ayrıca Pose Estimation), bir görüntü veya videodan insan vücudunun anlamsal kilit noktalarını belirleme görevini ifade eder. Yukarıdan-aşağıya yaklaşım önce kişiyi algılar (Nesne Algılama), ardından pozunu belirler. Aşağıdan-yukarıya yaklaşım görüntüdeki tüm landmarkları bulur, ardından bunları kişiye göre gruplar (OpenPose). Mobil cihazlar için aşağıdan-yukarıya kullanılır — çerçevede birden fazla kişi varken daha hızlıdır. ML Kit ve BlazePose tek aşamalı yaklaşım kullanır — tek geçişte algılama + poz.
COCO Keypoints — 17 noktadan oluşan standart bir set: burun, gözler (2), kulaklar (2), omuzlar (2), dirsekler (2), bilekler (2), kalçalar (2), dizler (2), ayak bilekleri (2). MediaPipe BlazePose 33 nokta kullanır ve ayak parmakları, topuklar, gövde merkezi, yüz noktaları ekler. Ne kadar çok nokta olursa, poz analizi o kadar doğru olur, ancak hesaplama yükü o kadar yüksek olur. Fitness uygulamaları için 17-20 nokta yeterlidir. Tam analiz (yoga, dans) için — 33 nokta. AR filtreleri için — 33 nokta + 468 yüz noktası (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — Pose Detection doğruluk metriği. Ground truth'ten belirli bir mesafe içinde (genellikle kişinin sınırlayıcı kutusu boyutunun 0.05-0.15'i) tahmin edilen noktaların oranını hesaplar. ML Kit Pose Detection: %94 PCK@0.1. BlazePose Full: %96 PCK@0.1. MoveNet Lightning: %91 PCK@0.1. OKS (Object Keypoint Similarity) — COCO'da kullanılan, kişinin ölçeğini ve nokta zorluğunu hesaba katan bir metrik. mAP@OKS — benchmark'lar için standart metrik.
| Model | Landmark | PCK@0.1 | Gecikme (GPU) | Boyut |
|---|---|---|---|---|
| ML Kit Pose Acc | 33 | %94 | 15–30 ms | 14 MB |
| BlazePose Full | 33 + 3B | %96 | 10–20 ms | 12 MB |
| BlazePose Lite | 33 | %91 | 5–10 ms | 5 MB |
| MoveNet Lightning | 17 | %91 | 8–15 ms | 8 MB |
| MoveNet Thunder | 17 | %95 | 25–40 ms | 13 MB |
Keypoint Görünürlüğü: her landmark, modelin nokta hakkında ne kadar emin olduğunu ve görünür olup olmadığını gösteren bir puana (0..1) sahiptir. Puanı < 0.5 olan noktalar görünmez (örtülü, çerçeve dışı) kabul edilir. Poz analizi için yalnızca görünür noktaları kullanın. Hizalama değerlendirmesi için — güven ağırlıklı mesafeler hesaplayın; düşük puana sahip noktalar metrikte daha az ağırlığa sahiptir.
ML Kit Pose Detection — Google'dan cihaz üzerinde poz algılama için bir kütüphane. Yüz noktaları, ayak parmakları ve topuklar dahil 33 landmarkı destekler. Modlar: Accurate Mode (14 MB model, 15-30 ms, yüksek doğruluk) ve Streaming Mode (5 MB, 5-10 ms, gerçek zamanlı için). Streaming Mode, izleme özellikli hafif bir model kullanır — ilk kareden sonra, kesin konumları yeniden algılamadan hareketi izler ve 60 FPS'ye kadar ulaşır.
ML Kit Pose Detection API: PoseDetector (seçenekler: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Her PoseLandmark'ın: landmarkType (38 tip), position (PointF3D), inFrameLikelihood (0..1) özellikleri vardır. Pose ayrıca şunları sağlar: kişinin boundingBox'ı, landmark listesi, getLandmark(type) yöntemi. Poz sınıflandırması için kemikler arasındaki açıları kullanın: shoulderAngle, elbowAngle, hipAngle — bitişik landmarklar arasında Vector3D ile hesaplanır.
val options = PoseDetectorOptions.Builder()
.setDetectorMode(PoseDetectorOptions.STREAM_MODE)
.setPerformanceMode(PoseDetectorOptions.PERFORMANCE_MODE_FAST)
.build()
val detector = PoseDetection.getClient(options)
detector.process(inputImage)
.addOnSuccessListener { pose ->
val leftElbow = pose.getLandmark(PoseLandmark.LEFT_ELBOW)
val leftShoulder = pose.getLandmark(PoseLandmark.LEFT_SHOULDER)
val leftWrist = pose.getLandmark(PoseLandmark.LEFT_WRIST)
val elbowAngle = calculateAngle(
leftShoulder.position, leftElbow.position, leftWrist.position
)
}
iOS'ta ML Kit: Pose Detection, ML Kit CocoaPods aracılığıyla kullanılabilir. API, Android ile aynıdır: PoseDetector → UIImage → Pose → PoseLandmark. iOS'ta ML Kit, Core ML ve ANE (A12+) kullanır ve iPhone 15 Pro'da Accurate Mode'da 10-20 ms gecikme süresine ulaşır. Streaming Mode — 3-8 ms, 120 FPS'ye kadar. iOS'ta ML Kit Pose Detection, MediaPipe BlazePose'dan daha hızlıdır (Core ML hızlandırması), ancak eski cihazlarda (iPhone X-11) FPS'de BlazePose'un gerisinde kalır.
MediaPipe BlazePose — Google Research'tan Pose Detection için yüksek performanslı bir model. Hibrit bir mimari kullanır: MobileNetV2 + Feature Pyramid Network tabanlı detector-decoder hattı. BlazePose Full: 33 landmark + 3B koordinatlar (derinlik z). BlazePose Lite: derinliksiz 33 landmark (2B). Her iki model de Android, iOS, Python ve Web'de MediaPipe Tasks Vision'da mevcuttur. BlazePose Full, GPU'da 30-60 FPS işler, Lite — 60+ FPS.
BlazePose ile 3B Poz Tahmini: model her landmark için z-koordinatını tahmin eder ve stereo kamera olmadan derinlik tahminine (uzuvların yaklaşması/uzaklaşması) olanak tanır. Z-koordinatı, kameraya göre metrik uzayda (metre) hesaplanır. BlazePose 3B doğruluğu: herkese açık benchmark'larda 37 mm MPJPE (Mean Per Joint Position Error) — fitness ve AR için yeterli, tıbbi teşhis için yetersiz. ARKit/ARFoundation için BlazePose 3B doğal derinlik sağlar.
// MediaPipe Pose Detection Tasks Vision
val options = PoseLandmarkerOptions.Builder()
.setBaseOptions(BaseOptions.builder()
.setModelAssetPath("pose_landmarker_full.task")
.build())
.setDelegate(Delegate.GPU)
.build()
val landmaker = PoseLandmarker.createFromOptions(context, options)
val result = landmaker.detect(MPImage.fromBitmap(bitmap))
result.landmarks.forEach { pose ->
pose.forEach { landmark ->
drawLandmark(landmark.x, landmark.y, landmark.z)
}
}
BlazePose vs ML Kit Pose Detection: BlazePose daha hızlıdır (60+ FPS vs 30 FPS), 3B koordinatları destekler, MediaPipe aracılığıyla platformlar arası çalışır. ML Kit'in entegrasyonu daha kolaydır (MediaPipe SDK gerektirmez), yüksek doğrulukta önceden eğitilmiş modeller içerir. iOS yerel projeleri için — ML Kit Pose Detection (en iyi ANE optimizasyonu). Platformlar arası projeler (Flutter, React Native) için — MediaPipe BlazePose (tüm platformlar için birleşik model). Zorlu sahnelerde doğruluk için — her iki model de karşılaştırılabilir.
MoveNet — TFLite için optimize edilmiş, TensorFlow'dan bir Pose Detection modelleri ailesi. Lightning (8 MB, INT8 — 4 MB): 17 COCO keypoint, %91 PCK, 8-15 ms gecikme, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoint, %95 PCK, 25-40 ms gecikme, 20+ FPS. MoveNet, CenterNet mimarisi + yüksek çözünürlüklü ısı haritası için çift doğrusal enterpolasyon kullanır. MoveNet, çoklu poz algılamayı (6 kişiye kadar) destekler. Modeller TensorFlow Hub'da mevcuttur.
MoveNet Lightning vs Thunder: Lightning — yüksek FPS (fitness, AR filtreleri) ile gerçek zamanlı uygulamalar için. Thunder — GPU'lu cihazlarda doğru poz analizi (rehabilitasyon, spor analizi) için. Her iki model de iOS için tf-coreml aracılığıyla Core ML'ye dönüştürülür. MoveNet ayrıca TFLite Task Vision PoseLandmarker API'si aracılığıyla da kullanılabilir. Öneri: Lightning ile başlayın, doğruluk yetersizse Thunder'a geçin (yalnızca +15 ms gecikme ek yükü).
// TFLite ile MoveNet Çıkarımı
Interpreter interpreter = new Interpreter(loadModel(context));
TensorImage image = TensorImage.fromBitmap(bitmap);
image.load(Bitmap.createScaledBitmap(bitmap, 192, 192, true));
float[][] output = new float[1][51];
interpreter.run(image.getTensorBuffer(), output);
float[] keypoints = output[0];
for (int i = 0; i < 17; i++) {
float y = keypoints[i * 3];
float x = keypoints[i * 3 + 1];
float score = keypoints[i * 3 + 2];
drawKeypoint(x, y, score);
}
MoveNet Çoklu Poz: çerçevede 6 kişiye kadar algılama. Standart ısı haritası yaklaşımı yerine MoveNet, kişi algılama + poz iyileştirme kullanır: önce kişileri algılar (merkez nokta tabanlı), ardından her pozu tahmin eder. Çoklu poz modu, tekli poza göre 2-3 kat daha yavaştır: Lightning — 25-50 ms (6 kişi). Tek kullanıcılı fitness uygulamaları için tekli poz kullanın. Grup aktiviteleri (yoga, crossfit) için — pil tasarrufu için kare hızı sınırlamasıyla çoklu poz.
Pose Classification — algılama sonrası aşama: landmarkları anlamsal eylemlere (ayakta, oturuyor, el kaldırmış, çömelme) dönüştürme. Yaklaşımlar: Kural tabanlı (manuel kurallar — kemikler arasındaki açılar), ML tabanlı (landmark vektöründe lojistik regresyon veya Random Forest), DL tabanlı (kareler arasında poz dizisinin LSTM sınıflandırıcısı). Kural tabanlı — %50-80 doğruluk, basit ve hızlı. ML tabanlı — 200+ etiketli örnekle %85-95 doğruluk. LSTM — zaman serilerinde (video) %90-98 doğruluk.
Kemikler arasındaki açılar: her nokta için komşu noktalarla açılar hesaplanır. Örnekler: sağ dirsek açısı (omuz → dirsek → bilek), sağ diz açısı (kalça → diz → ayak bileği), gövde açısı (omuz orta noktası → kalça orta noktası). Açılar, kişinin ölçeğine ve ekran konumuna göre değişmez. Açıları [0, 1] aralığına normalleştirmek, basit bir eşik kuralıyla (elbowAngle < 30° — kol bükülü, > 150° — uzatılmış) poz sınıflandırmasına olanak tanır.
// Kural tabanlı squat sınıflandırıcı
fun classifySquat(pose: Pose): SquatPhase {
val kneeAngle = angle(
pose.getLandmark(PoseLandmark.LEFT_HIP),
pose.getLandmark(PoseLandmark.LEFT_KNEE),
pose.getLandmark(PoseLandmark.LEFT_ANKLE)
)
return when {
kneeAngle > 140f -> SquatPhase.STANDING
kneeAngle < 90f -> SquatPhase.SQUAT
else -> SquatPhase.TRANSITION
}
}
MediaPipe Pose Classification — MediaPipe Tasks'te bulunan önceden eğitilmiş sınıflandırıcılar: squat, şınav, plank, bacak kaldırma. Sınıflandırıcı bir landmark listesi alır ve eylem + güven döndürür. Pozlar arasında yumuşak geçişler için zamansal yumuşatma (zamansal filtre) içerir: HED (Holt Exponential Double Smoothing). Özel eylemler için — MediaPipe Model Maker (TensorFlow Lite + meta veri) aracılığıyla 100-500 örnek üzerinde bir sınıflandırıcı eğitin.
Teknik düzeltmeli fitness takipçileri — uygulama, egzersiz sırasında kullanıcının pozunu analiz eder ve sesli ipuçları sağlar: "kalçaları indir", "gövdeyi öne eğme". ML Kit Pose Detection + kural tabanlı sınıflandırıcı tekrarları sayar ve kaliteyi değerlendirir. Squat: diz açısı < 90° — doğru squat, sırt açısı < 45° — tehlikeli gövde eğimi. Şınav: alt noktada dirsek açısı < 90° — tam şınav. Barfiks: çene, bar seviyesinin üzerinde.
Rehabilitasyon ve fizyoterapi — Pose Detection, fizik tedavi egzersizlerinin uzaktan izlenmesi için kullanılır. Bir doktor referans poz belirler (örneğin, omuzun 45°'de abdüksiyonu), uygulama mevcut açıyı ve sapmaları ölçer. BlazePose 3B, ±3° açı doğruluğu sağlar — klinik değerlendirme için yeterli. Sıklık: 3-5 saniyede 1 kare (pil tasarrufu). Cihaz üzerinde — hasta tıbbi verilerinin gizliliği. İnme sonrası rehabilitasyon: el-omuz, dirsek-ekstansiyon, kalça-fleksiyon takibi.
AR filtreleri ve efektler — Pose Detection, sosyal ağlardaki (TikTok, Instagram, Snapchat) AR filtrelerinin temelini oluşturur. Baş, omuz ve ellerin landmarkları, maskeleri, animasyonları, dekoratif öğeleri yerleştirmek için kullanılır. MediaPipe BlazePose Full + Face Mesh (468 nokta), amiral gemisi cihazlarda 120+ FPS sağlar. ARKit/ARCore Face Tracking + Pose Detection — tam vücut AR için bir kombinasyon. Gereksinimler: FPS > 30, motion-to-photon gecikmesi < 20 ms.
// Poz landmarkları ile AR filtresi
let request = VNDetectHumanBodyPoseRequest { req, _ in
guard let observation = req.results?.first as? VNHumanBodyPoseObservation else { return }
let keypoints = try observation.recognizedPoints(.all)
let rightShoulder = keypoints[VNHumanBodyPoseObservation.JointName.rightShoulder]
DispatchQueue.main.async {
arView.placeFilter(at: rightShoulder?.location ?? .zero)
}
}
Spor analizi — profesyonel teknik değerlendirme: koşunun biyomekanik analizi (kadans, adım uzunluğu, kol sallama simetrisi), yüzme (vücut dönüşü, kuvvet çekişi sırasında dirsek açısı), tenis (omuz dönüşü, bilek snap'i). MoveNet Thunder, son işleme ile profesyonel olmayan analiz için yeterli doğruluk sağlar. Profesyonel spor, 3B hareket yakalama (Vicon, OptiTrack) gerektirir, ancak telefon tabanlı Pose Detection, kitlesel pazar için uygun fiyatlı bir alternatiftir. Kareler arasında açı senkronizasyonu önemli bir bileşendir.
Sıkça Sorulan Sorular
Zamansal yumuşatma kullanın: One Euro Filter (1€ filtre) — her landmark için ayrı ayrı yapılandırılabilir kesme frekansı, gerçek hareketi (düşük gecikme) korurken yüksek frekanslı gürültüyü (titreme) bastırır. MediaPipe BlazePose, hareket tahmini ile uyarlamalı yumuşatma sağlayan yerleşik HED (Holt Exponential Double Smoothing) içerir. ML Kit için 1€ filtresini kendiniz uygulayın: filtrenin iki parametresi vardır — beta (hız) ve minCutoff (frekans eşiği). Önerilenler: beta = 0.04, minCutoff = 0.5 (Android).
ML Kit Pose Detection — bir kişi (tekli poz). MoveNet Lightning — 6 kişiye kadar (çoklu poz). MediaPipe BlazePose — MediaPipe Tasks aracılığıyla 2-3 kişiye kadar (çoklu poz). Grup aktivite uygulamaları için MoveNet Lightning veya BlazePose kullanın. Tek kullanıcılı fitness uygulamaları için — ML Kit (daha kolay entegrasyon, daha yüksek tekli poz doğruluğu). AR filtreli görüntülü aramalar için — çoklu poz (yüksek FPS) ile BlazePose Lite yeterlidir.
İki kemik arasındaki açı: üç landmark alın — eklem A, eklem B (açının tepe noktası), eklem C. BA = (A - B) ve BC = (C - B) vektörlerini hesaplayın. Açı = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Açı 0-180° aralığındadır. Üç boyutlu koordinatlar için (BlazePose 3B) Vector3D kullanın. ML sınıflandırıcı için açıları [0,1] aralığına normalleştirin.
Evet, tüm ana modeller (ML Kit, BlazePose, MoveNet) her iki elin landmarklarını aynı anda algılar: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Ek el izleme için Pose Detection + Hand Landmarker'ı (el başına 21 nokta) birleştirin. MediaPipe Hands + BlazePose, tam vücut + eller için standart kombinasyondur. iOS'ta — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: minimum kişi sınırlayıcı kutusu — 100x100 piksel (en-boy oranı ~1:1). MoveNet Lightning: 120x120 piksel. BlazePose: 80x160 piksel (dikey sınırlayıcı kutu). Kameradan 3 metre uzaklıkta tam boy bir kişi için (1920x1080) — yaklaşık 250x600 px, yeterlidir. > 5 metre mesafede doğruluk düşer — Çoklu Poz + yüksek çözünürlüklü giriş kullanın. Uzaktaki nesneler için Nesne Algılama + Poz Tahmini (iki aşamalı) daha iyidir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun