Contribution 세미나/Pose estimation

End-to-End Multi-Person Pose Estimation with Transformers

PaperGPT 2023. 12. 10. 22:46

CVPR2022, 56회 인용 (2023-12-10 기준)

 

 

Introduction

사실 바로 전에 리뷰했던 FCPose에 나온 dynamic filter 컨셉을 보면서 가장 먼저 떠오른 생각은 DETR에서 object query가 instance별 keypoint를 찾는데 사용될 수 있지 않을까 하는 점이였다.

본 논문은 이러한 내 생각과 매우 유사한 컨셉의 논문이라고 볼 수 있다.

 

Fig. 1에서 볼 수 있듯이 기존 top-down, bottom-up 방식에 대한 설명을 간단하게 그림으로 표현하였다. (이전 글 참고)

본 논문에서는 이전처럼 전처리, 후처리 방식이 필요 없이, transformer를 활용하여 end-to-end로 학습을 진행한다.

 

 

사실 FCPose도 기존 two-stage 방식에서 벗어나 single stage로 동작한다. (FCPose 논문에서는 end-to-end 학습이라고 주장 하지만 본 논문에서는 FCPose가 완벽한 end-to-end 학습이라고 생각하지 않는다)

하지만 FCPose의 단점은 heatmap에서 peak 포인트를 찾아야 하고(instance의 센터 포인트 찾을때 쓰임), 후처리로 hand-crafted NMS를 사용한다. 따라서 Table 1에서 볼 수 있듯이, FCPose는 완벽한 end-to-end 학습이라고 하기 어렵다.

본 논문에서는 pose estimation을 transformer를 사용해 구현함으로서, fully end-to-end 학습을 적용하게 된다. (알다싶이 detr같은 경우는 NMS가 애초에 필요하지 않음)

 

이번 세미나에서는 DETR에 대해서는 어느정도 알고 있다는 가정하에 진행하겠다.

Contribution

1. 처음으로 fully end-to-end 학습 방식 제안 

2. DETR 컨셉을 사람의 joint(keypoint)를 찾는데 활용

 

본 논문에서는 제안하는 방식을 PETR로 명칭

 

Proposed method

 

Fig. 2는 PETR의 전체적인 구조를 보여주고 있다.

Visual feature encoder까지는 기존의 DETR구조와 동일하다고 볼 수 있다.

여기서는 2가지 형태의 decoder를 제안하고 있다.

 

Pose decoder

 

Fig. 3은 pose decoder에 대한 구조를 보여주고 있다.

 

 

논문 설명과 같이 기존 DETR은 object query(객체의 bounding box를 찾는데 사용)를 사용했다면 PETR에서는 pose query(사람의 keypoint를 찾는데 사용)를 사용한다. 학습된 pose query를 통해 score와 pose를 예측할 수 있다.

Pose는 K개의 joint들의 위치(x, y)를 나타내고 있고, score는 해당 query가 특정 instance(사람)를 나타내고 있는 확률을 의미한다. 즉 pose는 regression 문제, score는 classification 문제를 푼다고 볼 수 있다.

 

여기서 각각의 query는 학습가능한 파라미터를 의미하며, 하나의 instance(사람)를 대표하는 방향으로 학습된다고 생각하면 된다. (DETR에 대한 개념을 알고 있으면 이해하기 쉽다.)

 

좀 더 설명하자면, pose decoder는 여러개의 layer로 구성되어 있어서, 각 layer를 통과할때 마다 joint의 위치를 보정해나간다고 볼 수 있다. 

 

Joint decoder

 

 

사실 pose decoder만 있어도 이론적으로는 pose estimation이 가능하도고 생각한다. 여기서 joint decoder의 역할은 pose decoder에서 구한 joint 위치를 보정하는 역할을 한다고 생각하면 된다.

Joint decoder에서 joint query는 pose decoder에서 나온 output값이 사용된다. 

여기서는 joint 들의 상관관계에 좀 더 초점을 두어 decoder가 진행된다. (joint 끼리 attention 진행)

그리고 각 instance 별로 decoder가 병렬적으로 동작하게 된다.

즉 동일 instance 안에서만 attention이 적용된다. (특정 instance joint 위치를 보정하는데 다른 instance의 joint 정보는 필요없음)

 

pose decoder와 마찬가지로 여러개의 layer로 구성되어 있어서, 각 layer를 통과할때 마다 joint의 위치를 보정해나간다.

 

Loss function

pose decoder에서는 classificaiton loss(L_cls)와 regression loss(L_reg) 사용

joint decoder에서는 object keypoint similarity (OKS) loss 사용

해당 loss는 keypoint의 distance error에 대한 가중치가 object 사이즈(s)에 영향을 받는다.

즉 같은 distance error에 대해서도 작은 객체에서 발생하는 경우가 큰 객체에서 발생하는 경우보다 그 가중치가 더 커지게 된다. (안그러면 모델은 큰 객체에 대해서만 error를 줄이려고 하게되고 작은 객체에 대한 성능이 감소함)

마지막으로 heatmap loss가 사용되는데 이는 auxilary loss라고 생각하면 된다.

여기서는 C_3에 해당하는 feature map (Fig. 2) 에서 나온 encoder를 가지고 간단한 head를 연결해 keypoint들을 찾도록 학습하며, 이렇게 하게 되면 encoder가 keypoint를 찾는데 좀 더 수월하도록 유도하는 효과를 가져온다.
(본 논문에서는 학습 수렴 속도를 빠르게 하기 위해 사용, 여기서 사용되는 head는 학습할때만 사용되며 실제 inference 할때는 무시)

 

Experiments

FCPose랑 비교해봤을때 좀 더 좋은 성능을 보여준다.

 

Speed-accuracy를 같이 비교해보면 확실히 같은 연산량으로 더 성능이 좋은 결과를 보여준다.

 

확실히 joint decoder를 사용하면 성능이 더 좋아짐
(다만 joint decoder를 사용함으로써 연산량이 얼마나 증가하는지에 대한 내용은 없어 아쉬움)

 

OKS를 loss와 matching(detr에서 bipartite matching에 사용됨)에 적용했을때의 결과.

물론 둘다 적용했을때 성능이 제일 좋음

 

CrowdPose test dataset에 대해서도 좋은 성능을 보여줌, occulusion이 많은 상황에서도 좋은 성능을 보임.

 

검출 결과를 보여줌.