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, on-device Pose Detection обрађује до 30 кадрова у секунди са прецизношћу 94% PCK.

Главно

  • Pose Detection — одређивање кључних тачака тела (landmarks) из слике
  • ML Kit Pose Detection — 33 landmarks, 30 FPS, прецизност 94% PCK
  • MediaPipe BlazePose — 33 landmarks + 3D, до 60 FPS на GPU
  • MoveNet Lightning — 17 keypoints (COCO), 30+ FPS, 8 MB, INT8
  • On-device — приватност, real-time, без слања видеа на сервер

Шта је 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.1Latency (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: сваки landmark има резултат (0..1) који показује колико је модел сигуран у тачку и да ли је видљива. Тачке са резултатом < 0.5 сматрају се невидљивим (покривене, ван кадра). За анализу положаја користите само видљиве тачке. За процену поравнаћа — израчунајте confidence-weighted distances, где тачке са ниским резултатом имају мању тежину у метрици.

ML Kit Pose Detection на Android-у и iOS-у

ML Kit Pose Detection — библиотека од Google-а за одређивање положаја на уређају. Подржава 33 landmarks, укључујући тачке лица, прстију ногу и пете. Модови: Accurate Mode (14 MB модел, 15–30 ms, висока прецизност) и Streaming Mode (5 MB, 5–10 ms, за real-time). 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+), што омогућава 10–20 ms latency у Accurate Mode-у на iPhone 15 Pro. Streaming Mode — 3–8 ms, до 120 FPS. На iOS-у ML Kit Pose Detection ради брже од MediaPipe BlazePose-а (Core ML убрзање), али је лошији од BlazePose-а по броју FPS на старијим уређајима (iPhone X–11).

MediaPipe BlazePose: архитектура и 3D

MediaPipe BlazePose — високоперформансан модел за Pose Detection од Google Research. Користи хибридну архитектуру detector-decoder pipeline базирану на MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + 3D координате (дубина z). BlazePose Lite: 33 landmarks (2D) без дубине. Оба модела су доступна у MediaPipe Tasks Vision на Android-у, iOS-у, Python-у и Web-у. BlazePose Full обрађује 30–60 FPS на GPU-у, Lite — 60+ FPS.

3D Pose Estimation са BlazePose: модел предвиґа z-координату за сваки landmark, што омогућава процену дубине (приближавање/удаљавање удова) без стерео камере. 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 vs ML Kit Pose Detection: BlazePose је бржи (60+ FPS vs 30 FPS), подржава 3D координате, ради вишеплатформно путем MediaPipe-а. ML Kit је једноставнији за интеграцију (не захтева MediaPipe SDK), садржи претходно обучене моделе високе прецизности. За iOS-native пројекте — 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 keypoints, 91% PCK, 8–15 ms latency, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, 25–40 ms latency, 20+ FPS. MoveNet користи CenterNet архитектуру + билинеарну интерполацију за high-resolution heatmap. MoveNet подржава multi-pose detection (до 6 особа). Модели су доступни у TensorFlow Hub-у.

MoveNet Lightning vs Thunder: Lightning — за real-time апликације са високим FPS (фитнес, AR филтери). Thunder — за прецизну анализу положаја (рехабилитација, спортска аналитика) на уређајима са GPU. Оба модела се конвертују у Core ML путем tf-coreml за iOS. 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° — довољну за клиничку процену. Учесталост: 1 кадар на 3–5 секунди (уштеда батерије). On-device — приватност медицинских података пацијента. Рехабилитација након можданог удара: праћење hand-to-shoulder, elbow-extension, hip-flexion.

AR филтери и ефекти — Pose Detection је основа AR филтера друштвених мрежа (TikTok, Instagram, Snapchat). Landmarks главе, рамена и шака користе се за преклапање маски, анимација и декоративних елемената. 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 филтер са landmarks положаја
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) — подесава се cut-off frequency за сваки landmark понаосеб, потискује високофреквентни шум (дрхтање), чувајући реално кретање (low latency). MediaPipe BlazePose укључује уграђени HED (Holt Exponential Double Smoothing) — адаптивно изглађивање са предвиґањем покрета. За ML Kit самостално имплементирајте 1€ filter: филтер има два параметра — 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–особе путем 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. Нормализујте углове у опсег [0,1] за ML класификатор.

Да ли се може одредити положај обе руке истовремено?

Да, сви главни модели (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 (two-stage).

Закључак

  • Pose Detection — одређивање 17–33 кључних тачака тела са прецизношћу 91–96% PCK
  • ML Kit Pose Detection — 33 landmarks, до 30 FPS, једноставан API, на GPU/ANE
  • BlazePose (MediaPipe) — 33 landmarks + 3D, до 60 FPS, вишеплатформни
  • MoveNet Lightning/Thunder — 17 COCO keypoints, 30+ FPS, TFLite, multi-pose
  • Pose Classification — од landmarks до акција путем rule-based или ML
  • On-device — приватност, real-time, 3 ms–30 ms latency
  • Примена — фитнес, рехабилитација, AR филтери, спортска аналитика

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође