yg log --graph --oneline --all

Home Stack Notes AboutRSS

1. CIGPose 논문 리뷰 - 가려진 관절을 문맥에 맡겨도 될까?

작성 · 11분 읽기 · 조회수 —

CIGPose 논문 읽기 · 1 / 2

들어가며

CIGPose를 공부하면서 가장 오래 붙잡고 있었던 질문은 “관절 특징을 다른 벡터로 바꾸는 게 왜 인과 개입이지?”였다. 전체 구조만 보면 이미지에서 특징을 뽑고, 일부를 바꾸고, GNN에 넣는 모델이다. 그런데 논문은 여기에 confounder, backdoor adjustment, counterfactual이라는 말을 붙인다. 구조는 따라갈 만한데, 그 구조가 왜 필요한지를 설명하려니 훨씬 어려워졌다.

그래서 이번에는 문제에서 출발해보려고 한다. 모델이 사람을 보고 자세를 추정한다고 생각했는데, 사실은 사람 옆의 물체를 보고 답을 찍고 있었다면? 그리고 그 물체가 사라지거나 엉뚱한 곳에 나타나면?

CIGPose: Causal Intervention Graph Neural Network for Whole-Body Pose Estimation
Bohao Li, Zhicheng Cao, Huixian Li, Yangming Guo · CVPR 2026
논문 · 보충자료 · 공식 코드

한 줄로 요약하면, CIGPose는 불확실한 관절 특징을 학습 가능한 관절별 기준 벡터로 바꾸고, 주변 관절과 전신의 관계를 이용해 자세를 다시 추정하는 모델이다.

이 글은 그 아이디어와 실험을 중심으로 읽는다. “그래서 실제 텐서는 어떻게 움직이는데?”가 궁금하다면 2편의 구현 해설에서 코드와 수식까지 이어서 볼 수 있다.


Part 1. Why CIGPose? — 사람 대신 의자를 보고 있었다면

관절 133개를 한꺼번에 찾는 문제

Whole-body pose estimation은 몸통과 팔다리뿐 아니라 얼굴과 손가락까지 함께 찾는 작업이다. COCO-WholeBody에서는 몸 17개, 발 6개, 얼굴 68개, 손 42개를 합쳐 133개 키포인트를 다룬다.

팔꿈치 몇 개를 찾는 것도 쉽지 않은데, 작게 찍힌 손가락과 가려진 얼굴까지 찾아야 한다. CIGPose는 사람 영역을 먼저 얻은 뒤 그 crop 안에서 자세를 추정하는 top-down 방식이다. 사람을 찾는 검출 단계와, crop 안에서 관절을 찾는 단계는 구분해야 한다.

문맥은 도움이 되지만, 지름길이 되기도 한다

설명을 위해 이런 학습 데이터를 생각해보자. 앉아 있는 사람 뒤에는 대부분 의자가 있다. 모델은 사람의 관절 배치를 자세히 보지 않고도 “의자가 보이네? 앉아 있겠군”이라는 규칙으로 꽤 많은 문제를 맞힐 수 있다.

그러다 서 있는 사람 뒤에 의자가 나타나면 어떻게 될까? 의자의 등받이를 사람의 몸통처럼 해석하는 식으로 틀릴 수 있다. 자세를 설명하는 증거와, 자세와 자주 함께 등장했던 배경을 혼동한 것이다. 이것이 이 논문이 문제 삼는 지름길 학습과 허위 상관관계다. 의자 예시는 직관을 위한 상황이고, 실제 논문의 비교는 아래 그림에서 확인할 수 있다.

CIGPose의 성능 비교와 문맥 때문에 잘못된 자세를 추정하는 사례 출처: 논문 Fig. 1. 위쪽은 성능 비교, 아래쪽은 RTMPose-x와 CIGPose-x의 예측 비교다. 배경 구조에 예측이 끌려가는 부분을 보자. 이미지를 누르면 크게 볼 수 있다.

문맥을 모두 없애자는 이야기는 아니다. 손목이 가려졌을 때 팔꿈치와 어깨가 어디 있는지는 분명 좋은 단서다. 문제는 어떤 문맥을 믿고, 어떤 시각적 단서를 덜 믿을 것인가다.


Part 2. 관찰 분포와 개입 분포 — 문맥의 가중치가 달라진다

관찰한 상관관계와 알고 싶은 효과

