Pose Detection هي تقنية رؤية حاسوبية تحدد وضعية جسم الإنسان من خلال النقاط الرئيسية (landmarks): الرأس، الكتفين، المرفقين، المعصمين، الوركين، الركبتين، الكاحلين. كل نقطة لها إحداثيات (x, y) في الفضاء ثنائي الأبعاد، والنماذج المتقدمة (MediaPipe BlazePose 3D) تضيف إحداثيات z للعمق. في التطبيقات المحمولة، يُستخدم Pose Detection في متتبعات اللياقة البدنية، تطبيقات اليوجا، مرشحات الواقع المعزز، برامج إعادة التأهيل، وأنظمة التحليل الرياضي. وفقاً لـ Google ML Kit، 2025، يعالج Pose Detection على الجهاز ما يصل إلى 30 إطاراً في الثانية بدقة 94% PCK.
النقاط الرئيسية
Pose Detection (أيضاً تقدير الوضعية) يشير إلى مهمة تحديد النقاط الرئيسية الدلالية لجسم الإنسان من صورة أو فيديو. نهج Top-down يكتشف أولاً الشخص (Object Detection)، ثم يحدد وضعيته. نهج Bottom-up يجد جميع النقاط المرجعية في الصورة، ثم يجمعها حسب الشخص (OpenPose). للأجهزة المحمولة يُستخدم bottom-up — فهو أسرع مع وجود عدة أشخاص في الإطار. يستخدم ML Kit وBlazePose نهج المرحلة الواحدة — الكشف + الوضعية في مسار واحد.
COCO Keypoints — مجموعة قياسية من 17 نقطة: الأنف، العينان (2)، الأذنان (2)، الكتفان (2)، المرفقان (2)، المعصمان (2)، الوركان (2)، الركبتان (2)، الكاحلان (2). يستخدم MediaPipe BlazePose 33 نقطة، مضيفاً: أصابع القدمين، الكعبين، مركز الجذع، نقاط الوجه. كلما زادت النقاط، زادت دقة تحليل الوضعية، لكن زاد الحمل الحسابي. لتطبيقات اللياقة البدنية، 17–20 نقطة كافية. للتحليل الكامل (اليوجا، الرقص) — 33 نقطة. لمرشحات AR — 33 نقطة + 468 نقطة وجه (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — مقياس دقة Pose Detection. يحسب نسبة النقاط المتوقعة ضمن مسافة من الحقيقة الأساسية (عادة 0.05–0.15 من حجم المربع المحيط للشخص). 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، يراعي مقياس الشخص وصعوبة النقطة. mAP@OKS — المقياس القياسي للمعايير.
| النموذج | النقاط المرجعية | PCK@0.1 | زمن الاستجابة (GPU) | الحجم |
|---|---|---|---|---|
| ML Kit Pose Acc | 33 | 94% | 15–30 ms | 14 MB |
| BlazePose Full | 33 + 3D | 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 |
رؤية النقاط الرئيسية: كل نقطة مرجعية لها درجة (0..1) تشير إلى مدى ثقة النموذج في النقطة وما إذا كانت مرئية. النقاط ذات الدرجة < 0.5 تُعتبر غير مرئية (مخفية، خارج الإطار). لتحليل الوضعية، استخدم النقاط المرئية فقط. لتقييم المحاذاة — احسب المسافات الموزونة بالثقة، حيث يكون للنقاط ذات الدرجة المنخفضة وزن أقل في المقياس.
ML Kit Pose Detection — مكتبة من Google للكشف عن الوضعية على الجهاز. تدعم 33 نقطة مرجعية، بما في ذلك نقاط الوجه وأصابع القدمين والكعبين. الأوضاع: Accurate Mode (نموذج 14 MB، 15–30 ms، دقة عالية) وStreaming Mode (5 MB، 5–10 ms، للوقت الحقيقي). يستخدم Streaming Mode نموذجاً خفيفاً مع التتبع — بعد الإطار الأول، يتتبع الحركة دون إعادة كشف المواضع الدقيقة، محققاً ما يصل إلى 60 إطار/ثانية.
API لـ ML Kit Pose Detection: PoseDetector (خيارات: setDetectorMode، setPerformanceMode) ← InputImage ← Pose (List<PoseLandmark>). كل PoseLandmark له: landmarkType (38 نوعاً)، position (PointF3D)، inFrameLikelihood (0..1). يوفر Pose أيضاً: المربع المحيط للشخص، قائمة النقاط المرجعية، طريقة getLandmark(type). لتصنيف الوضعية، استخدم الزوايا بين العظام: shoulderAngle، elbowAngle، hipAngle — تُحسب عبر Vector3D بين النقاط المرجعية المتجاورة.
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
)
}
ML Kit على iOS: Pose Detection متاح عبر ML Kit CocoaPods. API مطابق لنظام Android: PoseDetector ← UIImage ← Pose ← PoseLandmark. على iOS، يستخدم ML Kit Core ML وANE (A12+)، محققاً زمن استجابة 10–20 ms في Accurate Mode على iPhone 15 Pro. Streaming Mode — 3–8 ms، حتى 120 إطار/ثانية. على iOS، ML Kit Pose Detection أسرع من MediaPipe BlazePose (تسريع Core ML)، لكنه يتخلف عن BlazePose في عدد الإطارات في الثانية على الأجهزة القديمة (iPhone X–11).
MediaPipe BlazePose — نموذج عالي الأداء لـ Pose Detection من Google Research. يستخدم هندسة هجينة: خط أنابيب detector-decoder قائم على MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 نقطة مرجعية + إحداثيات ثلاثية الأبعاد (عمق z). BlazePose Lite: 33 نقطة مرجعية (ثنائية الأبعاد) بدون عمق. كلا النموذجين متاحان في MediaPipe Tasks Vision على Android وiOS وPython والويب. يعالج BlazePose Full 30–60 إطار/ثانية على GPU، وLite — 60+ إطار/ثانية.
تقدير الوضعية ثلاثية الأبعاد مع BlazePose: يتنبأ النموذج بالإحداثي z لكل نقطة مرجعية، مما يسمح بتقدير العمق (اقتراب/ابتعاد الأطراف) بدون كاميرا ستيريو. يُحسب الإحداثي z في الفضاء المتري (أمتار) بالنسبة للكاميرا. دقة BlazePose ثلاثي الأبعاد: 37 مم MPJPE (متوسط خطأ موضع المفصل) في المعايير العامة — كافٍ للياقة البدنية وAR، غير كافٍ للتشخيص الطبي. لـ ARKit/ARFoundation، يوفر BlazePose ثلاثي الأبعاد عمقاً طبيعياً.
// مهام رؤية MediaPipe Pose Detection
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 ضد ML Kit Pose Detection: BlazePose أسرع (60+ إطار/ثانية مقابل 30 إطار/ثانية)، يدعم الإحداثيات ثلاثية الأبعاد، يعمل عبر المنصات عبر MediaPipe. MLKit أسهل في التكامل (لا يتطلب MediaPipe SDK)، يتضمن نماذج مدربة مسبقاً بدقة عالية. للمشاريع iOS الأصلية — ML Kit Pose Detection (أفضل تحسين لـ ANE). للمشاريع عبر المنصات (Flutter، React Native) — MediaPipe BlazePose (نموذج موحد لجميع المنصات). للدقة في المشاهد المتطلبة — كلا النموذجين متشابهان.
MoveNet — عائلة من نماذج Pose Detection من TensorFlow، محسّنة لـ TFLite. Lightning (8 MB، INT8 — 4 MB): 17 نقطة رئيسية COCO، 91% PCK، زمن استجابة 8–15 ms، 30+ إطار/ثانية. Thunder (13 MB، INT8 — 6 MB): 17 نقطة رئيسية، 95% PCK، زمن استجابة 25–40 ms، 20+ إطار/ثانية. يستخدم MoveNet هندسة CenterNet + استيفاء ثنائي الخطوط لخريطة حرارية عالية الدقة. يدعم MoveNet الكشف متعدد الوضعيات (حتى 6 أشخاص). النماذج متاحة على TensorFlow Hub.
MoveNet Lightning ضد Thunder: Lightning — للتطبيقات في الوقت الحقيقي مع معدل إطارات مرتفع (لياقة بدنية، مرشحات AR). Thunder — لتحليل دقيق للوضعية (إعادة تأهيل، تحليل رياضي) على الأجهزة المزودة بـ GPU. كلا النموذجين يتحولان إلى Core ML عبر tf-coreml لنظام iOS. MoveNet متاح أيضاً عبر API TFLite Task Vision PoseLandmarker. التوصية: ابدأ بـ Lightning، إذا كانت الدقة غير كافية — انتقل إلى Thunder (فقط +15 ms زيادة في زمن الاستجابة).
// استنتاج MoveNet باستخدام TFLite
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 متعدد الوضعيات: كشف حتى 6 أشخاص في الإطار. بدلاً من نهج الخريطة الحرارية القياسي، يستخدم MoveNet كشف الأشخاص + تحسين الوضعية: يكتشف أولاً الأشخاص (قائم على المركز)، ثم يقدر كل وضعية. الوضع متعدد الوضعيات أبطأ 2–3 مرات من وضعية واحدة: Lightning — 25–50 ms (6 أشخاص). لتطبيقات اللياقة البدنية بمستخدم واحد، استخدم وضعية واحدة. للأنشطة الجماعية (اليوجا، الكروس فيت) — متعدد الوضعيات مع تحديد معدل الإطارات لتوفير البطارية.
Pose Classification — المرحلة بعد الكشف: تحويل النقاط المرجعية إلى إجراءات دلالية (واقف، جالس، رفع اليد، القرفصاء). الأساليب: قائم على القواعد (قواعد يدوية — زوايا بين العظام)، قائم على ML (انحدار لوجستي أو Random Forest على متجه النقاط المرجعية)، قائم على DL (مصنف LSTM لتسلسل الوضعيات عبر الإطارات). قائم على القواعد — دقة 50–80%، بسيط وسريع. قائم على ML — دقة 85–95% مع 200+ مثال مُصنف. LSTM — دقة 90–98% على السلاسل الزمنية (فيديو).
الزوايا بين العظام: لكل نقطة، تُحسب الزوايا مع النقاط المجاورة. أمثلة: زاوية المرفق الأيمن (الكتف ← المرفق ← المعصم)، زاوية الركبة اليمنى (الورك ← الركبة ← الكاحل)، زاوية الجذع (نقطة منتصف الكتفين ← نقطة منتصف الوركين). الزوايا ثابتة تجاه مقياس الشخص وموقعه على الشاشة. تطبيع الزوايا إلى النطاق [0، 1] يسمح بتصنيف الوضعية بقاعدة عتبة بسيطة: إذا elbowAngle < 30° — الذراع مثنية، إذا > 150° — ممدودة.
// مصنف القرفصاء القائم على القواعد
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: القرفصاء، تمارين الضغط، اللوح الخشبي، رفع الساقين. يستقبل المصنف قائمة من النقاط المرجعية ويعيد الإجراء + الثقة. يتضمن تمليس زمني (مرشح زمني): HED (Holt Exponential Double Smoothing) للانتقال السلس بين الوضعيات. للإجراءات المخصصة — درب مصنفاً على 100–500 مثال عبر MediaPipe Model Maker (TensorFlow Lite + بيانات وصفية).
متتبعات اللياقة البدنية مع تصحيح التقنية — يحلل التطبيق وضعية المستخدم أثناء التمرين ويقدم توجيهات صوتية: «اخفض الوركين»، «لا تميل الجذع». ML Kit Pose Detection + مصنف قائم على القواعد يحسب التكرارات ويقيم الجودة. القرفصاء: زاوية الركبة < 90° — قرفصاء صحيحة، زاوية الظهر < 45° — ميلان خطر للجذع. تمرين الضغط: زاوية المرفق < 90° في النقطة السفلية — ضغطة كاملة. تمرين العقلة: الذقن فوق مستوى العارضة.
إعادة التأهيل والعلاج الطبيعي — يُستخدم Pose Detection للمراقبة عن بُعد لتمارين العلاج الطبيعي. يحدد الطبيب وضعية مرجعية (مثل، إبعاد الكتف بزاوية 45°)، ويقيس التطبيق الزاوية الحالية والانحرافات. يوفر BlazePose ثلاثي الأبعاد دقة زوايا ±3° — كافية للتقييم السريري. التردد: إطار واحد كل 3–5 ثوانٍ (توفير البطارية). على الجهاز — خصوصية بيانات المريض الطبية. إعادة التأهيل بعد السكتة الدماغية: تتبع اليد إلى الكتف، تمديد المرفق، ثني الورك.
مرشحات AR والتأثيرات — Pose Detection هو أساس مرشحات AR في شبكات التواصل الاجتماعي (TikTok، Instagram، Snapchat). تُستخدم النقاط المرجعية للرأس والكتفين واليدين لتركيب الأقنعة والرسوم المتحركة والعناصر الزخرفية. MediaPipe BlazePose Full + Face Mesh (468 نقطة) يحقق 120+ إطار/ثانية على الأجهزة الرائدة. ARKit/ARCore Face Tracking + Pose Detection — مزيج لـ AR لكامل الجسم. المتطلبات: FPS > 30، زمن استجابة motion-to-photon < 20 ms.
// مرشح AR مع نقاط مرجعية للوضعية
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)
}
}
التحليل الرياضي — تقييم احترافي للتقنية: التحليل البيوميكانيكي للجري (الإيقاع، طول الخطوة، تناظر تأرجح الذراعين)، السباحة (دوران الجسم، زاوية المرفق أثناء الضربة)، التنس (دوران الكتف، حركة المعصم). MoveNet Thunder مع المعالجة اللاحقة يوفر دقة كافية للتحليل غير الاحترافي. تتطلب الرياضة الاحترافية التقاط حركة ثلاثي الأبعاد (Vicon، OptiTrack)، لكن Pose Detection على الهاتف هو بديل ميسور للسوق الشامل. مزامنة الزوايا بين الإطارات هي مكون رئيسي.
الأسئلة المتكررة
استخدم التمليس الزمني: One Euro Filter (مرشح 1€) — تردد قطع قابل للضبط لكل نقطة مرجعية على حدة، يقمع الضوضاء عالية التردد (الاهتزاز) مع الحفاظ على الحركة الحقيقية (زمن استجابة منخفض). MediaPipe BlazePose يتضمن HED مدمج (Holt Exponential Double Smoothing) — تمليس تكيفي مع توقع الحركة. لـ ML Kit، قم بتنفيذ مرشح 1€ بنفسك: للمرشح معلمتان — beta (السرعة) وminCutoff (عتبة التردد). الموصى به: beta = 0.04، minCutoff = 0.5 (Android).
ML Kit Pose Detection — شخص واحد (وضعية واحدة). MoveNet Lightning — حتى 6 أشخاص (متعدد الوضعيات). MediaPipe BlazePose — حتى 2–3 أشخاص عبر MediaPipe Tasks (متعدد الوضعيات). للتطبيقات ذات الأنشطة الجماعية، استخدم MoveNet Lightning أو BlazePose. لتطبيقات اللياقة البدنية بمستخدم واحد — ML Kit (تكامل أسهل، دقة أعلى لوضعية واحدة). لمكالمات الفيديو مع مرشحات AR — BlazePose Lite مع متعدد الوضعيات (FPS عالي) كافٍ.
الزاوية بين عظمين: خذ ثلاث نقاط مرجعية — المفصل A، المفصل B (رأس الزاوية)، المفصل C. احسب المتجهين BA = (A - B) وBC = (C - B). الزاوية = atan2(cross(BA, BC)، dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). الزاوية في النطاق 0–180°. للإحداثيات ثلاثية الأبعاد (BlazePose ثلاثي الأبعاد) استخدم Vector3D. طبع الزوايا إلى النطاق [0،1] لمصنف ML.
نعم، جميع النماذج الرئيسية (ML Kit، BlazePose، MoveNet) تكتشف النقاط المرجعية لكلتا اليدين في وقت واحد: LEFT_SHOULDER، LEFT_ELBOW، LEFT_WRIST، RIGHT_SHOULDER، RIGHT_ELBOW، RIGHT_WRIST. للكشف الإضافي عن اليدين، ادمج Pose Detection + Hand Landmarker (21 نقطة لكل يد). MediaPipe Hands + BlazePose هو المزيج القياسي لكامل الجسم + اليدين. على iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: الحد الأدنى للمربع المحيط للشخص — 100×100 بكسل (نسبة العرض إلى الارتفاع ~1:1). MoveNet Lightning: 120×120 بكسل. BlazePose: 80×160 بكسل (مربع محيط عمودي). لشخص كامل الطول على بعد 3 أمتار من الكاميرا (1920×1080) — حوالي 250×600 بكسل، وهو كافٍ. على مسافات > 5 أمتار، تنخفض الدقة — استخدم متعدد الوضعيات + إدخال عالي الدقة. للأجسام البعيدة، Object Detection + Pose Estimation (مرحلتان) أفضل.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.