지난 글에서 대상의 경계를 픽셀 단위로 얻는 법을 봤다. 이번에는 반대 방향으로 더 줄인다. 사람의 모양을 통째로 담는 대신 관절 몇 곳의 자리만 남기는 것이다. 그림에서 사람의 관절 자리를 찾아내는 이 일을 자세 추정(pose estimation)이라 부른다.
왜 그렇게까지 줄이는가. 팔을 든 동작을 알아보는 데 필요한 것은 팔의 색도 옷의 무늬도 아니고 어깨·팔꿈치·손목이 이루는 각도뿐이기 때문이다. 필요 없는 것을 버리면 옷이나 조명이 달라도 같은 동작이 같은 숫자로 나오고, 뒤에 붙일 분류기나 규칙이 훨씬 단순해진다. 사진 한 장은 가로세로 수백 칸에 색 세 가지라 수십만 개의 숫자인데, 관절 열일곱 개로 줄이면 숫자 쉰한 개가 남는다. 게다가 점만 남기면 누구인지 알아볼 수 없어 기록으로 남기기에도 부담이 적다. 운동 횟수를 세는 앱, 공장에서 무리한 허리 굽힘을 잡아내는 안전 장치, 넘어짐을 알리는 돌봄 카메라가 전부 이 쉰한 개의 숫자 위에서 돈다.
키포인트
열일곱 점
자세 추정이 찾는 관절 자리 하나하나를 키포인트(keypoint)라 부른다. 가장 널리 쓰는 규격은 COCO 데이터셋의 것으로, 사람 하나를 키포인트 열일곱 개로 적는다. 얼굴 다섯(코, 눈 둘, 귀 둘), 팔 여섯(어깨·팔꿈치·손목 좌우), 다리 여섯(엉덩이·무릎·발목 좌우)이다. 점끼리 어떤 쌍을 선으로 잇는지도 규격에 정해져 있어서, 어깨–팔꿈치–손목을 이으면 팔이 되고 엉덩이–무릎–발목을 이으면 다리가 된다. 이렇게 이은 선 묶음을 흔히 뼈대라 부른다.
더 촘촘한 규격도 있다. COCO-WholeBody는 몸 열일곱에 발 여섯, 얼굴 예순여덟, 손 마흔둘을 더해 133점을 쓴다. 손가락 모양으로 수어를 읽거나 표정까지 봐야 하면 그쪽이 맞지만, 점이 많을수록 작은 부위의 오차도 커진다. 손가락 마디는 사람 전체가 화면의 3분의 1쯤 차지하는 영상에서 몇 픽셀짜리 대상이다. 몸통 동작을 다루는 데는 여전히 열일곱이 기준점 노릇을 하고, 그보다 적게 쓰는 경우도 흔하다 — 걸음 분석이라면 다리 여섯과 엉덩이만 봐도 된다.
신뢰도
여기서 자주 놓치는 것이 있다. 점 하나가 들고 있는 값은 둘이 아니라 셋이다. 가로 자리, 세로 자리, 그리고 그 점을 믿어도 되는가를 0에서 1 사이로 적은 신뢰도다. 신뢰도는 모델이 그 자리에 관절이 있다고 얼마나 확신하는지를 나타내는 점수이지, 좌표가 몇 픽셀 틀렸는지를 알려 주는 오차 막대가 아니다.
세 번째 값 없이 앞의 둘만 쓰면 곧바로 문제가 생긴다. 사람이 옆으로 서서 한쪽 팔이 몸에 가려져도 모델은 그 팔의 좌표를 어쨌든 하나 내놓기 때문이다. 출력 칸이 열일곱 개로 고정되어 있으니 비울 방법이 없다. 신뢰도를 안 보고 그대로 그리면 가려진 팔이 몸통 한가운데나 엉뚱한 배경으로 뻗는다. 정답 데이터 쪽도 같은 구분을 한다 — COCO는 점마다 표시 값을 따로 달아 「표시 안 함」「표시했지만 가려짐」「보임」 셋을 가른다.
그래서 자세 데이터를 쓰는 코드의 첫 줄은 거의 늘 신뢰도 거르기다.
import math
def usable(kps, thr=0.3):
"""신뢰도가 낮은 점은 좌표 대신 None으로 바꾼다."""
return [(x, y) if c >= thr else None for x, y, c in kps]
def elbow_angle(sh, el, wr):
"""세 점이 다 살아 있을 때만 각도를 잰다."""
if sh is None or el is None or wr is None:
return None
a = math.atan2(sh[1] - el[1], sh[0] - el[0])
b = math.atan2(wr[1] - el[1], wr[0] - el[0])
d = abs(math.degrees(a - b)) % 360
return min(d, 360 - d)
임계값 0.3은 출발점일 뿐이다. 모델마다 신뢰도의 분포가 달라서, 어떤 모델은 가려진 관절에도 0.4를 주고 어떤 모델은 멀쩡히 보이는 발목에 0.25를 준다. 쓰려는 영상 몇 개에서 신뢰도를 찍어 보고, 틀린 점들이 어디쯤 몰려 있는지 보고 정해야 한다.
빈 점 처리
각도를 재는 함수보다 점이 없을 때 무엇을 할지 정하는 부분이 실제로는 더 중요하다. 한 프레임에서 손목이 안 보였다고 그 프레임을 통째로 버릴 것인지, 직전 값을 이어 쓸 것인지, 「판단 보류」로 넘길 것인지를 정해 두지 않으면 결과가 프레임마다 튄다.
셋은 쓰임에 따라 갈린다. 초당 30프레임 영상에서 한두 프레임이 비는 것은 흔하므로, 몇 프레임까지는 직전 값을 이어 쓰거나 앞뒤 값 사이를 채우는 편이 자연스럽다. 반대로 열 프레임 넘게 비면 이어 쓴 값은 0.3초 전의 자세라 사실상 지어낸 값이 된다. 그때는 판단 보류가 정직하다. 안전 장치처럼 놓치면 안 되는 일에서는 「모름」을 「괜찮음」으로 바꿔 적지 않는 것이 원칙이다.
두 갈래 경로
사람부터 찾는 경로
사람이 여럿인 장면에서 자세를 뽑는 방법은 크게 둘이고, 이 선택이 성능 특성을 거의 다 결정한다.
사람부터 찾는 경로(top-down)는 검출기로 사람마다 상자를 먼저 얻고, 상자마다 잘라 키운 다음 한 사람씩 자세를 추정한다. 잘라서 키우므로 멀리 있는 작은 사람도 화면 가득한 크기로 다뤄지고, 그만큼 정확하다. 공개 벤치마크의 최상위 점수도 대개 이쪽이 차지해 왔다.
대신 자세 모델을 사람 수만큼 반복해서 돌리므로 붐비는 장면에서 비용이 선형으로 는다. 한 사람 추정에 5밀리초가 걸리는 모델이라면 두 사람은 10밀리초지만, 광장에 스무 명이 서 있으면 100밀리초가 되어 초당 30프레임 처리가 불가능해진다. 여러 상자를 한 묶음으로 넣어 GPU에서 한 번에 돌리면 이 증가를 꽤 누그러뜨릴 수 있지만, 사람 수에 따라 지연이 출렁인다는 성질 자체는 남는다.
관절부터 찾는 경로
관절부터 찾는 경로(bottom-up)는 그림 전체에서 모든 관절을 한 번에 찾는다. 다만 이 시점에는 어느 팔꿈치가 어느 어깨의 것인지 모른다. 그래서 관절 사이를 이을 단서를 함께 예측하고 그것으로 사람별로 묶는다. OpenPose가 쓴 단서는 팔다리가 놓인 방향을 픽셀마다 화살표로 적은 지도이고, 다른 방식은 관절마다 「어느 사람 것인지」를 가리키는 꼬리표 값을 함께 낸다.
사람이 몇이든 모델은 한 번만 도므로 비용이 거의 일정하다. 대신 묶는 자리에서 틀린다. 두 사람이 어깨를 맞대고 서 있거나 한 사람이 다른 사람 앞을 가로지르면, 왼쪽 사람의 어깨에 오른쪽 사람의 팔꿈치가 붙는다. 그렇게 만들어진 팔은 길이도 방향도 사람 몸이 가질 수 없는 모양이 되지만, 점 하나하나는 제자리에 있으므로 관절별 정확도만 보면 멀쩡해 보인다.
검출기 의존
고르는 기준은 단순하다. 사람이 몇 안 되고 정확도가 중요하면 사람부터, 붐비는 장면에서 일정한 지연이 필요하면 관절부터다.
그리고 사람부터 찾는 쪽을 골랐다면 검출기의 오류가 그대로 상속된다는 점을 잊지 않는다. 검출기가 사람을 못 찾으면 자세도 없고, 두 사람을 상자 하나로 묶으면 자세 모델은 둘 중 하나만 그리거나 둘을 섞은 기괴한 뼈대를 내놓는다. 반쯤 잘린 채 화면 가장자리에 걸친 사람, 누워 있는 사람처럼 검출기가 약한 자세에서 자세 추정도 함께 무너진다. 그래서 전체 성능이 모자랄 때 먼저 볼 곳은 자세 모델이 아니라 검출기인 경우가 많다.
히트맵과 회귀
두 출력 방식
모델이 좌표를 내는 방식도 둘로 갈린다. 히트맵(heatmap)은 관절마다 그림을 작게 줄인 지도 한 장을 내고, 칸마다 「이 관절이 여기 있을 확률」에 해당하는 값을 적는 방식이다. 좌표 회귀는 관절마다 가로·세로 숫자 두 개를 곧바로 낸다.
| 히트맵 | 좌표 회귀 | |
|---|---|---|
| 무엇을 낸다 | 관절마다 지도 한 장 | 관절마다 숫자 두 개 |
| 좌표를 얻는 법 | 가장 높은 칸을 찾고 주변 값으로 소수점을 보정 | 그대로 쓴다 |
| 정확도 | 대체로 높다 | 최근 구조에서는 격차가 많이 줄었다 |
| 비용 | 관절 수만큼 지도를 들고 있어 무겁다 | 가볍다 |
| 후처리 | 필요하다 | 없다 |
| 성격 | 어디가 애매한지 지도에 남는다 | 왜 그 값인지 알 수 없다 |
비용 차이는 수로 보면 분명하다. 입력이 256×192이고 지도가 그 4분의 1인 64×48이면 지도 한 장이 3,072칸이고, 관절 열일곱이면 5만 2천 칸 남짓이다. 회귀는 같은 정보를 숫자 서른네 개로 낸다. 휴대폰처럼 메모리와 대역폭이 빠듯한 곳에서 회귀 쪽이 꾸준히 쓰이는 까닭이다. 반대로 히트맵은 공간 구조를 그대로 둔 채 학습하므로 적은 데이터로도 잘 수렴하는 편이다.
격자 해상도
히트맵을 쓰면 격자 해상도가 정밀도의 상한이 된다. 위 예에서 지도 한 칸은 원본의 4×4픽셀이다. 가장 높은 칸을 찾아 그 칸의 중심을 좌표로 삼으면, 참 위치가 칸 안 어디에 있든 같은 답이 나오므로 가로·세로로 최대 2픽셀씩 어긋난다. 사람이 작게 찍혀 팔 길이가 40픽셀쯤이면 2픽셀은 팔 길이의 5%이고, 각도로 치면 몇 도가 흔들린다.
그래서 주변 칸의 값을 이용해 칸보다 작은 자리를 추정하는 소수점 보정이 거의 필수다. 가장 흔한 방식은 위 그림처럼 가장 높은 칸의 좌우 이웃과 상하 이웃을 견주어, 더 높은 쪽으로 4분의 1칸 옮기는 것이다. 오른쪽 이웃이 왼쪽 이웃보다 높다면 봉우리의 참 꼭대기는 칸 중심보다 오른쪽에 있을 것이기 때문이다. 이 단순한 규칙만으로도 오차가 눈에 띄게 준다. 지도 모양을 매끄러운 봉우리로 가정하고 테일러 전개로 꼭대기를 푸는 더 정교한 보정도 쓰인다. 어느 쪽이든 추론 뒤에 붙는 계산이라 모델을 다시 학습할 필요가 없다.
두 봉우리
히트맵의 숨은 이점은 표 마지막 줄이다. 지도에 봉우리가 둘 서 있으면 모델이 두 자리 사이에서 헷갈리고 있다는 뜻이다. 사람이 뒤돌아서서 왼쪽 무릎과 오른쪽 무릎이 비슷해 보이거나, 팔짱을 껴서 손목 두 개가 한곳에 모일 때 흔히 이렇다.
이 정보는 후처리에서 쓸 수 있다. 두 봉우리 높이가 엇비슷하면 가장 높은 쪽을 믿지 말고 앞 프레임에 가까운 쪽을 고르거나, 그 프레임은 판단 보류로 넘기는 식이다. 회귀 방식은 숫자 하나만 나오므로 이런 판단을 신뢰도 값 하나에 기대야 한다. 더 나쁘게는 두 후보의 평균, 곧 두 무릎 사이의 허공을 답으로 내기도 한다 — 둘 중 어느 쪽이든 오차를 줄이려고 학습하면 가운데가 손실이 가장 작기 때문이다.
관절 각도
세 점의 각도
키포인트를 얻은 다음 대부분의 응용이 하는 일은 좌표를 각도로 바꾸는 것이다. 팔꿈치 각도라면 팔꿈치 에서 어깨 로 가는 벡터와 손목 로 가는 벡터가 이루는 사잇각이다.
분자는 두 벡터의 내적이고 분모는 두 길이의 곱이라, 팔이 곧게 펴지면 180°, 직각으로 굽으면 90°가 나온다. 위 코드처럼 두 벡터의 방향각을 각각 구해 빼는 방식도 같은 값을 주는데, 그때는 차이가 180°를 넘으면 반대쪽으로 접어야 한다는 점만 챙긴다. 각도는 사람이 가까이 있든 멀리 있든 같은 값이 나온다는 점이 좋다. 좌표는 사람이 화면 어디에 서 있는지에 따라 전부 달라지지만, 각도는 세 점의 상대 관계만 본다.
다만 이 각도는 화면에 비친 각도다. 팔이 화면과 나란한 평면에 있을 때만 실제 각도와 같고, 카메라 쪽으로 뻗을수록 어긋난다. 팔뚝이 화면에서 60° 기울어 카메라를 향하면 화면에 비친 길이가 절반으로 줄고, 실제로는 직각인 팔꿈치가 화면에서는 한참 벌어지거나 접혀 보인다. 옆에서 찍어야 하는 운동(스쿼트의 무릎)과 정면에서 찍어야 하는 운동(팔 벌려 뛰기)이 다른 것은 이 때문이다. 카메라 위치를 정해 주는 것이 모델을 바꾸는 것보다 효과가 큰 경우가 많다.
크기 정규화
각도가 아니라 거리를 봐야 하는 판정도 있다. 「손목이 어깨보다 충분히 위에 있는가」 같은 것이다. 픽셀 거리로 50을 기준으로 잡으면 카메라에서 멀리 선 사람은 팔을 끝까지 들어도 50에 못 미친다. 그래서 거리를 사람 크기로 나눠 쓰는 크기 정규화가 필요하다.
가장 흔한 잣대는 어깨 폭, 곧 두 어깨 점 사이의 거리다. 손목이 어깨보다 어깨 폭의 0.5배 넘게 위에 있으면 「팔을 들었다」로 두는 식으로 적으면, 가까이 서든 멀리 서든 같은 규칙이 통한다. 함정은 사람이 옆으로 돌아설 때다. 옆모습에서는 두 어깨가 겹쳐 어깨 폭이 거의 0이 되고, 그 값으로 나누면 모든 거리가 폭발한다. 어깨 가운데에서 엉덩이 가운데까지의 몸통 길이는 몸을 돌려도 덜 변하므로, 방향이 자주 바뀌는 영상에서는 그쪽을 잣대로 삼거나 둘 중 큰 값을 쓴다.
동작 구간 자르기
프레임마다 각도를 구하면 각도의 시계열이 생긴다. 스쿼트 횟수를 세려면 이 곡선에서 「한 번」을 잘라 내야 한다. 무릎 각도가 100° 아래로 내려가면 「앉음」, 160° 위로 올라오면 「섬」으로 두고, 앉음에서 섬으로 넘어갈 때마다 하나를 센다.
임계값을 하나만 두면 안 된다. 130° 하나로 가르면 각도가 130° 근처에서 몇 도씩 흔들릴 때마다 앉음과 섬이 번갈아 켜져 한 번 앉은 것이 다섯 번으로 세인다. 들어가는 문턱과 나오는 문턱을 따로 두어 그 사이에서는 상태를 바꾸지 않는 방식을 히스테리시스라 부르는데, 위의 100°와 160°가 그것이다. 여기에 최소 지속 프레임을 더한다. 초당 30프레임에서 다섯 프레임, 곧 0.17초 넘게 문턱 아래에 머물러야 앉음으로 인정하면 한두 프레임짜리 튐은 걸러진다. 이 수들은 동작마다 다르므로, 실제 동작을 찍은 영상 몇 개에서 각도 곡선을 그려 보고 정한다.
3D 복원
깊이의 모호함
화면 위의 자리만으로는 앞뒤를 알 수 없다. 팔을 앞으로 뻗은 것과 옆으로 벌린 것이 어떤 각도에서는 똑같이 찍힌다. 카메라 한 대로 얻은 그림에는 깊이 정보가 원래 없기 때문에 생기는 근본적인 모호함이다. 앞 절에서 본 화면 각도의 왜곡도 결국 같은 뿌리다. 3D 좌표가 있으면 각도를 실제 공간에서 잴 수 있으므로, 카메라 위치를 고르기 어려운 응용에서는 3D로 가는 수밖에 없다.
세 가지 길
대응은 셋이다.
- 끌어올리기(lifting) — 2D 관절 좌표를 입력으로 3D 좌표를 예측하는 별도 모델을 붙인다. 사람의 몸이 취할 수 있는 자세가 제한되어 있다는 사전 지식으로 모호함을 메운다. 팔꿈치와 무릎은 한쪽으로만 굽고, 팔 길이는 프레임마다 변하지 않는다
- 여러 대의 카메라 — 각도가 다른 그림 둘 이상이 있으면 같은 관절을 두 방향에서 본 선이 한 점에서 만나고, 그 점이 3D 자리다. 이를 삼각측량이라 한다. 가장 정확하지만 카메라를 설치하고 서로의 위치를 맞추는 보정 작업이 필요하다
- 깊이 센서 — 픽셀마다 거리를 직접 재는 카메라를 쓴다. 실내 근거리에서 강하고, 햇빛이 센 야외나 수 미터 넘는 원거리에서 약하다
끌어올리기는 카메라 한 대로 끝나 가장 싸지만, 사전 지식이 틀리는 자리에서 틀린다. 요가나 체조처럼 학습 데이터에 드문 자세에서는 가장 흔한 자세 쪽으로 끌려가는 경향이 있다. 그래서 끌어올린 3D는 「그럴듯한 3D」이지 잰 3D가 아니라는 점을 기억해 둔다. 여러 프레임을 한꺼번에 넣어 시간의 흐름으로 모호함을 줄이는 모델도 많다.
절대 크기
3D를 얻어도 크기는 여전히 안 정해진다. 키 150센티미터인 사람이 3미터 앞에 선 것과 180센티미터인 사람이 3.6미터 앞에 선 것은 거의 같은 그림을 만든다. 모든 길이를 같은 비율로 늘리고 거리도 같은 비율로 밀면 화면 위의 자리가 하나도 안 변하기 때문이다. 그래서 끌어올리기 모델이 내는 좌표는 대개 골반 가운데를 원점으로 둔 상대 좌표이고, 단위도 실제 미터가 아닌 경우가 많다.
절대 길이가 필요하면 기준값을 밖에서 넣어 준다. 가장 쉬운 것은 사람의 키다. 사용자가 키를 입력하면 뼈대 전체를 그 비율로 늘린다. 바닥면을 잡는 방법도 있다 — 카메라 높이와 기울기를 알고 발이 바닥에 닿아 있다고 가정하면, 발목 자리에서 거리가 정해지고 거기서 전체 크기가 따라 나온다. 점프 높이나 보폭처럼 센티미터가 결과물인 일은 이 기준값 없이는 시작할 수 없다.
시간축 평활화
좌표 떨림
영상에서 자세를 뽑으면 정지한 사람인데도 좌표가 프레임마다 몇 픽셀씩 흔들린다. 모델은 프레임을 한 장씩 따로 보므로, 조명의 미세한 변화나 압축 잡음만으로도 가장 높은 칸이 옆 칸으로 넘어간다. 앞에서 본 격자 해상도 한계도 이 떨림을 키운다. 화면에 뼈대를 겹쳐 그리면 떠는 모양이 그대로 보이고, 각도로 바꾸면 가만히 선 사람의 팔꿈치가 몇 도씩 오르내린다.
미분과 증폭
떨림이 진짜 문제가 되는 것은 속도나 가속도를 잴 때다. 좌표를 시간으로 미분하면, 곧 이웃한 프레임끼리 빼면 떨림이 증폭된다. 손목 좌표가 프레임마다 2픽셀씩 무작위로 흔들리면 이웃 프레임의 차이는 많게는 4픽셀이고, 초당 30프레임이면 초당 120픽셀의 가짜 속도가 된다. 가만히 있는 손이 휘두르는 손처럼 읽힌다. 가속도는 한 번 더 빼므로 더 나쁘다. 넘어짐 감지처럼 급한 움직임을 잡는 일은 속도와 가속도에 기대므로, 시간 방향 평활화를 한 겹 넣는 것이 사실상 필수다.
세기와 지연
평활화는 지나간 값들을 섞어 현재 값을 다듬는 일이다. 가장 단순한 것은 새 값과 직전 결과를 일정 비율로 섞는 지수 이동 평균이다. 새 값 비중이 작을수록 매끄러워지지만, 그만큼 과거에 끌려 늦게 따라온다.
위 그림이 그 맞바꿈이다. 팔꿈치 각도가 40°에서 150°로 바뀌는 순간, 약한 평활화는 곧바로 따라가지만 판정선 근처에서 흔들림이 남고, 강한 평활화는 곡선이 매끄러운 대신 판정선을 다섯 프레임 늦게 넘는다. 초당 30프레임에서 다섯 프레임은 0.17초다. 운동 횟수 세기라면 문제없는 지연이지만, 화면 속 캐릭터가 사람 동작을 따라 하는 응용에서는 굼뜨게 느껴진다.
이 맞바꿈을 누그러뜨리는 흔한 방법은 세기를 고정하지 않는 것이다. 움직임이 느릴 때는 세게 다듬어 떨림을 누르고, 빠를 때는 약하게 다듬어 지연을 줄인다. 이렇게 속도에 따라 거르는 세기를 바꾸는 필터로 One Euro 필터가 자세 추정에서 널리 쓰인다. 실시간이 아니라 녹화 영상을 나중에 분석하는 일이라면 앞뒤 프레임을 다 볼 수 있으므로, 양쪽을 대칭으로 섞어 지연 없이 다듬을 수 있다.
실무 함정
좌우 뒤집힘
뒤돌아선 사람에게서 왼손과 오른손이 뒤집히는 일이 흔하다. 모델이 배운 단서의 상당 부분이 얼굴 방향과 몸의 앞면이라, 등이 보이면 그 단서가 사라진다. 한 프레임만 뒤집혔다가 돌아오면 각도 곡선에 칼날 같은 튐이 생긴다.
걸음 수처럼 좌우가 상관없는 지표라면 무시해도 되지만, 「오른손을 들었는가」를 판정하는 일이라면 앞뒤 프레임의 일관성으로 보정해야 한다. 이번 프레임의 좌우를 그대로 쓴 경우와 맞바꾼 경우를 각각 직전 프레임과 견주어 더 가까운 쪽을 고르는 것이 기본형이다. 셀카 영상처럼 좌우가 반전된 입력이 섞여 들어오면 이 문제가 전 구간에서 터지므로, 입력 단계에서 반전 여부를 먼저 확인해 둔다.
상자 여백
사람부터 찾는 경로에서 검출 상자를 그대로 잘라 쓰면 뻗은 팔다리가 상자 밖으로 나가 잘린다. 검출기는 몸통을 중심으로 상자를 잡는 경향이 있어, 옆으로 뻗은 손목이나 차올린 발목이 가장자리에 걸린다. 잘린 관절은 자세 모델이 볼 수 없으니 상자 안쪽 끝에 붙은 엉뚱한 좌표가 나온다.
그래서 상자를 사방으로 10~25% 정도 넓혀 자르는 것이 관례다. 넓힐 때 가로세로 비율도 자세 모델의 입력 비율(예를 들어 256×192라면 4:3)에 맞춘다. 비율을 안 맞추고 억지로 늘려 넣으면 사람이 홀쭉하거나 뚱뚱하게 찌그러지고, 학습 때 본 적 없는 몸 모양에서 정확도가 떨어진다.
평균 지표의 함정
이 분야의 표준 지표는 OKS(Object Keypoint Similarity)다. 예측 점과 정답 점의 거리를 사람 크기로 정규화해 0에서 1 사이 점수로 바꾸고, 관절마다 허용 폭을 달리 준다.
여기서 는 관절 의 예측과 정답 사이 거리, 은 사람 영역의 넓이, 는 관절마다 정한 허용 상수, 는 정답에 그 관절이 표시되어 있는지다. 눈처럼 사람이 위치를 정확히 찍을 수 있는 관절은 허용 폭이 좁고 엉덩이처럼 옷에 가려 애매한 관절은 넓다. 벤치마크가 보고하는 AP는 OKS 문턱을 0.50에서 0.95까지 바꿔 가며 잰 정확도의 평균이다.
문제는 분자의 합이다. 관절 열일곱 개를 평균 내므로 딱 하나 중요한 관절이 자주 틀리는 것이 지표에 거의 안 잡힌다. 손목만 완전히 틀리고 나머지가 완벽하면 OKS는 여전히 16/17, 곧 0.94쯤이다. 결과물이 손목 각도라면 그 모델은 쓸모가 없는데 점수는 훌륭하다. 그래서 공개 점수로 후보를 추린 뒤에는, 결과물이 기대는 관절만 따로 재는 지표를 자기 데이터에 함께 둔다. 손목 오차를 어깨 폭 대비 비율로 재서 분포를 보는 정도로도 충분하다.
정리하면, 자세 추정은 사람을 좌표 둘과 신뢰도 하나를 든 점 몇 개로 줄이고, 그 점을 각도와 시계열로 바꿔 동작을 읽는다. 그 사이마다 가려진 관절, 겹친 사람, 격자 한계, 떨림, 좌우 뒤집힘이 끼어들고, 카메라 한 대의 그림에는 깊이가 없다는 한계가 끝까지 따라온다. 다음 글은 바로 그 깊이를 다룬다. 사람 관절이 아니라 그림의 모든 픽셀에 대해, 사진 한 장에서 앞뒤를 읽어 내는 깊이 추정이다.
읽어주셔서 감사합니다. 😊

