Pose Detection: definicja, modele i zasada działania

Autor: IT Sectr Opublikowano: 2026-07-19 Czas czytania: 9 min

Pose Detection — technologia wizji komputerowej określająca położenie ciała człowieka na podstawie kluczowych punktów (landmarks): głowa, ramiona, łokcie, nadgarstki, biodra, kolana, kostki. Każdy punkt ma współrzędne (x, y) w przestrzeni 2D, a zaawansowane modele (MediaPipe BlazePose 3D) dodają współrzędną z dla głębi. W aplikacjach mobilnych Pose Detection jest używany w trackerach fitness, aplikacjach do jogi, filtrach AR, programach rehabilitacyjnych i systemach analityki sportowej. Według Google ML Kit, 2025, on-device Pose Detection przetwarza do 30 klatek na sekundę z dokładnością 94% PCK.

Najważniejsze

  • Pose Detection — określanie kluczowych punktów ciała (landmarks) z obrazu
  • ML Kit Pose Detection — 33 landmarks, 30 FPS, dokładność 94% PCK
  • MediaPipe BlazePose — 33 landmarks + 3D, do 60 FPS na GPU
  • MoveNet Lightning — 17 keypoints (COCO), 30+ FPS, 8 MB, INT8
  • On-device — prywatność, real-time, bez wysyłania wideo na serwer

Co to jest Pose Detection: podstawy i metryki

Pose Detection (znane również jako Pose Estimation) odnosi się do zadania określania semantycznych kluczowych punktów ciała człowieka na podstawie obrazu lub wideo. Podejście Top-down najpierw wykrywa człowieka (Object Detection), a następnie określa jego pozę. Podejście Bottom-up znajduje wszystkie landmarks na obrazie, a następnie grupuje je według osób (OpenPose). Dla urządzeń mobilnych stosuje się bottom-up — jest szybszy przy kilku osobach w kadrze. ML Kit i BlazePose używają podejścia single-stage — detekcja + pozycja w jednym przejściu.

COCO Keypoints — standardowy zestaw 17 punktów: nos, oczy (2), uszy (2), ramiona (2), łokcie (2), nadgarstki (2), biodra (2), kolana (2), kostki (2). MediaPipe BlazePose używa 33 punktów, dodając: palce stóp, pięty, środek tułowia, punkty na twarzy. Im więcej punktów, tym dokładniejsza analiza pozy, ale wyższe obciążenie obliczeniowe. Dla aplikacji fitness wystarczy 17–20 punktów. Dla pełnej analizy (joga, taniec) — 33 punkty. Dla filtrów AR — 33 punkty + 468 punktów twarzy (MediaPipe Face Mesh).

PCK (Percentage of Correct Keypoints) — metryka dokładności Pose Detection. Oblicza się ją jako odsetek punktów przewidzianych w granicach odległości od ground truth (zwykle 0.05–0.15 rozmiaru bounding box człowieka). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — metryka używana w COCO, uwzględniająca skalę człowieka i trudność punktu. mAP@OKS — standardowa metryka dla benchmarków.

ModelLandmarksPCK@0.1Latency (GPU)Rozmiar
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: każdy landmark ma wynik (0..1) wskazujący, jak bardzo model jest pewien punktu i czy jest on widoczny. Punkty z wynikiem < 0.5 są uznawane za niewidoczne (zakryte, poza kadrem). Do analizy pozy używaj tylko widocznych punktów. Do oceny wyrównania (alignment) — obliczaj confidence-weighted distances, gdzie punkty z niskim wynikiem mają mniejszą wagę w metryce.

ML Kit Pose Detection na Android i iOS

ML Kit Pose Detection — biblioteka od Google do określania pozy na urządzeniu. Obsługuje 33 landmarks, w tym punkty twarzy, palców stóp i pięt. Tryby: Accurate Mode (model 14 MB, 15–30 ms, wysoka dokładność) i Streaming Mode (5 MB, 5–10 ms, do real-time). Streaming Mode używa uproszczonego modelu ze śledzeniem — po pierwszej klatce śledzi ruch bez ponownego wykrywania dokładnych pozycji, co daje do 60 FPS.

API ML Kit Pose Detection: PoseDetector (opcje: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Każdy PoseLandmark ma: landmarkType (38 typów), position (PointF3D), inFrameLikelihood (0..1). Pose dostarcza również: boundingBox człowieka, listę landmarks, metodę getLandmark(type). Do klasyfikacji pozy używaj kątów między kośćmi: shoulderAngle, elbowAngle, hipAngle — obliczane przez Vector3D między sąsiednimi 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 na iOS: Pose Detection jest dostępny przez ML Kit CocoaPods. API jest identyczne jak na Androidzie: PoseDetector → UIImage → Pose → PoseLandmark. Na iOS ML Kit używa Core ML i ANE (A12+), co daje 10–20 ms latency w Accurate Mode na iPhone 15 Pro. Streaming Mode — 3–8 ms, do 120 FPS. Na iOS ML Kit Pose Detection działa szybciej niż MediaPipe BlazePose (przyspieszenie Core ML), ale ustępuje BlazePose pod względem liczby FPS na starszych urządzeniach (iPhone X–11).

MediaPipe BlazePose: architektura i 3D

MediaPipe BlazePose — wysokowydajny model do Pose Detection od Google Research. Używa hybrydowej architektury: detector-decoder pipeline oparty na MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + współrzędne 3D (głębia z). BlazePose Lite: 33 landmarks (2D) bez głębi. Oba modele są dostępne w MediaPipe Tasks Vision na Android, iOS, Python i Web. BlazePose Full przetwarza 30–60 FPS na GPU, Lite — 60+ FPS.

3D Pose Estimation z BlazePose: model przewiduje współrzędną z dla każdego landmarka, co pozwala ocenić głębię (przybliżenie/oddalenie kończyn) bez kamery stereoskopowej. Współrzędna z jest obliczana w przestrzeni metrycznej (metry) względem kamery. Dokładność BlazePose 3D: 37 mm MPJPE (Mean Per Joint Position Error) w publicznych benchmarkach — wystarczająca do fitnessu i AR, niewystarczająca do diagnostyki medycznej. Dla ARKit/ARFoundation BlazePose 3D zapewnia naturalną głębię.

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 jest szybszy (60+ FPS vs 30 FPS), obsługuje współrzędne 3D, działa wieloplatformowo przez MediaPipe. ML Kit jest prostszy w integracji (nie wymaga MediaPipe SDK), zawiera wstępnie wytrenowane modele o wysokiej dokładności. Dla projektów natywnych na iOS — ML Kit Pose Detection (lepsza optymalizacja pod ANE). Dla projektów wieloplatformowych (Flutter, React Native) — MediaPipe BlazePose (jeden model dla wszystkich platform). Dla dokładności w wymagających scenach — oba modele są porównywalne.

MoveNet: Lightning i Thunder od TensorFlow

MoveNet — rodzina modeli do Pose Detection od TensorFlow, zoptymalizowana pod 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 używa architektury CenterNet + bilinear interpolation dla high-resolution heatmap. MoveNet obsługuje multi-pose detection (do 6 osób). Modele są dostępne w TensorFlow Hub.

MoveNet Lightning vs Thunder: Lightning — dla aplikacji real-time z wysokim FPS (fitness, filtry AR). Thunder — do dokładnej analizy pozy (rehabilitacja, analityka sportowa) na urządzeniach z GPU. Oba modele są konwertowane do Core ML przez tf-coreml dla iOS. MoveNet jest również dostępny przez TFLite Task Vision PoseLandmarker API. Zalecenie: zacznij od Lightning, jeśli dokładność jest niewystarczająca — przejdź na Thunder (tylko +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: wykrywanie do 6 osób w kadrze. Zamiast standardowego podejścia heatmap, MoveNet używa person detection + pose refinement: najpierw wykrywa ludzi (centroid-based), a następnie ocenia pozę każdej osoby. Tryb multi-pose jest 2–3x wolniejszy niż single-pose: Lightning — 25–50 ms (6 osób). Dla aplikacji fitness z jednym użytkownikiem używaj single-pose. Dla zajęć grupowych (joga, crossfit) — multi-pose z ograniczeniem klatek dla oszczędzania baterii.

Klasyfikacja pozy: od punktów do działań

Pose Classification — etap po detekcji: przekształcanie landmarks w semantyczne działania (stoi, siedzi, podniósł rękę, robi przysiad). Podejścia: Rule-based (ręczne reguły — kąty między kośćmi), ML-based (regresja logistyczna lub Random Forest na wektorze landmarks), DL-based (klasyfikator LSTM na sekwencji pozy w klatkach). Rule-based — 50–80% dokładności, prosty i szybki. ML-based — 85–95% dokładności z 200+ oznaczonymi przykładami. LSTM — 90–98% dokładności na szeregach czasowych (wideo).

Kąty między kośćmi: dla każdego punktu oblicza się kąty z sąsiednimi. Przykłady: right elbow angle (shoulder → elbow → wrist), right knee angle (hip → knee → ankle), torso angle (midpoint ramion → midpoint bioder). Kąty są niezmienne względem skali i pozycji człowieka na ekranie. Normalizacja kątów do zakresu [0, 1] pozwala klasyfikować pozę za pomocą prostej reguły progowej: jeśli elbowAngle < 30° — ręka zgięta, jeśli > 150° — wyprostowana.

kotlin
// Klasyfikator przysiadów oparty na regułach
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 — wstępnie wytrenowane klasyfikatory w składzie MediaPipe Tasks: przysiady, pompki, deska, unoszenie nóg. Klasyfikator przyjmuje listę landmarks i zwraca działanie + poziom ufności. Zawiera wygładzanie czasowe (temporal filter): HED (Holt Exponential Double Smoothing) dla płynnego przejścia między pozami. Dla niestandardowych działań — wytrenuj klasyfikator na 100–500 przykładach przez MediaPipe Model Maker (TensorFlow Lite + metadata).

Zastosowanie Pose Detection w fitnessie i rehabilitacji

Trackery fitness z korektą techniki — aplikacja analizuje pozę użytkownika podczas ćwiczenia i daje głosowe wskazówki: „opuść miednicę niżej”, „nie przechylaj tułowia”. ML Kit Pose Detection + klasyfikator rule-based liczy powtórzenia i ocenia jakość. Squat: knee angle < 90° — prawidłowy przysiad, back angle < 45° — niebezpieczne pochylenie tułowia. Push-up: elbow angle < 90° w dolnym punkcie — pełna pompka. Pull-up: broda powyżej poziomu drążka.

Rehabilitacja i fizjoterapia — Pose Detection jest używany do zdalnej kontroli ćwiczeń fizjoterapeutycznych. Lekarz ustala wzorcową pozę (np. odwiedzenie barku o 45°), aplikacja mierzy bieżący kąt i odchylenia. BlazePose 3D zapewnia dokładność kątów ±3° — wystarczającą do oceny klinicznej. Częstotliwość: 1 klatka na 3–5 sekund (oszczędzanie baterii). On-device — prywatność danych medycznych pacjenta. Rehabilitacja po udarze: śledzenie hand-to-shoulder, elbow-extension, hip-flexion.

Filtry AR i efekty — Pose Detection leży u podstaw filtrów AR w mediach społecznościowych (TikTok, Instagram, Snapchat). Landmarks głowy, ramion i dłoni są używane do nakładania masek, animacji i elementów dekoracyjnych. MediaPipe BlazePose Full + Face Mesh (468 punktów) daje 120+ FPS na flagowych urządzeniach. ARKit/ARCore Face Tracking + Pose Detection — kombinacja dla full-body AR. Wymagania: FPS > 30, motion-to-photon latency < 20 ms.

swift
// Filtr AR z landmarkami pozy
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)
    }
}

Analityka sportowa — profesjonalna ocena techniki: analiza biomechaniczna biegu (cadence, stride length, arm swing symmetry), pływania (body roll, elbow angle przy ruchu), tenisa (shoulder rotation, wrist snap). MoveNet Thunder z postprocessingiem zapewnia wystarczającą dokładność do analityki nieprofesjonalnej. Dla sportu profesjonalnego wymagany jest 3D Motion Capture (Vicon, OptiTrack), ale Pose Detection na telefonie to dostępna alternatywa dla masowego rynku. Synchronizacja kątów między klatkami — kluczowy komponent.

Często zadawane pytania

Jak ustabilizować Pose Detection przy drżeniu kamery?

Użyj temporal smoothing (wygładzanie czasowe): One Euro Filter (1€ filter) — konfigurowalna cut-off frequency dla każdego landmarka osobno, tłumi wysokoczęstotliwościowy szum (drżenie), zachowując rzeczywisty ruch (low latency). MediaPipe BlazePose zawiera wbudowany HED (Holt Exponential Double Smoothing) — adaptacyjne wygładzanie z przewidywaniem ruchu. Dla ML Kit zaimplementuj 1€ filter samodzielnie: filtr ma dwa parametry — beta (prędkość) i minCutoff (próg częstotliwości). Zalecane: beta = 0.04, minCutoff = 0.5 (Android).