논문은 이 문제를 SCM, 즉 Structural Causal Model로 표현한다. 기호부터 정리하면 다음과 같다. 아래 표는 논문 3.1절의 정의를 설명용으로 정리한 것이다.

기호 의미 이 글에서 떠올릴 대상
이미지 X 입력 이미지 사람을 잘라낸 RGB 이미지
특징 F 키포인트 임베딩 관절마다 가진 특징 벡터
문맥 C 관측되지 않은 시각적 교란 요인 차폐 물체, 복잡한 배경, 조명
예측 Y 추정한 자세 각 키포인트의 좌표 분포

구조적 인과 모형과 CIM의 특징 선택 및 치환 과정 출처: 논문 Fig. 2. 왼쪽은 저자들이 제시한 인과 모형, 오른쪽은 CIM의 구현 아이디어다. 오른쪽에서는 점수를 계산한 뒤 일부 특징만 빨간 기준 벡터로 바뀌는 과정을 보면 된다.

관찰 데이터에서 예측하는 분포는, 각 문맥에서의 예측을 그 특징과 함께 나타나는 문맥의 빈도로 가중한 것으로 풀어 쓸 수 있다.

[설명용 유도: 조건부확률의 전확률 공식]

\[P(Y\mid F=f)=\sum_c P(Y\mid F=f,C=c)P(C=c\mid F=f)\]

의자 예시로 돌아가면, 특정 몸통 특징을 가진 학습 이미지에 의자가 자주 나왔을수록 의자가 있는 상황의 예측이 크게 반영된다. 마지막 가중치는 ‘허위 상관관계의 확률’이라는 별도 수치가 아니라, 특징이 주어졌을 때 문맥이 나타날 조건부확률이다.

논문은 대신 다음의 개입 분포를 목표로 제시한다.

[논문 원문: 식 (1), 특징을 f로 고정한 표기]

\[P(Y\mid do(F=f))=\sum_c P(Y\mid F=f,C=c)P(C=c)\]

차이는 마지막 가중치다. 특정 특징과 문맥이 함께 나타난 빈도 대신, 문맥 자체의 분포를 사용한다. 이것이 논문이 제시하는 backdoor adjustment의 목표다. 이 식을 적용하려면 저자들이 가정한 인과 모형과 조정 조건이 성립해야 한다.

그런데 배경의 모든 경우를 어떻게 더하지?

바로 이 부분이 걸린다. ‘의자가 있음/없음’ 정도면 간단해 보이지만, 실제 이미지의 문맥은 물체, 조명, 가림, 배경 질감이 뒤섞여 있다. 모든 문맥에 라벨이 달려 있는 것도 아니다.

논문도 이 합을 직접 계산할 수 없다고 말한다. 그래서 CIM이라는 실용적인 대체 방법을 제안한다. 교란의 영향을 받았을 법한 관절 특징을 찾아, 현재 이미지에서 가져오지 않은 기준 벡터로 바꾸는 것이다.

여기서 두 층위를 나눠두면 뒤가 편해진다. 위의 식은 논문의 인과적 목표, 다음에 나오는 특징 치환은 그 목표를 구현하려고 제안한 방법이다. 둘의 연결은 마지막에 다시 따져보자.


Part 3. CIGPose는 실제로 무엇을 바꾸는가

전체 구조부터 보기

CIGPose 전체 구조와 계층적 GNN의 세부 구조 출처: 논문 Fig. 5, 원문 PDF 5쪽에서 고해상도로 재추출. 위쪽은 전체 흐름, 아래쪽은 Hierarchical GNN이다. 학습할 때 원래 특징을 사용하는 관찰 경로가 함께 등장한다.

크게 네 단계로 볼 수 있다.

  1. Keypoint Encoder: 이미지에서 관절별 특징을 만든다.
  2. CIM: 불확실성 점수가 높은 관절 특징을 정준 임베딩으로 바꾼다.
  3. Hierarchical GNN: 가까운 관절과 전신 부위 사이의 관계를 반영한다.
  4. SimCC Head: x축과 y축의 좌표 분포를 예측한다.

포인트는 2번과 3번의 연결이다. 관절 특징을 바꾸고 끝내면 이미지에 맞는 자세를 얻기 어렵다. 바꾼 특징을 다른 관절과 함께 해석해야 한다.

CIM ① 어느 관절을 덜 믿을 것인가

SimCC는 좌표를 x축과 y축의 1차원 분류 문제로 표현한다. x축에서 어디에 있을지, y축에서 어디에 있을지 각각 분포를 만든다.

분포가 한 위치에 뾰족하게 모이면 모델이 한 후보를 강하게 선택하고 있다는 뜻이다. 반대로 여러 위치에 퍼지면 어느 후보인지 애매하다. 논문은 각 축의 최대 확률을 이용해 점수를 만든다.

[논문 원문: 식 (2)]

\[s_c(k)=1-\frac12\left(\max P_{k,x}+\max P_{k,y}\right)\]

직관을 위한 숫자를 넣어보면 이렇다. 아래 값은 실제 실험에서 측정한 수치가 아니다.

설명용 예시 x축 최대 확률 y축 최대 확률 교란 점수
한 위치에 비교적 집중 0.8 0.9 0.15
여러 위치에 분산 0.2 0.3 0.75

[설명용 유도] 최대 확률의 평균을 1에서 빼므로, 집중도가 낮을수록 점수가 커진다. 다만 실제 좌표 bin 수나 분포 설정에 따라 확률값의 크기는 달라진다. 이 숫자 자체를 개입 임계값으로 해석하면 안 된다.

가시 키포인트와 차폐 키포인트의 교란 점수 분포 비교 출처: 논문 Fig. 3. 차폐된 키포인트 쪽의 점수가 더 높다는 비교로, 저자들은 이 점수를 대리 지표로 사용하는 근거를 제시한다.

이름은 ‘교란 점수’지만, 실제 계산은 예측 분포의 집중도를 이용한 모호성 점수다. 교란 원인을 직접 측정하거나, 불확실성을 원인별로 분리하는 계산은 아니다. 논문의 검증도 어떤 상황에서 이 점수가 유용한지를 뒷받침하는 근거로 읽는 것이 적절하다.

CIM ② 정준 임베딩은 정답 좌표인가?

처음에는 ‘정준’이라는 말 때문에 표준적인 사람 자세나 평균 좌표를 떠올리기 쉽다. 하지만 여기서 정준 임베딩은 좌표가 아니라 학습 가능한 특징 벡터다. 관절 종류마다 하나씩 있으며, 여러 이미지가 같은 테이블을 공유한다.

예를 들어 왼쪽 손목 특징을 바꾸기로 했다면, 현재 이미지에서 얻은 왼쪽 손목 벡터 대신 테이블의 왼쪽 손목 벡터를 넣는다.

[논문 원문: 식 (3)]

\[f'_k=\begin{cases} z_k,&k\text{가 개입 대상으로 선택되었을 때}\\ f_k,&\text{그 외} \end{cases}\]

같은 기준 벡터를 넣는다고 모든 사람의 손목 좌표가 같아지는 것은 아니다. 뒤의 GNN이 함께 들어온 어깨, 팔꿈치, 몸통 등의 특징을 반영하고, 최종 head가 그 결과를 좌표 분포로 바꾼다.

정준 임베딩은 별도의 관절 데이터셋에서 미리 학습해 가져오는 것이 아니라, 보충자료와 공개 코드에서 확인할 수 있는 학습 파라미터다. 무작위로 초기화한 뒤 전체 모델의 손실을 통해 함께 학습한다. 보충자료 C절

HGNN — 가까운 관절에서 전신 관계까지

GNN은 두 수준의 관계를 사용한다.

단계 관계를 보는 단위 하는 일
국소 골격 그래프 관절과 연결된 이웃 관절 어깨·팔꿈치·손목처럼 연결된 특징을 모은다
의미 그룹 간 그래프 손, 팔, 얼굴 등의 그룹 그룹끼리 정보를 교환하고 관절 특징을 조절할 gate를 만든다

손목이 애매할 때 팔꿈치를 보는 것이 첫 단계라면, 팔의 특징을 몸 전체의 관계 속에서 다시 조절하는 것이 두 번째 단계다. 논문은 이를 local-to-global 구조로 설명한다.

여기서 ‘관계’는 사람이 미리 정해둔 연결을 이용하지만, 그 연결에서 어떤 특징을 전달하고 얼마나 반영할지는 학습된다. 이전에 정리한 GCN 리뷰와 연결되는 부분이다. 다만 CIGPose의 실제 연산은 그 글의 기본 GCN 전파식을 그대로 사용하는 것이 아니라 EdgeConv와 그룹 gate를 사용한다.


Part 4. 바꾸면서도 멀쩡한 관절은 지켜야 한다

학습할 때는 두 경로를 사용한다. 일부 특징을 바꾼 반사실 경로가 최종 예측을 학습하고, 원래 특징으로 예측한 관찰 경로가 안정적인 키포인트의 기준을 제공한다. 추론할 때는 반사실 경로를 사용한다.

[논문 원문: 3.4절 전체 목적 함수]

\[\mathcal L=\mathcal L_{\mathrm{kpt}}+\lambda\mathcal L_{\mathrm{cf}}\]
손실 비교 대상 적용 대상
Keypoint loss 최종 예측과 정답 SimCC 분포 정답 가중치가 유효한 키포인트, 개입 여부와 무관
Counterfactual consistency loss 관찰 경로의 예측과 반사실 경로의 예측 개입하지 않은 키포인트 중 정답 가중치가 유효한 것

예를 들어 왼쪽 손목만 바꿨다고 해보자. GNN에서는 관절들이 서로 연결되어 있으므로, 손목의 변화가 멀쩡했던 팔꿈치에도 영향을 줄 수 있다. 일관성 손실은 그 팔꿈치의 예측까지 불필요하게 흔들리지 않도록 제약한다.

관찰 경로는 gradient를 차단한 기준으로 사용한다. 그렇다고 GNN 전체가 학습되지 않는 것은 아니다. 같은 GNN 파라미터가 반사실 경로에서는 학습된다. 이 부분은 2편의 손실·gradient 해설에서 따로 풀어본다.


Part 5. 실험 결과 — GNN과 CIM의 기여

같은 크기의 모델끼리 비교하기

아래는 논문 Table 1에서 관련 행과 열을 발췌한 것이다. 입력은 모두 384×288, 지표는 COCO-WholeBody V1.0의 Whole-body AP, 원문 표는 flip test를 사용한다. 여기서는 UBody를 추가하지 않은 RTMPose와 CIGPose를 비교한다.

방법 GFLOPs Whole-body AP
RTMPose-l 10.1 64.8
CIGPose-l 10.7 66.3
RTMPose-x 18.1 65.3
CIGPose-x 18.7 67.0

출처: 논문 Table 1 발췌. 원문 표 전체 보기. AP는 원문 표의 백분율 스케일이며, 수치는 직접 재현한 결과가 아니라 논문 보고값이다.

l 모델은 1.5 AP 포인트, x 모델은 1.7 AP 포인트 높아진다. x 모델에 UBody를 추가한 설정은 67.5 AP지만, 그것은 추가 학습 데이터를 사용한 별도 조건이므로 위의 네 행과 구분해서 봐야 한다.

GNN만 넣어도 꽤 오르는데?

이 논문에서 가장 유심히 볼 표는 ablation이라고 생각한다. 인과 개입이라는 이름이 강렬해도, 모델에는 GNN도 새로 들어간다. 전체 성능 향상이 모두 CIM 덕분이라고 읽으면 안 된다.

구성 — x 모델 기준 AP baseline 대비
RTMPose-x baseline 65.3 —
CIM만 추가 66.1 +0.8
국소 골격 GNN만 추가 66.3 +1.0
국소 + 의미 그룹 GNN 66.8 +1.5
CIM + 전체 GNN 67.0 +1.7

출처: 논문 Table 4에서 x 모델 행을 발췌·재배열. 원문 ablation 표 보기. 각 증가량은 해당 표의 점수 차이다.

이 표에서는 전체 GNN을 붙였을 때 이미 66.8 AP이고, 여기에 CIM을 더하면 0.2 AP 포인트가 추가된다. CIM 단독으로도 향상이 있지만, 이 실험에서 구조적 관계 추론의 기여 역시 크다. 각 모듈의 효과는 결합 방식에 따라 달라지므로 증가량을 독립적인 기여도로 단순 합산하지는 말자.

숫자로 보기 어려운 변화

어려운 이미지에서 입력, RTMPose-x, CIGPose-x를 비교한 자세 예측 결과 출처: 논문 Fig. 6. 각 비교는 입력 이미지 → RTMPose-x → CIGPose-x 순서다. 복잡한 배경과 차폐 근처에서 관절 배치가 어떻게 달라졌는지 보면 된다.

정성적 예시는 구조적으로 더 자연스러워진 결과를 보여준다. 다만 선택된 사례 몇 장이 모든 배경이나 모든 가림 상황에서의 강건성을 보장하지는 않는다. 전체 지표, ablation, 그리고 실패 사례를 함께 봐야 한다.


Part 6. 읽고 나서 남은 질문

특징 치환은 backdoor 평균과 같은 계산인가?

처음의 질문으로 돌아왔다. 논문은 모든 문맥에 대해 평균하는 식을 목표로 제시하지만, 구현은 불확실한 관절을 골라 정준 벡터로 바꾼다. 코드 안에서 문맥의 분포를 추정하고 그 합을 직접 계산하지는 않는다.

보충자료 A절은 저자들이 이 치환을 인과적 근사로 해석하는 근거를 설명한다. 하지만 그것을 곧바로 “일반적인 이미지 분포에서 backdoor 평균과 정확히 같은 계산임을 보였다”로 받아들이기는 어렵다. 목표, 근사의 가정, 실험으로 확인된 효과를 구분하는 편이 낫다.

Fig. 2(b)도 저자들이 제안한 모형으로 읽어야 한다. 표준적인 do-연산은 개입한 변수로 들어오는 연결을 제거하는 방식으로 정의된다. 그림에서 교란 연결에 그려진 X 표시를 보고, “특징을 바꾸면 모든 배경 영향이 실제로 끊겼다”고 단정하는 것은 설명을 건너뛰는 셈이다. 논문 3.1절·보충자료 A절

정준 벡터가 현재 이미지와 무관한 공유 파라미터라는 점도, 학습 데이터의 모든 편향으로부터 자유롭다는 뜻은 아니다. 학습 데이터로 최적화되는 파라미터이기 때문이다. 이 구분이 논문을 읽으며 가장 신경 쓰였던 부분이다.

불확실한데 맞는 자세, 확신하는데 틀린 자세

CIGPose의 드문 자세 과잉 교정과 가로등 거짓 양성 실패 사례 출처: 보충자료 Fig. 8·F절. 위쪽은 드물지만 타당한 자세를 과하게 교정할 수 있는 사례, 아래쪽은 가로등을 사람으로 오인한 사례다.

보충자료는 두 가지 한계를 설명한다.

  • 드물지만 올바른 자세: 익숙하지 않아서 불확실하다는 이유로 타당한 특징까지 바꿔버릴 수 있다. 개인의 실제 자세보다 평범한 패턴에 가까운 결과를 선호할 위험이다.
  • 확신에 찬 오류: 가로등처럼 사람을 닮은 구조에서 확신하며 틀리면 불확실성 기반 점수가 이를 잘 잡지 못한다. 특히 사람 검출부터 잘못된 top-down 입력을 CIM만으로 해결한다고 볼 수 없다.

논문은 이를 낮은 점수가 개입을 우회하는 문제로 설명한다. 한편 검토한 공개 설정은 추론에서도 Top-1을 선택한다. 따라서 코드 기준으로는 ‘관절을 하나도 바꾸지 않는다’기보다, 점수의 순위가 확신에 찬 오류를 식별하고 거부할 기준이 되기 어렵다고 구분해 적는 편이 정확하다.

내 생각

CIGPose에서 흥미로웠던 것은 모든 관절 특징을 끝까지 같은 신뢰도로 사용하는 대신, 의심스러운 특징을 바꾸고 관계를 이용해 보완한다는 설계였다. 여기에 “멀쩡했던 예측은 지키자”는 일관성 손실까지 붙으니 각 구성의 목적이 연결된다.

반면 인과 추론의 언어로 문제를 정리하는 것과, 구현의 인과적 타당성을 입증하는 것은 다른 단계다. 이 논문은 그 사이를 어떻게 읽어야 하는지 연습하기 좋은 사례이기도 했다. 좋은 결과가 나왔다는 사실과, 그 결과를 설명하는 이론이 어디까지 검증되었는지를 함께 따져보게 된다.

다음 글에서는 이 아이디어를 실제 코드의 텐서 흐름과 gradient 경로로 내려가 본다. 관절 벡터 하나가 바뀌면 어느 파라미터가 학습되는지까지 보면, 정준 임베딩이 무엇인지도 훨씬 구체적으로 이해할 수 있다.

참고 자료