Pose Detection é uma tecnologia de visão computacional que determina a posição do corpo humano por pontos-chave (landmarks): cabeça, ombros, cotovelos, pulsos, quadris, joelhos, tornozelos. Cada ponto tem coordenadas (x, y) no espaço 2D, e modelos avançados (MediaPipe BlazePose 3D) adicionam coordenada z para profundidade. Em aplicativos móveis, Pose Detection é usado em rastreadores fitness, aplicativos de ioga, filtros AR, programas de reabilitação e sistemas de análise esportiva. Segundo Google ML Kit, 2025, Pose Detection no dispositivo processa até 30 quadros por segundo com precisão de 94% PCK.
Principais pontos
Pose Detection (também Pose Estimation) refere-se à tarefa de determinar pontos-chave semânticos do corpo humano a partir de uma imagem ou vídeo. A abordagem Top-down primeiro detecta a pessoa (Object Detection), depois determina sua pose. A abordagem Bottom-up encontra todos os landmarks na imagem, depois os agrupa por pessoa (OpenPose). Para dispositivos móveis, usa-se bottom-up — é mais rápido com várias pessoas no quadro. ML Kit e BlazePose usam abordagem de estágio único — detecção + pose em uma passagem.
COCO Keypoints — um conjunto padrão de 17 pontos: nariz, olhos (2), orelhas (2), ombros (2), cotovelos (2), pulsos (2), quadris (2), joelhos (2), tornozelos (2). MediaPipe BlazePose usa 33 pontos, adicionando: dedos dos pés, calcanhares, centro do tronco, pontos faciais. Quanto mais pontos, mais preciso é a análise da pose, mas maior a carga computacional. Para aplicativos fitness, 17–20 pontos são suficientes. Para análise completa (ioga, dança) — 33 pontos. Para filtros AR — 33 pontos + 468 pontos faciais (MediaPipe Face Mesh).
PCK (Percentage of Correct Keypoints) — métrica de precisão do Pose Detection. Calcula a proporção de pontos previstos dentro de uma distância do ground truth (geralmente 0.05–0.15 do tamanho do bounding box da pessoa). ML Kit Pose Detection: 94% PCK@0.1. BlazePose Full: 96% PCK@0.1. MoveNet Lightning: 91% PCK@0.1. OKS (Object Keypoint Similarity) — métrica usada no COCO que considera a escala da pessoa e a dificuldade do ponto. mAP@OKS — métrica padrão para benchmarks.
| Modelo | Landmarks | PCK@0.1 | Latência (GPU) | Tamanho |
|---|---|---|---|---|
| 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 |
Visibilidade dos Keypoints: cada landmark tem uma pontuação (0..1) indicando o quão confiante o modelo está sobre o ponto e se é visível. Pontos com pontuação < 0.5 são considerados invisíveis (oclusos, fora do quadro). Para análise de pose, use apenas pontos visíveis. Para avaliação de alinhamento — calcule distâncias ponderadas por confiança, onde pontos com baixa pontuação têm menos peso na métrica.
ML Kit Pose Detection — uma biblioteca do Google para detecção de pose no dispositivo. Suporta 33 landmarks, incluindo pontos faciais, dedos dos pés e calcanhares. Modos: Accurate Mode (modelo de 14 MB, 15–30 ms, alta precisão) e Streaming Mode (5 MB, 5–10 ms, para tempo real). Streaming Mode usa um modelo leve com rastreamento — após o primeiro quadro, rastreia o movimento sem redetectar posições exatas, alcançando até 60 FPS.
API do ML Kit Pose Detection: PoseDetector (opções: setDetectorMode, setPerformanceMode) → InputImage → Pose (List<PoseLandmark>). Cada PoseLandmark tem: landmarkType (38 tipos), position (PointF3D), inFrameLikelihood (0..1). Pose também fornece: boundingBox da pessoa, lista de landmarks, método getLandmark(type). Para classificação de pose, use ângulos entre ossos: shoulderAngle, elbowAngle, hipAngle — calculados via Vector3D entre landmarks adjacentes.
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 no iOS: Pose Detection está disponível via ML Kit CocoaPods. API é idêntica ao Android: PoseDetector → UIImage → Pose → PoseLandmark. No iOS, ML Kit usa Core ML e ANE (A12+), alcançando latência de 10–20 ms em Accurate Mode no iPhone 15 Pro. Streaming Mode — 3–8 ms, até 120 FPS. No iOS, ML Kit Pose Detection é mais rápido que MediaPipe BlazePose (aceleração Core ML), mas fica atrás do BlazePose em FPS em dispositivos antigos (iPhone X–11).
MediaPipe BlazePose — um modelo de alto desempenho para Pose Detection do Google Research. Usa uma arquitetura híbrida: pipeline detector-decoder baseado em MobileNetV2 + Feature Pyramid Network. BlazePose Full: 33 landmarks + coordenadas 3D (profundidade z). BlazePose Lite: 33 landmarks (2D) sem profundidade. Ambos os modelos estão disponíveis no MediaPipe Tasks Vision no Android, iOS, Python e Web. BlazePose Full processa 30–60 FPS na GPU, Lite — 60+ FPS.
Estimativa de pose 3D com BlazePose: o modelo prevê coordenada z para cada landmark, permitindo estimar profundidade (aproximação/afastamento de membros) sem câmera estéreo. A coordenada z é calculada em espaço métrico (metros) relativo à câmera. Precisão do BlazePose 3D: 37 mm MPJPE (Mean Per Joint Position Error) em benchmarks públicos — suficiente para fitness e AR, insuficiente para diagnóstico médico. Para ARKit/ARFoundation, BlazePose 3D fornece profundidade natural.
// Tarefas de Visão do 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 vs ML Kit Pose Detection: BlazePose é mais rápido (60+ FPS vs 30 FPS), suporta coordenadas 3D, funciona multiplataforma via MediaPipe. ML Kit é mais fácil de integrar (não requer MediaPipe SDK), inclui modelos pré-treinados com alta precisão. Para projetos iOS nativos — ML Kit Pose Detection (melhor otimização ANE). Para projetos multiplataforma (Flutter, React Native) — MediaPipe BlazePose (modelo unificado para todas as plataformas). Para precisão em cenas exigentes — ambos os modelos são comparáveis.
MoveNet — uma família de modelos para Pose Detection do TensorFlow, otimizada para TFLite. Lightning (8 MB, INT8 — 4 MB): 17 keypoints COCO, 91% PCK, latência 8–15 ms, 30+ FPS. Thunder (13 MB, INT8 — 6 MB): 17 keypoints, 95% PCK, latência 25–40 ms, 20+ FPS. MoveNet usa arquitetura CenterNet + interpolação bilinear para heatmap de alta resolução. MoveNet suporta detecção multi-pose (até 6 pessoas). Modelos estão disponíveis no TensorFlow Hub.
MoveNet Lightning vs Thunder: Lightning — para aplicações em tempo real com alto FPS (fitness, filtros AR). Thunder — para análise precisa de pose (reabilitação, análise esportiva) em dispositivos com GPU. Ambos os modelos convertem para Core ML via tf-coreml para iOS. MoveNet também está disponível através da API TFLite Task Vision PoseLandmarker. Recomendação: comece com Lightning, se a precisão for insuficiente — mude para Thunder (apenas +15 ms de sobrecarga de latência).
// Inferência MoveNet com 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: detecção de até 6 pessoas no quadro. Em vez da abordagem padrão de heatmap, MoveNet usa detecção de pessoas + refinamento de pose: primeiro detecta pessoas (baseado em centróide), depois estima cada pose. O modo multi-pose é 2–3x mais lento que single-pose: Lightning — 25–50 ms (6 pessoas). Para aplicativos fitness com um único usuário, use single-pose. Para atividades em grupo (ioga, crossfit) — multi-pose com limitação de quadros para economizar bateria.
Pose Classification — a etapa após a detecção: converter landmarks em ações semânticas (em pé, sentado, braço levantado, agachando). Abordagens: Rule-based (regras manuais — ângulos entre ossos), ML-based (regressão logística ou Random Forest no vetor de landmarks), DL-based (classificador LSTM de sequência de poses entre quadros). Rule-based — 50–80% de precisão, simples e rápido. ML-based — 85–95% de precisão com 200+ exemplos rotulados. LSTM — 90–98% de precisão em séries temporais (vídeo).
Ângulos entre ossos: para cada ponto, ângulos com pontos vizinhos são calculados. Exemplos: ângulo do cotovelo direito (ombro → cotovelo → pulso), ângulo do joelho direito (quadril → joelho → tornozelo), ângulo do tronco (ponto médio ombros → ponto médio quadris). Ângulos são invariantes à escala e posição da pessoa na tela. Normalizar ângulos para o intervalo [0, 1] permite classificar pose com uma regra de limiar simples: se elbowAngle < 30° — braço dobrado, se > 150° — estendido.
// Classificador de agachamento baseado em regras
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 — classificadores pré-treinados incluídos no MediaPipe Tasks: agachamentos, flexões, prancha, elevação de pernas. O classificador recebe uma lista de landmarks e retorna ação + confiança. Inclui suavização temporal (filtro temporal): HED (Holt Exponential Double Smoothing) para transições suaves entre poses. Para ações personalizadas — treine um classificador em 100–500 exemplos via MediaPipe Model Maker (TensorFlow Lite + metadata).
Rastreadores fitness com correção de técnica — o aplicativo analisa a pose do usuário durante o exercício e fornece instruções de voz: "abaixe os quadris", "não incline o tronco". ML Kit Pose Detection + classificador baseado em regras conta repetições e avalia qualidade. Agachamento: ângulo do joelho < 90° — agachamento correto, ângulo das costas < 45° — inclinação perigosa do tronco. Flexão: ângulo do cotovelo < 90° no ponto inferior — flexão completa. Barra fixa: queixo acima do nível da barra.
Reabilitação e fisioterapia — Pose Detection é usado para monitoramento remoto de exercícios de fisioterapia. Um médico define uma pose de referência (por exemplo, abdução do ombro a 45°), o aplicativo mede o ângulo atual e desvios. BlazePose 3D fornece precisão de ângulos de ±3° — suficiente para avaliação clínica. Frequência: 1 quadro a cada 3–5 segundos (economia de bateria). No dispositivo — privacidade dos dados médicos do paciente. Reabilitação pós-AVC: rastreamento mão-ombro, extensão de cotovelo, flexão de quadril.
Filtros AR e efeitos — Pose Detection é a base dos filtros AR em redes sociais (TikTok, Instagram, Snapchat). Landmarks da cabeça, ombros e mãos são usados para sobrepor máscaras, animações, elementos decorativos. MediaPipe BlazePose Full + Face Mesh (468 pontos) oferece 120+ FPS em dispositivos flagship. ARKit/ARCore Face Tracking + Pose Detection — uma combinação para AR de corpo inteiro. Requisitos: FPS > 30, latência motion-to-photon < 20 ms.
// Filtro AR com landmarks de pose
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)
}
}
Análise esportiva — avaliação profissional de técnica: análise biomecânica da corrida (cadência, comprimento da passada, simetria do balanço dos braços), natação (rolamento do corpo, ângulo do cotovelo na braçada), tênis (rotação do ombro, movimento do pulso). MoveNet Thunder com pós-processamento fornece precisão suficiente para análise não profissional. Esportes profissionais requerem captura de movimento 3D (Vicon, OptiTrack), mas Pose Detection no telefone é uma alternativa acessível para o mercado de massa. Sincronização de ângulos entre quadros é um componente chave.
Perguntas frequentes
Use suavização temporal: One Euro Filter (filtro 1€) — frequência de corte configurável para cada landmark separadamente, suprime ruído de alta frequência (vibração) preservando o movimento real (baixa latência). MediaPipe BlazePose inclui HED integrado (Holt Exponential Double Smoothing) — suavização adaptativa com previsão de movimento. Para ML Kit, implemente o filtro 1€ você mesmo: o filtro tem dois parâmetros — beta (velocidade) e minCutoff (limiar de frequência). Recomendados: beta = 0.04, minCutoff = 0.5 (Android).
ML Kit Pose Detection — uma pessoa (single-pose). MoveNet Lightning — até 6 pessoas (multi-pose). MediaPipe BlazePose — até 2–3 pessoas via MediaPipe Tasks (multi-pose). Para aplicativos de atividades em grupo, use MoveNet Lightning ou BlazePose. Para aplicativos fitness com um usuário — ML Kit (integração mais simples, maior precisão single-pose). Para videochamadas com filtros AR — BlazePose Lite com multi-pose (alto FPS) é suficiente.
Ângulo entre dois ossos: pegue três landmarks — articulação A, articulação B (vértice do ângulo), articulação C. Calcule os vetores BA = (A - B) e BC = (C - B). Ângulo = atan2(cross(BA, BC), dot(BA, BC)). Math.toDegrees(acos(dot(BA, BC) / (len(BA) * len(BC)))). Ângulo no intervalo 0–180°. Para coordenadas tridimensionais (BlazePose 3D) use Vector3D. Normalize ângulos para o intervalo [0,1] para o classificador ML.
Sim, todos os modelos principais (ML Kit, BlazePose, MoveNet) detectam landmarks de ambas as mãos simultaneamente: LEFT_SHOULDER, LEFT_ELBOW, LEFT_WRIST, RIGHT_SHOULDER, RIGHT_ELBOW, RIGHT_WRIST. Para detecção adicional de mãos, combine Pose Detection + Hand Landmarker (21 pontos por mão). MediaPipe Hands + BlazePose é a combinação padrão para corpo inteiro + mãos. No iOS — VNDetectHumanHandPoseRequest + VNDetectHumanBodyPoseRequest.
ML Kit Pose Detection: bounding box mínimo da pessoa — 100x100 pixels (proporção ~1:1). MoveNet Lightning: 120x120 pixels. BlazePose: 80x160 pixels (bounding box vertical). Para uma pessoa de corpo inteiro a 3 metros da câmera (1920x1080) — aproximadamente 250x600 px, suficiente. A distâncias > 5 metros, a precisão cai — use Multi-Pose + entrada de alta resolução. Para objetos distantes, Object Detection + Pose Estimation (dois estágios) é melhor.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também