[Pose Estimation] DeepPose 논문 리뷰

2022.02.20 16:10 2,170 조회

안녕하세요! 오늘은 Pose Estimation에서 최초로 DNN을 적용한 모델인 Deep Pose의 논문을 리뷰했습니다.



Introduction


Deep Pose는 DNN 기반의 Pose Estimation(사람의 관절 위치를 찾는 task) 방법을 제안하며, 해당 task 최초로 DNN을 적용하여 SOTA를 달성하였습니다.

그 뿐만 아니라, 당시에는 딥러닝을 주로 Classification task에만 사용하였는 데 Regression task에서도 훌륭히 적용할 수 있음을 증명했습니다.


Pose Estimation task에서 CNN이 적합한 이유
  1. 관절 위치 예측 시 이미지의 맥락을 파악하여 예측 할 수 있기 때문에 관절들 사이의 상관 관계를 학습할 수 있다.
  2. 기존 방식이 관절 별 특징 검출과 검출기를 만든 다음 조합하는 방식이라면, CNN을 통해 단일 신경망으로 모든 관절 위치를 예측할 수 있다.



Deep Learning Model for Pose Estimation

Input Image가 CNN을 통과하면 각 관절 별로 x, y 좌표 2개씩 k개의 관절에 대해서 예측 값을 도출하며, 이는 총 2k 차원의 벡터를 의미합니다.


  • x : Image data
  • y : Ground truth pose vector
  • K : 신체 관절 수
  • y_i : i번째 관절의 x, y 좌표 (이미지 내 절대 좌표)


이때 벡터 y_i는 i번째 관절의 x, y 좌표를 담은 2차원 벡터이고, 벡터 y는 2차원 벡터 k개를 쭉 펼쳐서 이어 붙인 2k 차원의 벡터입니다.

벡터 y_i는 i번째 관절의 x, y 좌표와 중심점 간의 차를 구하고, 각각을 너비와 높이로 나눠 주어 normalize하여 사용합니다.


  • b = (b_c, B_w, B_h) : 사람 신체에 대한 bounding box
  • b_c : bounding box의 중심
  • b_w : bounding box의 너비
  • b_h: bounding box의 높이


예를 들어, Bounding Box (x, y, w, h) = (120, 150, 200, 300)이고 머리에 대한 좌표가 (120, 370)이라면 normalize된 좌표는 다음과 같습니다.



해당 normalize 과정을 Pose Vector 모두에 적용해주면 다음과 같은 normalized pose vector를 얻을 수 있습니다.



이렇게 normalize된 값을 통해 학습하여 예측 값을 도출할 수 있습니다.

그렇다면, 예측 값을 원래 이미지에 찍어주기 위해서는 normalize에 대한 역 연산을 진행해야하며 수식은 다음과 같습니다.

  • x : Input Image
  • φ : CNN 모델을 통과시키는 함수
  • θ : 학습되는 파라미터


즉, Input image와 파라미터를 통해 CNN이 normalize된 예측 값을 도출하고 이를 다시 역으로 적용하면 관절 예측 벡터인 y*를 구할 수 있게 됩니다.


다만, 이런 방식(Initial Stage)의 경우 큰 이미지를 보고 예측한 결과 값이기 때문에 정교함이 떨어질 수 있습니다.

따라서, 이를 보완하기 위한 아이디어는 예측 좌표를 기반으로 bounding box를 다시 그리고 crop하여 다시 CNN 모델을 통과하는 Cascasde 방식(Stage S)입니다.


앞서 Pose Vector에 대해 진행한 Normalize는 crop 전 이미지 내 좌표이기 때문에 이후 과정에서 원활히 사용하기 위함



Cascade of Pose Regressors


앞서, 설명한 바와 같이 예측 좌표를 기반으로 bounding box를 다시 그리고 crop하여 CNN 모델을 통과시키면 정교화된 좌표 예측값을 구할 수 있습니다.

이는 식으로 표현하면 다음과 같습니다.



이때, 모든 좌표들에 대해서 새로운 바운딩 박스를 그리며, σ*diam(ys)라는 수식에 의해서 크기가 결정됩니다.

  • diam(ys) : 이전에 예측한 좌표들에서 왼쪽 어깨와 오른쪽 엉덩이 좌표 간의 거리
  • σ : diam(ys)를 키워주는 파라미터, 따로 수식적으로 구하기 보단 임의의 상수 (2, 3...)을 입력해준다.



Training

과정

  1. Stage 1 모형을 학습하여 Input Image 속 관절의 대략적인 위치를 파악한다.
  2. 관절 별로 Stage t 모형에 새로운 Bounding Box를 입력해 예측 값을 산출하고 이를 S번 반복한다. (S >= t >= 2)


Metric : Percent of Detected Joints (PDJ)

  1. 몸통의 길이를 계산한다.
  2. (특정 임계값 * 길이)가 반지름인 원을 생성한다.
  3. 예측 위치가 원 내부에 있는 지 여부를 확인한다.
  4. 예측 결과에 대한 PDJ (= 원 내부에 있는 경우/전체 관절수)를 계산한다.



Result


Stage 1만 진행하는 것보다 관절 별로 모델 학습 시 탐지 성능이 증가함을 확인할 수 있습니다.



한계점

  1. 관절과 관절 간의 공간적 상관관계 정보를 고려하지 않기 때문에, 이미지 상으로 보이지 않는 관절들을 예측하기 어렵다.
  2. Input Image에 대한 crop을 반복하고, 각 단계별로 별개의 CNN을 학습시키는 방식에는 비효율적인 계산 과정이 존재한다.




Reference

[1] https://arxiv.org/abs/1312.4659


  • 아직 배우는 입장으로 부족한 점이 많습니다. 수정해야하거나, 추가해야할 점이 있다면 댓글로 조언 부탁드립니다.
  • 본 게시글은 데이콘 서포터즈 ‘데이크루’ 1기 활동의 일환입니다.