새소식

딥러닝, 머신러닝/Pose Estimation

2D Human Pose Estimation 연구동향

  • -

2D Human Pose Estimation 분야는 굉장히 많은 발전이 이뤄져 왔고, 현재 매우 높은 성능을 내고 있습니다.

대표적인 접근법으로는 Top-down 방식과 Bottom-up 방식이 있는데요.

 

Top-down (출처:구글)

  • Top-down : Top-down 방식은 이미지에서 YOLO나 Mask R-CNN과 같은 Object Detector를 사용해 사람을 detection한 뒤, crop and resize해서 single person pose estimation을 진행하는 방식입니다.
    - 최근의 Human detection network는 매우 정확해서 detect를 하지 못하는 경우가 거의 없습니다.
    위처럼 사람 간 겹쳐서 일부 폐색이 일어나는 경우도 마찬가지죠.
    - Bottom-up 방식 대비 정확성이 더 높습니다 : Top-down 78 vs Bottom-up 71
    - 최근의 사람 입력 이미지는 대부분 고해상도이기 때문에, 카메라에서 멀리 떨어진 사람도 crop해서 256x256으로 resize 하면 들어가는 사람의 scale도 어느 정도 크다고 보장됩니다. 
    - 단점으로는 분리된 시스템이기 때문에 비효율적일 수 있다는 문제가 있습니다.

  • Bottom-up : Joint detection + Grouping
    - 입력 이미지의 모든 관절을 다 찾는 방식, 우선 그게 어떤 사람의 관절인지는 상관하지 않는다.
    - 다 찾은 뒤 그걸 사람별로 묶는다
    - 256x256으로 full image를 가져가기 때문에, 카메라에서 멀리 떨어진 사람들은 저해상도일 수 있다.
    - 따라서 여러 스케일을 가진 사람을 고려해야 한다 : 카메라에 가까운 사람 크고, 멀면 작기 때문

 

 

 


 

 

Top-down approaches

mask r-cnn(출처:구글)

  • Mask R-CNN을 Human detector로 사용하는 경우, 사람을 입력 이미지에서 crop and resize 하는 게 아니라! feature map에서 crop and resize를 한다. 이 영역을 RoIAlign이라 한다.
  • 이런 식으로 아키텍처를 구성하면 human detector와 pose estimation network가 공유되어 end-to-end 로도 사용이 가능하다.

 

1. SimpleBaseline (2019)

SimpleBaseline (출처 : 구글)

  • ResNet과 3개의 deconvolution layer로 구성된 간단한 형태이다.
  • YOLOv5 + SimpleBaseline을 결합해서 쓰는 게 가장 무난하다고 한다.

 

2. HRNet (2019)

HRNet (출처: 구글)

  • ResNet과 같은 기존의 Human Pose Estimation을 위한 backbone들은 입력 이미지를 32배나 downsampling하기 때문에,
    사람의 작은 파트 (손목, 발목 등)가 8x8로 줄어든 상태에서는 안 보일 수 있다는 문제점을 지적한다.
  • 이를 discretization problem이라고도 한다. 8x8의 1pixel만 틀려도, 256x256 input image의 1~32x1~32 픽셀이 틀린 것
  • 그래서 위 그림에서 볼 수 있듯이, HRNet은 고해상도(1x)의 feature map을 끝까지 쭉 가져가고, 아래에 2x, 4x로 branch를 나눠서 multi-scale 정보로 가져가도록 한다.
  • 고해상도 feature가 매우 유용하고, multi-scale fusing이 스케일별 정보를 보충해주는 역할을 해서 정확도를 올려준다고 할 수 있다.
  • 현재 좀 더 어려운 연구(crowd scene 등)에 특화된 모델들을 제외하고는 일반적으로 HRNet을 이기는 연구가 잘 없습니다.
    하지만 HRNet이 SimpleBaseline보다 좀 더 시간이 걸리기 때문에 빠른 속도를 원한다면 SimpleBaseline을 사용하는 게 좋습니다.

 

 

참고하면 좋은 코드

Human detector (YOLOv5) : https://github.com/ultralytics/yolov5

SimpleBaseline

 

 


 

 

Bottom-up approaches

: Bottom-up에서는 Joint detector는 Top-down에서 개발된 걸 가지고 오는 편이고, Grouping을 어떻게 할지를 고민하는 경우가 많다.

 

1. Associative Embedding (2017)

associative embedding

  • Joint detector : 2D Gaussian heatmap 추정
  • 사람별로 grouping하기 위해 Associative Embedding을 도입했다
  • Associative Embedding : 각 pixel은 이 pixel이 어떤 사람에 속하는 지를 나타내는 tag value로 구성된다.
    같은 사람에 속하는 관절 위치들은 같은 태그값을 갖도록 학습된다.
  • 테스트 단계에서, 태그값의 차이가 미리 정한 임계치보다 작으면, 두 관절은 같은 사람에 속한다고 판정한다.
  • 폐색된 경우를 handling할 수 없는 문제점 : 보이는 부분에만 tag 값을 주기 때문에,
    폐색된 부분은 다른 사람에 속하게 될 수 있다 (픽셀 단위기 때문에)

 

2. HigherHRNet (2020) : Scale-Aware High-Resolution Net

 

HigherHRNet (출처: 구글)

  • Bottom up 방식인데도, joint detector를 좀 더 발전시킨 논문
  • HRNet이 backbone, 뒤에 Multi-resolution supervision, Multi-scale fusion 붙임
  • Multi-resolution supervision을 통해 여러 resolution heapmap을 추정하도록 학습했다
  • Multi-scale fusion : 최종 heatmap을 여러 resolution heatmap을 합쳐서 추정하자
    (1/4 downsampling, 1/2 downsampling)
  • Grouping : Associative Embedding 사용(태그)
  • Bottom-up SOTA 달성, 68.4
  • Top-Down에 비해서는 성능이 안좋음, HRNet-W48+extra data 77

 

참고하면 좋은 코드

model : https://github.com/HRNet/HigherHRNet-Human-Pose-Estimation/blob/master/lib/models/pose_higher_hrnet.py

 

HigherHRNet 코드 일부

기존 HRNet과 다른 부분은 final layer와 upsampling을 위한 deconv layer를 추가했다는 거고요.

 

HigherHRNet 코드 일부 (2)

forward method를 보면, final output으로 두개가 append되는데, 하나는 4x downsampling 된 것, 다른 하나는 4x downsampling을 deconv(upsampling)해서 2x downsampling된 거로 만들어서 final output을 만들고 있습니다.

 

 

loss : https://github.com/HRNet/HigherHRNet-Human-Pose-Estimation/blob/master/lib/core/loss.py

HigherHRNet Loss - AELoss

HigherHRNet의 Loss 부분 중 AELoss의 forward 부분인데요.

singleTagLoss가 핵심입니다.

다른 사람일 경우 멀어지도록 push, 같은 사람일 경우 당겨서 가깝게 pull을 유도하는 식으로 짜여져 있습니다.

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.