고양이의 냥냥펀치부터 타이슨의 핵펀치를 예측해서 나의 생존율을 높여주고 다른 동물의 감정을 분석해 더 깊은 유대를 쌓고 싶다는 생각, 한 번쯤은 해보셨을 텐데요, 만약 안 해보셨다 하더라도 지금 이 글을 읽으며 궁금증이 조금은 생겼을 거라고 생각합니다. 이 모든 것을 가능하게 해주는 것이 (3D) Pose Estimation인데요, 로봇, VR, 인간-컴퓨터 상호작용 등 다양한 분야에서 사용되고 있습니다.
3D Pose Estimation을 정확히 이해하기 위해선 Pose Estimation이 무엇인지부터 알아야 합니다. Pose Estimation이란 말 그대로 포즈(Pose)를 추정(Estimation)하는 것을 말합니다. 이미지나 영상 데이터에서 객체의 특정 랜드마크를 추출하고 이를 기반으로 포즈를 예측하는 기술인데, 이 정보가 2차원인지, 3차원인지에 따라 2D와 3D Pose Estimation으로 나뉩니다.
3D Pose Estimation의 작동 원리는 주로 2D Pose Estimation의 방식을 확장한 것이기 때문에 단일/다중 객체에서 2D Pose Estimation 방법과 어떻게 3D로 확장될 수 있는지 알아보도록 하겠습니다. 객체 하나의 포즈만 추정할 경우, 직접 회귀(Direct Regression), 히트맵 회귀(Heatmap Regression), 템플릿 매칭 방식(Template Matching) 등 여러 가지 방법을 사용할 수 있습니다.
Direct Regression

이미지에서 객체의 주요 키포인트의 좌표를 직접 예측하는 방법입니다. CNN을 사용하여 이미지 입력으로부터 키포인트의 좌표를 직접 예측하며, 별도의 객체 검출이나 후처리 과정 없이 단일 객체에 바로 적용 가능합니다. 구조가 간단하기 때문에 빠르고, 계산 비용이 낮다는 장점이 있습니다.
이를 3D로 확장하려면 기존 키포인트의 (x, y) 좌표를 직접 예측하던 방식을 확장해서 (x, y, z) 좌표를 예측해야 합니다. 깊이 정보는 딥러닝 모델을 사용해 추정하거나 여러 카메라로부터 얻은 2D 데이터를 삼각측량으로 3D로 변환하여 얻을 수 있습니다. 단일 객체의 포즈를 빠르게 추정할 수 있지만 깊이 정보의 정확도에 한계가 있을 수 있습니다.
Direct Regression은 로봇 팔의 관절 위치를 추정하거나 운동선수의 동작을 분석하는 등의 태스크에서 사용됩니다.
Heatmap Regression

객체의 키포인트 위치를 확률 분포로 표현한 히트맵을 예측하는 방식입니다. 모델이 각 키포인트에 대해 히트맵을 출력하고, 히트맵의 가장 높은 확률 값을 가진 위치가 키포인트로 간주되는 방식으로 작동합니다. 직접 회귀보다 높은 정밀도를 제공하며, 객체가 회전하거나 일부가 가려져도 성능이 안정적입니다.
3D에서는 히트맵(볼륨)을 예측하는 방식을 사용하는데, 공간적 정확도는 높지만 계산 비용이 증가하는 단점이 있습니다. Heatmap-Based Method는 운동 자세 교정 애플리케이션이나 로봇/동물의 자세를 추적하는 등의 태스크에 사용됩니다.
Template Matching

사전에 정의된 객체의 템플릿을 사용하여 입력 이미지와 비교하는 방식입니다. 강체 객체 혹은 제한된 변형을 가지는 객체에 효과적이며, 학습 데이터를 많이 필요로 하지 않는다는 장점이 있습니다.
3D에서는 2D 템플릿 매칭 방식을 확장하여 입력 이미지나 포인트 클라우드에서 객체를 추정합니다. 마찬가지로 강체 객체 등에서 적합합니다. 대표적인 사용 예시로는 로봇이 도구를 집을 때 적합한 자세를 선택하거나 차량/기계의 부품을 정렬하는 것이 있습니다.
Shape/Part-Based Models
객체를 여러 부분(ex. 머리, 팔, 다리 등)으로 나누어 각 부분의 키포인트를 예측한 뒤, 부분 간의 관계(관절 길이 제약 조건 등)를 사용하여 포즈를 구성하는 방식입니다. 관절형 객체(인간, 동물, 로봇 등)에서 강력한 성능을 발휘하고, 일부 키포인트가 가려져도 다른 키포인트로 보완할 수 있습니다.
3D로 확장시키기 위해선 깊이 정보나 다중 뷰를 사용하고 3D 공간적 관계를 모델링해야 합니다. 3D-DPM(Deformable Part Models), Graph-based GNN 등의 모델을 사용할 수 있으며, 동물이나 사람의 자세 추적, 뼈나 장기의 위치를 추적하는 데 사용할 수 있습니다.
Keypoint(Pose) Tracking

