Pose Detection은 주요 포인트(랜드마크)를 통해 인체의 위치를 결정하는 컴퓨터 비전 기술입니다: 머리, 어깨, 팔꿈치, 손목, 엉덩이, 무릎, 발목. 각 포인트는 2D 공간에서 좌표(x, y)를 가지며, 고급 모델(MediaPipe BlazePose 3D)은 깊이를 위해 z-좌표를 추가합니다. 모바일 애플리케이션에서 Pose Detection은 피트니스 트래커, 요가 앱, AR 필터, 재활 프로그램 및 스포츠 분석 시스템에 사용됩니다. Google ML Kit, 2025에 따르면, 온디바이스 Pose Detection은 94% PCK 정확도로 초당 최대 30프레임을 처리합니다.
핵심 사항
Pose Detection(Pose Estimation이라고도 함)은 이미지나 비디오에서 인체의 의미론적 주요 포인트를 결정하는 작업을 말합니다. Top-down 방식은 먼저 사람을 감지(객체 감지)한 다음 포즈를 결정합니다. 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 정확도 지표. 실제 값(Ground Truth)으로부터 특정 거리 내(보통 사람의 바운딩 박스 크기의 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 |
Keypoint Visibility: 각 랜드마크에는 모델이 해당 포인트에 대해 얼마나 확신하는지와 가시성 여부를 나타내는 점수(0..1)가 있습니다. 점수 < 0.5인 포인트는 보이지 않는 것으로 간주됩니다(가려짐, 프레임 밖). 포즈 분석에는 가시 포인트만 사용합니다. 정렬 평가를 위해 신뢰도 가중 거리를 계산하며, 낮은 점수의 포인트는 지표에서 가중치가 낮습니다.
ML Kit Pose Detection — Google의 온디바이스 포즈 감지 라이브러리입니다. 얼굴 포인트, 발가락 및 발뒤꿈치를 포함한 33개 랜드마크를 지원합니다. 모드: Accurate Mode(14MB 모델, 15-30ms, 높은 정확도) 및 Streaming Mode(5MB, 5-10ms, 실시간용). Streaming Mode는 추적 기능이 있는 경량 모델을 사용하여 첫 번째 프레임 이후 정확한 위치를 재감지하지 않고 움직임을 추적하여 최대 60 FPS를 달성합니다.
ML Kit Pose Detection API: PoseDetector(옵션: setDetectorMode, setPerformanceMode) → InputImage → Pose(List<PoseLandmark>). 각 PoseLandmark는 landmarkType(38개 유형), position(PointF3D), inFrameLikelihood(0..1)를 가집니다. Pose는 또한 사람의 boundingBox, 랜드마크 목록, 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
)
}
iOS의 ML Kit: Pose Detection은 ML Kit CocoaPods를 통해 사용 가능합니다. API는 Android와 동일합니다: PoseDetector → UIImage → Pose → PoseLandmark. iOS에서 ML Kit는 Core ML과 ANE(A12+)를 사용하여 iPhone 15 Pro에서 Accurate Mode로 10-20ms 지연 시간을 달성합니다. Streaming Mode — 3-8ms, 최대 120 FPS. iOS에서 ML Kit Pose Detection은 MediaPipe BlazePose보다 빠르지만(Core ML 가속), 오래된 기기(iPhone X-11)에서는 FPS에서 BlazePose에 뒤쳐집니다.
MediaPipe BlazePose — Google Research의 Pose Detection을 위한 고성능 모델입니다. 하이브리드 아키텍처를 사용합니다: MobileNetV2 + Feature Pyramid Network 기반의 detector-decoder 파이프라인. BlazePose Full: 33개 랜드마크 + 3D 좌표(깊이 z). BlazePose Lite: 깊이가 없는 33개 랜드마크(2D). 두 모델 모두 Android, iOS, Python 및 Web의 MediaPipe Tasks Vision에서 사용할 수 있습니다. BlazePose Full은 GPU에서 30-60 FPS를 처리하고 Lite는 60+ FPS를 처리합니다.
BlazePose를 사용한 3D 포즈 추정: 모델은 각 랜드마크에 대한 z-좌표를 예측하여 스테레오 카메라 없이 깊이 추정(팔다리의 접근/후퇴)을 가능하게 합니다. z-좌표는 카메라 기준 미터법 공간(미터)으로 계산됩니다. BlazePose 3D 정확도: 공개 벤치마크에서 37mm MPJPE(Mean Per Joint Position Error) — 피트니스와 AR에는 충분하지만 의료 진단에는 부족합니다. ARKit/ARFoundation의 경우 BlazePose 3D가 자연스러운 깊이를 제공합니다.
// 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 네이티브 프로젝트의 경우 — ML Kit Pose Detection(최고의 ANE 최적화). 크로스 플랫폼 프로젝트(Flutter, React Native)의 경우 — MediaPipe BlazePose(모든 플랫폼을 위한 통합 모델). 까다로운 장면에서의 정확도는 두 모델이 비슷합니다.
MoveNet — TFLite에 최적화된 TensorFlow의 Pose Detection 모델 제품군입니다. Lightning(8MB, INT8 — 4MB): 17개 COCO 키포인트, 91% PCK, 8-15ms 지연 시간, 30+ FPS. Thunder(13MB, INT8 — 6MB): 17개 키포인트, 95% PCK, 25-40ms 지연 시간, 20+ FPS. MoveNet은 CenterNet 아키텍처 + 고해상도 히트맵을 위한 bilinear 보간법을 사용합니다. MoveNet은 멀티포즈 감지(최대 6명)를 지원합니다. 모델은 TensorFlow Hub에서 사용할 수 있습니다.
MoveNet Lightning vs Thunder: Lightning — 높은 FPS(피트니스, AR 필터)가 필요한 실시간 애플리케이션용. Thunder — GPU가 있는 기기에서 정확한 포즈 분석(재활, 스포츠 분석)용. 두 모델 모두 iOS용 tf-coreml을 통해 Core ML로 변환됩니다. MoveNet은 TFLite Task Vision PoseLandmarker API를 통해서도 사용할 수 있습니다. 권장: Lightning으로 시작하고 정확도가 부족하면 Thunder로 전환(단지 +15ms 지연 시간 오버헤드).
// TFLite를 이용한 MoveNet 추론
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-50ms(6명). 단일 사용자 피트니스 앱의 경우 싱글포즈를 사용합니다. 그룹 활동(요가, 크로스핏)의 경우 배터리 절약을 위해 프레임 속도를 제한한 멀티포즈를 사용합니다.
Pose Classification — 감지 후 단계: 랜드마크를 의미론적 동작(서기, 앉기, 손 들기, 스쿼트)으로 변환합니다. 접근 방식: 규칙 기반(수동 규칙 — 뼈 사이 각도), ML 기반(랜드마크 벡터에 대한 로지스틱 회귀 또는 Random Forest), DL 기반(프레임 간 포즈 시퀀스의 LSTM 분류기). 규칙 기반 — 50-80% 정확도, 간단하고 빠름. ML 기반 — 200개 이상의 레이블이 지정된 예제로 85-95% 정확도. 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). 사용자 정의 동작의 경우 — MediaPipe Model Maker(TensorFlow Lite + 메타데이터)를 통해 100-500개 예제로 분류기를 훈련합니다.
기술 교정이 있는 피트니스 트래커 — 앱이 운동 중 사용자의 포즈를 분석하고 음성 안내를 제공합니다: “엉덩이를 낮추세요”, “몸통을 앞으로 기울이지 마세요”. ML Kit Pose Detection + 규칙 기반 분류기가 반복 횟수를 세고 품질을 평가합니다. 스쿼트: 무릎 각도 < 90° — 올바른 스쿼트, 등 각도 < 45° — 위험한 몸통 기울임. 푸시업: 하단 지점에서 팔꿈치 각도 < 90° — 완전한 푸시업. 풀업: 턱이 바 수준 위.
재활 및 물리치료 — Pose Detection은 물리 치료 운동의 원격 모니터링에 사용됩니다. 의사가 기준 포즈(예: 45°에서 어깨 외전)를 설정하고 앱이 현재 각도와 편차를 측정합니다. BlazePose 3D는 ±3°의 각도 정확도를 제공 — 임상 평가에 충분합니다. 빈도: 3-5초당 1프레임(배터리 절약). 온디바이스 — 환자 의료 데이터의 프라이버시. 뇌졸중 후 재활: 손-어깨, 팔꿈치-신전, 엉덩이-굴곡 추적.
AR 필터 및 효과 — Pose Detection은 소셜 네트워크(TikTok, Instagram, Snapchat)의 AR 필터 기반입니다. 머리, 어깨 및 손의 랜드마크를 사용하여 마스크, 애니메이션, 장식 요소를 오버레이합니다. MediaPipe BlazePose Full + Face Mesh(468개 포인트)는 플래그십 기기에서 120+ FPS를 제공합니다. ARKit/ARCore Face Tracking + Pose Detection — 풀바디 AR을 위한 조합. 요구 사항: FPS > 30, motion-to-photon 지연 시간 < 20ms.
// 포즈 랜드마크를 사용한 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는 후처리와 함께 비전문가 분석에 충분한 정확도를 제공합니다. 전문 스포츠에는 3D 모션 캡처(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 — MediaPipe Tasks를 통해 최대 2-3명(멀티포즈). 그룹 활동 앱의 경우 MoveNet Lightning 또는 BlazePose를 사용합니다. 단일 사용자 피트니스 앱의 경우 — ML Kit(통합이 쉬움, 더 높은 싱글포즈 정확도). AR 필터가 있는 영상 통화의 경우 — 멀티포즈(높은 FPS)의 BlazePose Lite로 충분합니다.
두 뼈 사이의 각도: 세 개의 랜드마크를 취합니다 — 관절 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°. 3차원 좌표(BlazePose 3D)의 경우 Vector3D를 사용합니다. ML 분류기를 위해 각도를 [0,1] 범위로 정규화합니다.
네, 모든 주요 모델(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: 최소 사람 바운딩 박스 — 100x100픽셀(종횡비 ~1:1). MoveNet Lightning: 120x120픽셀. BlazePose: 80x160픽셀(세로 바운딩 박스). 카메라에서 3미터 거리의 전신 사람(1920x1080)의 경우 — 약 250x600px로 충분합니다. > 5미터 거리에서는 정확도가 떨어지므로 멀티포즈 + 고해상도 입력을 사용합니다. 먼 물체의 경우 객체 감지 + 포즈 추정(2단계)이 더 좋습니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.