تشخیص حرکت (Pose Detection): این چیست، مدل‌ها و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-07-19 زمان مطالعه: 9 دقیقه

Pose Detection — فناوری بینایی کامپیوتری که موقعیت بدن انسان را از طریق نقاط کلیدی (landmarks) تعیین می‌کند: سر، شانه‌ها، آرنج‌ها، مچ‌ها، باسن‌ها، زانوها، قوزک‌ها. هر نقطه دارای مختصات (x, y) در فضای 2D است، و مدل‌های پیشرفته (MediaPipe BlazePose 3D) مختصات z را برای عمق اضافه می‌کنند. در برنامه‌های موبایل، Pose Detection در ردگیرهای تناست‌اندازی، برنامه‌های یوگا، فیلترهای AR، برنامه‌های توانبخشی و سیستم‌های تحلیل ورزشی کاربرد دارد. به گزارش Google ML Kit، 2025، Pose Detection روی دستگاه تا 30 قاب در ثانیه را با دقت 94% PCK پردازش می‌کند.

نکات کلیدی

  • Pose Detection — تعیین نقاط کلیدی بدن (landmarks) از تصویر
  • ML Kit Pose Detection — 33 نقطه کلیدی، 30 FPS، دقت 94% PCK
  • MediaPipe BlazePose — 33 نقطه + 3D، تا 60 FPS روی GPU
  • MoveNet Lightning — 17 نقطه کلیدی (COCO)، 30+ FPS، 8 MB، INT8
  • On-device — حریم خصوصی، بلافاصله، بدون ارسال ویدیو به سرور

Pose Detection چیست: مبانی و متریک‌ها

Pose Detection (نیز به Pose Estimation شناخته می‌شود) به وظیفه تعیین نقاط کلیدی سمانتیک بدن انسان از روی تصویر یا ویدیو اشاره دارد. رویکرد Top-down ابتدا انسان را تشخیص می‌دهد (Object Detection)، سپس حرکت آن را تعیین می‌کند. رویکرد Bottom-up تمامی landmarks را روی تصویر پیدا کرده، سپس آن‌ها را بر اساس افراد گروه‌بندی می‌کند (OpenPose). برای دستگاه‌های موبایل از bottom-up استفاده می‌شود — در حضور چند نفر در کادر سریع‌تر است. ML Kit و BlazePose از رویکرد single-stage استفاده می‌کنند — تشخیص + حرکت در یک مرحله.

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. به صورت نسبت نقاطی محاسبه می‌شود که در فاصله از ground truth (معمولاً 0.05–0.15 از اندازه bounding box انسان) پیش‌بینی شده‌اند. 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 — متریک استاندارد برای بنچمارک‌ها.

مدلLandmarksPCK@0.1تاخیر (GPU)اندازه
ML Kit Pose Acc3394%15–30 ms14 MB
BlazePose Full33 + 3D96%10–20 ms12 MB
BlazePose Lite3391%5–10 ms5 MB
MoveNet Lightning1791%8–15 ms8 MB
MoveNet Thunder1795%25–40 ms13 MB

Keypoint Visibility: هر نقطه کلیدی امتیاز (0..1) دارد که نشان می‌دهد چقدر مدل از نقطه مطمئن است و آیا قابل دید است. نقاطی با امتیاز < 0.5 غیرقابل دید محسوب می‌شوند (پوشیده، خارج از کادر). برای تحلیل حرکت تنها از نقاط قابل دید استفاده کنید. برای ارزیابی تراز — confidence-weighted distances را محاسبه کنید که در آن نقاط با امتیاز پایین وزن کمتری در متریک دارند.

ML Kit Pose Detection روی Android و iOS

ML Kit Pose Detection — کتابخانه‌ای از Google برای تعیین حرکت روی دستگاه. از 33 نقطه کلیدی از جمله نقاط صورت، انگشت‌های پا و پاشنه‌ها پشتیبانی می‌کند. حالت‌ها: Accurate Mode (مدل 14 MB، 15–30 ms، دقت بالا) و Streaming Mode (5 MB، 5–10 ms، برای بلافاصله). Streaming Mode از مدل سبک‌تر با ردیابی استفاده می‌کند — پس از کادر اول، حرکت را بدون تشخیص مجدد موقعیت‌های دقیق ردیابی می‌کند که تا 60 FPS را فراهم می‌کند.

API ML Kit Pose Detection: PoseDetector (گزینه‌ها: setDetectorMode، setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). هر PoseLandmark دارای: landmarkType (38 نوع)، position (PointF3D)، inFrameLikelihood (0..1) است. Pose همچنین اطلاعات زیر را فراهم می‌کند: boundingBox انسان، فهرست landmarks، روش getLandmark(type). برای طبقه‌بندی حرکت از زاویه‌های بین استخوان‌ها استفاده کنید: shoulderAngle، elbowAngle، hipAngle — از طریق Vector3D بین landmarks مجاور محاسبه می‌شوند.