Ile osób w kadrze może wykrywać Pose Detection?

ML Kit Pose Detection — jedną osobę (single-pose). MoveNet Lightning — do 6 osób (multi-pose). MediaPipe BlazePose — do 2–3 osób przez MediaPipe Tasks (multi-pose). Dla aplikacji z zajęciami grupowymi używaj MoveNet Lightning lub BlazePose. Dla aplikacji fitness z jednym użytkownikiem — ML Kit (prostsza integracja, wyższa dokładność single-pose). Dla rozmów wideo z filtrami AR — wystarczy BlazePose Lite z multi-pose (wysoki FPS).

Jak obliczyć kąt między kośćmi do klasyfikacji pozy?

Kąt między dwiema kośćmi: weź trzy landmarks — staw A, staw B (wierzchołek kąta), staw C. Oblicz wektory BA = (A - B) i BC = (C - B). Kąt = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Kąt w zakresie 0–180°. Dla współrzędnych trójwymiarowych (BlazePose 3D) użyj Vector3D. Znormalizuj kąty do zakresu [0,1] dla klasyfikatora ML.

Czy można określać pozę obu rąk jednocześnie?

Tak, wszystkie główne modele (ML Kit, BlazePose, MoveNet) wykrywają landmarks obu rąk jednocześnie: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Do dodatkowej detekcji dłoni (hand tracking) łącz Pose Detection + Hand Landmarker (21 punktów na dłoń). MediaPipe Hands + BlazePose — standardowa kombinacja dla full-body + hands. Na iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.

Jaki jest minimalny rozmiar człowieka w kadrze dla Pose Detection?

ML Kit Pose Detection: minimalny bounding box człowieka — 100x100 pikseli (proporcje ~1:1). MoveNet Lightning: 120x120 pikseli. BlazePose: 80x160 pikseli (pionowy bounding box). Dla człowieka w pełnej wysokości w odległości 3 metrów od kamery (1920x1080) — około 250x600 px, co jest wystarczające. Przy odległości > 5 metrów dokładność spada — użyj Multi-Pose + high-resolution input. Dla odległych obiektów lepiej użyć Object Detection + Pose Estimation (two-stage).

Podsumowanie

  • Pose Detection — określanie 17–33 kluczowych punktów ciała z dokładnością 91–96% PCK
  • ML Kit Pose Detection — 33 landmarks, do 30 FPS, proste API, na GPU/ANE
  • BlazePose (MediaPipe) — 33 landmarks + 3D, do 60 FPS, wieloplatformowy
  • MoveNet Lightning/Thunder — 17 COCO keypoints, 30+ FPS, TFLite, multi-pose
  • Pose Classification — od landmarks do działań przez rule-based lub ML
  • On-device — prywatność, real-time, 3 ms–30 ms latency
  • Zastosowanie — fitness, rehabilitacja, filtry AR, analityka sportowa

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również