Pose Estimation
포즈 추정은 관절과 같은 키포인트의 위치를 찾아 신체나 객체의 자세를 설명합니다. 탑다운, 바텀업 및 단일 단계 방식과 OKS를 다룹니다.
포즈 추정은 사람의 어깨, 팔꿈치, 무릎과 같이 신체나 객체에서 미리 정의된 키포인트를 찾고, 이를 연결해 자세를 나타내는 스켈레톤을 구성하는 컴퓨터 비전 작업입니다. 모델은 각 키포인트의 이미지 좌표 또는 3D 위치와 함께 신뢰도 점수를 출력하므로, 애플리케이션에서 관절 각도를 측정하거나 반복 횟수를 세고 동작을 인식할 수 있습니다. 포즈 추정은 각 사람이 어떻게 서 있거나 움직이는지 설명하며, 객체 탐지의 바운딩 박스나 인스턴스 분할의 마스크로는 이를 포착할 수 없습니다.
포즈 추정의 작동 방식#
다중 인물 2D 포즈 추정기는 세 가지 전략 중 하나를 따르며, 세 번째 전략은 1단계 객체 탐지기와 유사합니다.
- 탑다운: 사람 탐지기가 이미지 속 모든 사람을 찾고, 단일 인물 모델이 HRNet (2019) 및 ViTPose (2022)와 같이 각 크롭 안의 키포인트를 예측합니다. 크고 선명하게 보이는 사람에 대한 정확도는 높지만, 사람 수가 늘어날수록 비용도 증가합니다.
- 바텀업: 네트워크가 이미지 전체의 키포인트를 한 번에 찾은 다음 사람별로 묶습니다. OpenPose (2017)는 각 사지를 따라 방향을 가리키는 2D 벡터인 신체 부위 친화도 필드로 관절을 연결하므로, 군중 속에서도 비용이 거의 일정하게 유지됩니다.
- 단일 단계: 네트워크가 한 번의 패스로 동일한 그리드 위치에서 사람 박스와 모든 키포인트를 예측하므로 크롭이나 그룹화 단계가 필요하지 않습니다. YOLO-Pose (2022)는 이 설계를 YOLO에 도입했습니다.
키포인트 위치는 각 키포인트의 확률 맵 하나씩을 생성하고 피크로 위치를 표시하는 히트맵 방식이나 좌표를 직접 회귀하는 방식으로 결정합니다. 히트맵은 수년간 벤치마크를 선도했지만 메모리 비용이 들고 맵의 해상도에 제한됩니다. 잔차 로그 우도 추정 (RLE)은 정규화 흐름으로 예측 오차의 분포를 학습해 2021년에 회귀 방식과의 격차를 좁혔습니다. YOLO26 포즈 모델은 RLE로 학습하는 단일 단계 회귀 모델입니다. 학습 중에는 추가 분기가 각 키포인트의 불확실성을 예측하고 RealNVP 흐름이 오차를 평가합니다. 추론을 위해 모델을 융합할 때 두 요소를 모두 제거하므로 추론 비용이 추가되지 않습니다.
from ultralytics import YOLO
# COCO 신체 키포인트 17개로 학습한 YOLO26 나노 포즈 모델을 불러옵니다
model = YOLO("yolo26n-pose.pt")
# 한 번의 패스로 모든 사람과 키포인트를 찾습니다
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# 형태는 (people, keypoints, xy)입니다. 스켈레톤을 그린 이미지를 저장합니다
print(result.keypoints.xy.shape)
result.save(filename="pose_result.jpg")출력된 형태는 찾은 사람 수, 키포인트 17개, 픽셀 좌표 2개를 나타내며, 저장된 이미지에는 각 사람 위에 스켈레톤이 그려집니다.
2D 및 3D 포즈 추정#
2D 추정기는 픽셀 좌표를 반환합니다. 3D 인간 포즈 추정은 VideoPose3D와 같이 두 번째 네트워크로 2D 키포인트 시퀀스를 3D 공간으로 변환하거나, 보정된 카메라 여러 대에서 관측한 키포인트를 삼각 측량하거나, SMPL과 같은 매개변수형 신체 메시를 이미지에 맞춰 공간상의 관절 위치를 복원합니다. 객체 포즈 추정은 별도의 작업으로, 로봇 그리핑 및 증강 현실을 위해 표면 키포인트 등을 활용해 강체 객체의 3D 회전과 이동을 복원합니다.
포즈 추정 평가#
약 25만 명에게 17개 키포인트를 라벨링한 COCO Keypoints 벤치마크는 객체 키포인트 유사도(OKS)로 예측을 평가합니다. OKS는 교집합 대비 합집합(IoU)에 대응하는 키포인트 지표입니다. 라벨이 지정된 각 키포인트에 대해 예측과 라벨 사이의 거리 d는 유사도 exp(-d²/(2s²k²))로 변환됩니다. 여기서 s²는 사람의 세그멘테이션 영역이고, k는 주석 작성자가 해당 키포인트를 얼마나 일관되게 배치했는지에 따라 측정한 키포인트별 상수입니다. OKS는 라벨이 지정된 키포인트 전체에 대해 이 값을 평균 내며, 평균 정밀도(mAP)는 0.50에서 0.95 사이의 OKS 임계값에 걸쳐 평균을 냅니다.
import numpy as np
# COCO falloff constants: annotators place eyes far more consistently than hips
sigmas = {"eye": 0.025, "hip": 0.107}
area = 20_000 # person's segmented area in pixels (s squared)
error = 5.0 # predicted keypoint lies 5 pixels from its label
# Per-keypoint OKS term: exp(-d^2 / (2 s^2 k^2)) with k = 2 * sigma
for name, sigma in sigmas.items():
similarity = np.exp(-(error**2) / (2 * area * (2 * sigma) ** 2))
print(f"{name}: {similarity:.2f}")동일한 5픽셀 오차라도 눈에서는 0.78, 엉덩이에서는 0.99의 점수를 얻습니다. 다른 벤치마크는 다른 지표를 사용합니다. MPII는 레이블에서 머리 크기의 절반 이내에 있는 키포인트의 비율인 PCKh를 보고하며, Human3.6M과 같은 3D 벤치마크는 평균 관절 위치 오차를 밀리미터 단위로 보고합니다.
실제 적용 사례#
- 스포츠 분석: 코치는 실험실 모션 캡처에서 사용하는 반사 마커 없이 일반 비디오로 관절 각도, 보폭, 스윙 동작을 측정합니다.
- 재활: 물리 치료 앱은 가정에서 관절 가동 범위와 운동 자세를 추적하며, 낙상 감지 시스템은 신체의 키포인트가 바닥 높이로 떨어지는지 관찰합니다.
- 동작 인식: 스켈레톤 시퀀스는 손 흔들기, 넘어지기, 들어 올리기와 같은 동작을 분류하는 간결한 입력이며, 의복과 배경은 고려하지 않습니다.
- 동물 연구: 사용자 정의 키포인트 세트는 Dog-Pose 데이터셋에서 개 한 마리당 키포인트 24개를 추적하는 방식과 같이 동물의 자세를 추적해 보행과 행동을 연구합니다.