kotlin
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+) استفاده می‌کند که در iPhone 15 Pro در Accurate Mode تاخیر 10–20 ms را فراهم می‌کند. Streaming Mode — 3–8 ms، تا 120 FPS. در iOS، ML Kit Pose Detection سریع‌تر از MediaPipe BlazePose کار می‌کند (سرعت‌بخشی Core ML)، اما در دستگاه‌های قدیمی (iPhone X–11) از نظر تعداد FPS از BlazePose ضعیف‌تر است.

MediaPipe BlazePose: معماری و 3D

MediaPipe BlazePose — مدلی با کارایی بالا برای Pose Detection از Google Research. از معماری ترکیبی detector-decoder pipeline بر پایه MobileNetV2 + Feature Pyramid Network استفاده می‌کند. BlazePose Full: 33 نقطه + مختصات 3D (عمق z). BlazePose Lite: 33 نقطه (2D) بدون عمق. هر دو مدل در MediaPipe Tasks Vision برای Android، iOS، Python و Web موجود هستند. BlazePose Full روی GPU 30–60 FPS و Lite بیش از 60 FPS را پردازش می‌کند.

3D Pose Estimation با BlazePose: مدل برای هر نقطه کلیدی مختصات z را پیش‌بینی می‌کند که امکان ارزیابی عمق (نزدیک/دور شدن اندام‌ها) را بدون دوربین ستریو می‌دهد. مختصات z در فضای متریک (متر) نسبت به دوربین محاسبه می‌شود. دقت BlazePose 3D: 37 mm MPJPE (Mean Per Joint Position Error) در بنچمارک‌های عمومی — برای تناست و AR کافی، برای تشخیص پزشکی کافی نیست. برای ARKit/ARFoundation، BlazePose 3D عمق طبیعی را فراهم می‌کند.

kotlin
// 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 در مقابل ML Kit Pose Detection: BlazePose سریع‌تر است (60+ FPS در مقابل 30 FPS)، از مختصات 3D پشتیبانی می‌کند و از طریق MediaPipe چند سیستمی کار می‌کند. ML Kit استفاده آسان‌تری دارد (به MediaPipe SDK نیازی ندارد) و شامل مدل‌های از پیش آموزش‌دیده با دقت بالا است. برای پروژه‌های iOS ناتیو — ML Kit Pose Detection (بهینه‌سازی بهتر برای ANE). برای پروژه‌های چند سیستمی (Flutter، React Native) — MediaPipe BlazePose (مدل واحد برای تمام سیستم‌ها). برای دقت در سناریوهای پیچیده — هر دو مدل قابل مقایسه هستند.

MoveNet: Lightning و Thunder از TensorFlow

MoveNet — خانواده مدل‌های Pose Detection از TensorFlow، بهینه‌شده برای TFLite. Lightning (8 MB، INT8 — 4 MB): 17 نقطه کلیدی COCO، 91% PCK، 8–15 ms تاخیر، 30+ FPS. Thunder (13 MB، INT8 — 6 MB): 17 نقطه کلیدی، 95% PCK، 25–40 ms تاخیر، 20+ FPS. MoveNet از معماری CenterNet + درون‌یابی دوخطی (bilinear interpolation) برای نقشه حرارتی وضوح بالا استفاده می‌کند. MoveNet از تشخیص چند نفر (تا 6 نفر) پشتیبانی می‌کند. مدل‌ها در TensorFlow Hub موجود هستند.

MoveNet Lightning در مقابل Thunder: Lightning — برای برنامه‌های بلافاصله با FPS بالا (تناست، فیلترهای AR). Thunder — برای تحلیل دقیق حرکت (توانبخشی، تحلیل ورزشی) روی دستگاه‌های دارای GPU. هر دو مدل از طریق tf-coreml برای iOS به Core ML تبدیل می‌شوند. MoveNet همچنین از طریق TFLite Task Vision PoseLandmarker API قابل دسترسی است. توصیه: ابتدا از Lightning شروع کنید، اگر دقت کافی نبود — به Thunder مراجعه کنید (تنها +15 ms latency overhead).

java
// MoveNet Inference with 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 Multi-Pose: تشخیص تا 6 نفر در کادر. به جای روش استاندارد heatmap، MoveNet از person detection + pose refinement استفاده می‌کند: ابتدا افراد را تشخیص می‌دهد (centroid-based)، سپس حرکت هر یک را ارزیابی می‌کند. حالت multi-pose 2–3x کندتر از single-pose است: Lightning — 25–50 ms (6 نفر). برای برنامه‌های تناست با یک کاربر از single-pose استفاده کنید. برای فعالیت‌های گروهی (یوگا، کراس فیت) — multi-pose با محدودیت کادر برای صرفه‌جویی در باتری.

طبقه‌بندی حرکات: از نقاط به اقدامات

Pose Classification — مرحله پس از تشخیص: تبدیل landmarks به اقدامات معنایی (ایستاده، نشسته، دست بلند کرده، اسکوات می‌زند). رویکردها: Rule-based (قوانین دستی — زاویه‌های بین استخوان‌ها)، ML-based (رگرسیون لوژستیک یا Random Forest روی برداشت landmarks)، DL-based (طبقه‌بندی LSTM تسلسل حرکات در کادرها). Rule-based — 50–80% دقت، ساده و سریع. ML-based — 85–95% دقت با 200+ نمونه برچسب‌شده. LSTM — 90–98% دقت روی دنباله‌های زمانی (ویدیو).

زاویه‌های بین استخوان‌ها: برای هر نقطه زاویه با نقاط مجاور محاسبه می‌شود. نمونه‌ها: right elbow angle (shoulder → elbow → wrist)، right knee angle (hip → knee → ankle)، torso angle (واسط شانه‌ها → واسط باسن‌ها). زاویه‌ها نسبت به مقیاس و موقعیت فرد روی صفحه نمایش تغییرپذیر نیستند. نرمال‌سازی زاویه‌ها به بازه [0، 1] امکان طبقه‌بندی حرکت را با یک قاعده آستانه‌ای ساده فراهم می‌کند: اگر elbowAngle < 30° — دست خم شده، اگر > 150° — باز است.

kotlin
// طبقه‌بندی اسکوات مبتنی بر قاعده
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: اسکوات، شنا رفته، پلانک، بلند کردن پا. طبقه‌بندی فهرست landmarks را گرفته و اقدام + اعتبار را برمی‌گرداند. شامل پایه زمانی (temporal filter): HED (Holt Exponential Double Smoothing) برای انتقال حام بین حرکات. برای اقدامات سفارشی — یک طبقه‌بندی را بر روی 100–500 نمونه از طریق MediaPipe Model Maker (TensorFlow Lite + metadata) آموزش دهید.

کاربرد Pose Detection در تناست و توانبخشی

ردگیرهای تناست با تصحیح تکنیک — برنامه حرکت کاربر را در حین ورزش تحلیل کرده و راهنمایی صوتی می‌دهد: «لگن را پایین‌تر ببر»، «بدنه را خم نکن». ML Kit Pose Detection + طبقه‌بندی rule-based تکرارات را شمرده و کیفیت را ارزیابی می‌کند. Squat: knee angle < 90° — اسکوات صحیح، back angle < 45° — خم شدن خطرناڦ بدن. Push-up: elbow angle < 90° در نقطه پایین — شنا کامل. Pull-up: چانه بالاتر از سطح میله.

توانبخشی و فیزیوتراپی — Pose Detection برای کنترل از راه دور تمرینات فیزیوتراپی استفاده می‌شود. پزشک یک حرکت مرجع تعیین می‌کند (مثلاً ابداکشن شانه به میزان 45°)، برنامه زاویه فعلی و انحرافات را اندازه‌گیری می‌کند. BlazePose 3D دقت زاویه ±3° را فراهم می‌کند — برای ارزیابی بالینی کافی است. بسامد: ۱ کادر در 3–5 ثانیه (صرفه‌جویی در باتری). On-device — حریم خصوصی داده‌های پزشکی بیمار. توانبخشی پس از سکته: ردیابی hand-to-shoulder، elbow-extension، hip-flexion.

فیلترهای AR و افکت‌ها — Pose Detection در پایه فیلترهای AR شبکه‌های اجتماعی (TikTok، Instagram، Snapchat) قرار دارد. نقاط کلیدی سر، شانه‌ها و دست‌ها برای اعمال ماسک‌ها، آنیمیشن‌ها و عناصر تزیینی استفاده می‌شوند. MediaPipe BlazePose Full + Face Mesh (468 نقطه) روی دستگاه‌های فلاگ‌شیپ 120+ FPS را ارائه می‌دهد. ARKit/ARCore Face Tracking + Pose Detection — ترکیب برای full-body AR. نیازمندی‌ها: FPS > 30، motion-to-photon latency < 20 ms.

swift
// فیلتر 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)
    }
}

