프로그래밍/논문 리뷰

OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields 논문 리뷰

Jay_rock 2022. 10. 12. 15:55

<OpenPose: Realtime Multi-Person2D Pose

Estimation using Part Affinity Fields>


세계 최대의 컴퓨터 비전 및 패턴 인식 컨퍼런스 CVPR에서 2017년
미국 카네기 멜론 대학교에서 개발한 모델이다.

 

Abstract

여러 사람들의 2D 포즈를 실시간으로 추정할 수 있는 방식을 제안한다. 특히 PAF(Part Affinity Fields)라는 비모수 표현을 이용하여 사람의 신체 부위를 연결하는 Bottom-up 방식을 사용해 정확도를 높이고, 추론 시간 단축한 것이 특징이다.

 

 

- 이미지에서 여러 사람들의 포즈를 추론할 때 해결해야 하는 문제들이 있다.

첫째, 각 이미지에는 위치나 크기 관계없이 알 수 없는 수의 사람들이 포함될 수 있다.
둘째, 사람 사이의 상호작용은 접촉, 교합 등으로 인해 복잡한 자세로 인해 관절마다 간섭이 생겨 관절 연결을 어렵게 만든다.
셋째, 이미지에 있는 사람의 수와 함께 런타임 복잡성이 증가하여 실시간 성능을 어렵게 만든다.

 

 

이미지 출처: https://medium.com/beyondminds/an-overview-of-human-pose-estimation-with-deep-learning-d49eb656739b

 

- Pose Estimation의 두 가지 방식

  • Top-down (첫 번째 사진 방식)

기존에 사용하던 pose estimation 방식으로, 우선 input image에서 사람을 먼저 detect 한 후에 해당 roi에서 사람을 찾는다.

  • Bottom-up (두 번째 사진 방식)

Top-down과는 반대로 input image에서 part(관절)를 우선 찾은 후에 관절들을 연결하는 방식이다.

 

실시간 multi-person detect에서 사람 수에 비례하여 inference 시간이 늘어나는 Top-down 방식보단 Bottom-up 방식이 조금 더 유리하다.

 

그러므로 openpose에선 두번째 방식인 Bottom-up 방식을 사용하였다.

 

 

 

Method

- Network Architecture

  • 우선 CNN기반인 VGG-19(처음 10개 레이어를 초기화하고 미세 조정됨)를 통과하여 feature map(F)를 얻는다. 
  • Feature map(F)은 각 Stage 1의 Input으로 각 입력이 된다.
  • 한 개의 Stage는 Part Confidence Maps와 Part Affinity Fields 두 개의 층으로 이루어져 있다.
  • 두 번째 Stage에서부터는 전 Stage의 결과값들과 특징맵 Fconcat하여 다음 stageInput으로 사용한다. (논문에서는 Stage 6까지 존재함)
  • 각 Stage마다 실제 데이터와 예측 데이터의 Loss Function을 구하여 평가하기 때문에 Stage가 진행됨에 따라 정확도가 증가한다.

 

 

 

- Part Confidence Maps

왼쪽 그림은 Part Confidence Maps(Heatmap), 오른쪽 그림은 Confidence(S)를 픽셀(p)별로 그려둔 그래프이다.

관절이 존재할 가능성이 높은 지점을 찾고, 주변 pixel 값에서 다른 관절을 찾아가면서 Heatmap을 만들어 예측한다.

이때 가우시안 값을 사용하여 존재할 확률(Confidence)을 인코딩한다. 

 

 

만약 여러 사람이 한 픽셀에 중첩된다면, 가장 큰 S값을 갖는 해당 pixel의 값으로 할당한다.

Average을 사용하지 않고 Max를 사용하는 이유는 오른쪽 그래프를 보면 Max값이 Average값을 사용했을 때보다 최고 값을 더 잘 유지하는 것을 확인할 수 있다. (여기서 max는 Non-Maximum Suppression이다.)

 

 

 

 

- Part Affinity Fields

서로 연결되는 두 Part(관절)의 관계를 추정하고, 두 Part들의 연결선 상에 있는 pixel에 vector field를 할당한다.

점 p가 관절 사이(limb c)에 존재한다면 j1 에서 j2로 향하는 unit vector를 할당하고, 그렇지 않다면 zero vector를 할당한다. 점 p가 관절 사이(limb c)에 존재하는지는 다음 식을 통해 알 수 있다. 

쉽게 얘기하면, 왼쪽 팔 그림에서 두 점(두 관절) x 사이에 있는 뼈 위에 점 p가 존재하려면 두 가지를 만족해야 한다.

  1. 선분 x(j1)p에서 두 점 x로 연결된 선분으로 정사영된 거리(초록색 점선 가로)가 원래 limb 길이보다 작아야 한다.
  2. 선분 x(j1)p에서  두 점 x로 연결된 선분과 직각을 이루는 선분으로 정사영된 거리(초록색 점선 세로)가 원래 limb의 두께보다 작아야 한다. 

동일한 pixel에 여러 사람의 part affinity field가 중첩되어 있다면, 모든 사람의 affinity vector 평균을 pixel 값으로 할당한다.

 

 

- Part association

이분법 매칭은 한 그룹의 정점과 다른 그룹의 정점으로 간선을 연결할 때 모든 다른 점과 일대일 매칭을 해주는 방식이다. confidence map을 통한 점들을 연결해주기 위해 사용한다. 알맞은 관절들끼리 연결해주기 위해서 다음 식을 사용한다.

한 관절과 연결될 것이라 예상되는 다른 관절과 사이에 있는 모든 pixel들의 PAF값들을 적분하여 association의 정도를 나타내는 E값을 구한다. 두 관절 사이의 점들의 affinity vector의 방향이 서로 일치할수록E의 값이 커지게 된다.

 

합산한 E의 최댓값인 part pairs를 찾고 연결하면 된다.

 

 

 

-Loss Functions

stage마다 L2 loss 측정해 합산하여 vanishing gradient 문제를 해결하고, 네트워크를 개선합니다.

(L2- Loss : 오차 제곱 값의 총합)

이때 W(p)는 binary mask로 confidence map이나 affinity vector가 0일 땐 0을 갖는다. confidence map loss와와 affinity field loss의 합산으로 전체 손실 함수를 정의한다.

 

 

 

- Overall Pipeline

 

 

 

Reference

https://velog.io/@mink7878/Pose-Estimation-Realtime-Multi-Person-2D-Pose-Estimation-using-Part-Affinity-Fields-OpenPose-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0

https://euju-wouldyou.tistory.com/65

https://reading-cv-paper.tistory.com/entry/TPAMI-OpenPose-Realtime-Multi-Person-2D-Pose-Estimation-using-Part-Affinity-Fields