RNN 또는 트랜스포머 같은 시계열 모델을 사용할 수 있는 방법으로, 단일 객체의 키포인트를 프레임별로 추정한 뒤 시간적 일관성을 유지하는 방식입니다. 객체의 움직임을 부드럽게 추적할 수 있다는 장점이 있습니다. 여기서 앞선 방법들을 사용해 3D 포즈를 추정할 수도 있습니다.
Keypoint Tracking은 운동선수의 연속 동작 분석, 비디오 기반 동작 추적과 같이 영상 데이터를 처리하는 데 사용할 수 있습니다.
그렇다면 여러 객체의 포즈를 추정할 때는 어떤 방식을 사용할까요? 단일 객체와 마찬가지로 비슷한 원리를 공유하지만, 3D Pose Estimation은 깊이 정보 처리와 공간적 제약이 추가되면서 더 복잡해집니다. 먼저 비슷한 부분부터 살펴보고 어떻게 2D에서 3D로 확장되는지 알아보도록 하겠습니다.
Multi-Object 2D Pose Estimation에서 사용되는 Bottom-Up과 Top-Down 방식은 3D에서도 유사하게 사용됩니다.
Top-Down
Object Detection 모델(Faster R-CNN, YOLO 등)을 사용해 이미지 내 각 객체의 Bounding Box를 먼저 탐지한 뒤, 각 객체의 키포인트를 추정하는 방식으로, 3D로 확장하려면 단일 객체의 3D Pose Estimation과 동일한 방법을 사용하면 됩니다.
이 방법은 각 객체를 개별적으로 처리하기 때문에 세밀한 포즈 추정이 가능하고 객체 간 간섭(interaction)에 영향을 적게 받습니다. 그러나 다중 객체 상황에서 계산 비용이 크고, Detection 단계에서 탐지가 누락되면 3D 포즈 추정도 실패한다는 단점도 있습니다.
Bottom-Up
이미지 내 모든 키포인트를 먼저 탐지한 뒤, 키포인트 간의 관계(Part Affinity Fields 등)를 계산하여 키포인트를 객체 단위로 그룹화하는 방식으로, 3D로 확장하려면 그룹화된 키포인트를 3D 히트맵 및 복원 알고리즘을 통해 3D 포즈로 변환하는 방법 등이 있습니다.
이 방식은 다중 객체 상황에서 효율적이며, 객체 수에 민감하지 않다는 장점이 있지만 키포인트 그룹화 과정에서 오류가 발생할 수 있고, 객체가 겹치거나 복잡한 자세일 경우 성능이 저하될 수 있습니다.
이 외에도 여러가지 방법이 있지만 여기까지만 보도록 하겠습니다. 이제 3D Pose Estimation이 뭔지 알았는데, 어떤 문제를 해결할 수 있을까요? 고민해 보다가 야구에서 이번 시즌에 말이 많았던 체크 스윙 문제를 해결할 수 있을 것 같다는 생각이 들었습니다.
우선 체크 스윙이란, 타자가 스윙을 하려는 동작을 시작했지만, 타격을 하지 않기로 결정하고 배트를 멈춘 상태를 의미합니다. 이는 완전한 스윙(풀 스윙)으로 이어지지 않은 상태를 말합니다.
물론 체크 스윙에 대한 기준이 있다면 쉽게 해결할 수 있겠지만, 사실 MLB에서도 정해진 규정이 없습니다. 그나마 가장 설득력 있는 기준이 파울 라인을 연장해 배트가 그 연장선을 지났는지 판단하는 방법인데, 이마저도 절대적인 기준이 될 수 없습니다. 예를 들어, 아래 그림처럼 스윙이 아닌데도 스윙으로 판정될 수도 있습니다.

구현하는 데에는 여러 가지 방법이 있지만 체크 스윙을 어떻게 정의하는지에 따라 좁혀질 수 있을 것 같습니다. 스윙 여부를 직관적으로 판단할 수 있는 기준으로 ”배트 헤드가 손을 지나갔는가?“ 등을 사용할 수 있는데, 구체적인 기준은 나중에 생각해 보기로 하고 기준과 독립적으로 생각해야 할 요소부터 생각해 봅시다.
가장 중요한 요소는 각도입니다. 처음엔 카메라를 잘 세팅해서 Image Segmentation, Object Detection으로만 문제를 해결할 수 있을 것 같았지만, 타자의 배팅 자세나 타석에서의 위치에 따라 카메라를 이동해야 한다는 번거로움이 있습니다. 실제로 도입된다고 해도 그걸 항상 움직일 수도 없는 노릇이죠.
그렇다면 각도를 직접 세팅하는 대신 3D Pose Estimation을 사용한다면 3차원 공간에서 타자의 손과 배트의 위치 관계를 파악할 수 있지 않을까요? 일단 지금은 3D Pose Estimation의 구체적인 구현 방법을 생략하도록 하고, Estimation이 모두 완료된 상태라고 가정하겠습니다.
이제 다음은 기준을 정해야 할 차례입니다. 앞서 언급했던 “배트 헤드가 손을 지났는가?”를 기준으로 사용하되, 손의 위치를 트래킹 하여 스윙 모션이 끝날 때까지 배트가 손을 지나는지, 타자 위의 시점에서 배트를 봤을 때, 0°가 되는 시점이 있는지를 고려해 보도록 하겠습니다.
이렇게 다양한 요소를 고려한다면 체크 스윙을 정의/판독할 수 있을 것 같습니다. (물론 어떤 요소를 가감하느냐에 따라 Detection, Motion Tracking 등을 사용할 수 있기 때문에 다양한 구현 방법이 있을 거예요. 그래도 일단 3D Pose Estimation을 기반으로 가야겠죠..?)
'AI' 카테고리의 다른 글
[AI] MediaPipe Hands: 랜드마크 탐지 모델 분석 (0) | 2025.01.01 |
---|---|
[AI] MediaPipe Hands: 손바닥 탐지 모델 분석 (0) | 2024.12.25 |
합성곱 신경망 (Convolutional Neural Network, CNN) (0) | 2024.09.01 |
전이 학습 (Transfer Learning) (0) | 2024.08.26 |
Cross Entropy Loss (0) | 2024.08.20 |