تحلیل ورزشی — ارزیابی حرفه‌ای تکنیک: تحلیل بیومکانیک دویدن (cadence، stride length، arm swing symmetry)، شنا (body roll، elbow angle در حین کشش)، تنیس (shoulder rotation، wrist snap). MoveNet Thunder با پس‌پردازش دقت کافی برای تحلیل غیرحرفه‌ای را فراهم می‌کند. برای ورزش حرفه‌ای به 3D Motion Capture (Vicon، OptiTrack) نیاز است، اما Pose Detection روی تلفن یک الترناتیو در دسترس برای بازار انبوه است. همگام‌سازی زاویه‌ها در کادرها — مؤلفه کلیدی.

سوالات متداول

چگونه Pose Detection را در حین لرزش دوربین پایدار کنیم؟

از temporal smoothing (هموارسازی زمانی) استفاده کنید: One Euro Filter (1€ filter) — برای هر landmark cut-off frequency جداگانه تنظیم می‌شود، نویز با فرکانس بالا (لرزش) را سرکوب کرده و حرکت واقعی را حفظ می‌کند (low latency). MediaPipe BlazePose شامل HED تعبیه‌شده (Holt Exponential Double Smoothing) است — هموارسازی سازگارشوینده با پیش‌بینی حرکت. برای ML Kit فیلتر 1€ را خود انجام دهید: فیلتر دو پارامتر دارد — beta (سرعت) و minCutoff (آستانه فرکانس). توصیه شده: beta = 0.04، minCutoff = 0.5 (Android).

Pose Detection چند نفر را در کادر می‌تواند تشخیص دهد؟

ML Kit Pose Detection — یک نفر (single-pose). MoveNet Lightning — تا 6 نفر (multi-pose). MediaPipe BlazePose — تا 2–3 نفر از طریق MediaPipe Tasks (multi-pose). برای برنامه‌های با فعالیت‌های گروهی از MoveNet Lightning یا BlazePose استفاده کنید. برای برنامه‌های تناست با یک کاربر — ML Kit (انتگراسیون ساده‌تر، دقت بالاتر در single-pose). برای تماس‌های ویدیویی با فیلترهای AR — BlazePose Lite با multi-pose کافی است (FPS بالا).

چگونه زاویه بین استخوان‌ها را برای طبقه‌بندی حرکت محاسبه کنیم؟

زاویه بین دو استخوان: سه landmarks را گیرید — مفصل 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 3D) از Vector3D استفاده کنید. زاویه‌ها را برای طبقه‌بندی ML به بازه [0,1] نرمال‌سازی کنید.

آیا می‌توان حرکت هر دو دست را به طور همزمان تشخیص داد؟

بله، همه مدل‌های اصلی (ML Kit، BlazePose، MoveNet) landmarks هر دو دست را به طور همزمان تشخیص می‌دهند: LEFT_SHOULDER، LEFT_ELBOW، LEFT_WRIST، RIGHT_SHOULDER، RIGHT_ELBOW، RIGHT_WRIST. برای تشخیص اضافی دست‌ها (hand tracking) ، Pose Detection + Hand Landmarker (21 نقطه برای هر دست) را ترکیب کنید. MediaPipe Hands + BlazePose — ترکیب استاندارد برای full-body + hands. در iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.

حداقل اندازه فرد در کادر برای Pose Detection چقدر است؟

ML Kit Pose Detection: حداقل bounding box فرد — 100x100 پیکسل (نسبت ~1:1). MoveNet Lightning: 120x120 پیکسل. BlazePose: 80x160 پیکسل (bounding box عمودی). برای فرد در اندازه واقعی در فاصله 3 متری از دوربین (1920x1080) — تقریباً 250x600 px، که کافی است. در فاصله > 5 متر دقت کاهش می‌یابد — از Multi-Pose + high-resolution input استفاده کنید. برای اشیاء دور از Object Detection + Pose Estimation (دو مرحله‌ای) استفاده کنید.

نتایج

  • Pose Detection — تعیین 17–33 نقطه کلیدی بدن با دقت 91–96% PCK
  • ML Kit Pose Detection — 33 نقطه، تا 30 FPS، API ساده، روی GPU/ANE
  • BlazePose (MediaPipe) — 33 نقطه + 3D، تا 60 FPS، چند سیستمی
  • MoveNet Lightning/Thunder — 17 نقطه COCO، 30+ FPS، TFLite، چند نفره
  • Pose Classification — از landmarks به اقدامات از طریق rule-based یا ML
  • On-device — حریم خصوصی، بلافاصله، 3 ms–30 ms تاخیر
  • کاربرد — تناست، توانبخشی، فیلترهای AR، تحلیل ورزشی

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید