새소식

딥러닝, 머신러닝/Pose Estimation

2D/3D Human Pose Estimation의 어려움

  • -

Human Pose Estimation은 다양한 분야에 사용되고 있는데 대표적인 분야들을 살펴보면 다음과 같습니다.

1. Person Re-ID : 쿼리로 오는 두 사람의 이미지가 같은 사람인지를 판단하는 방법 

2. High-fidelity rendering : VR 장비를 서로 끼고, 상대방의 얼굴이 내 앞에 3D로 렌더링되는 것 

3. Human action recognition : 비디오가 들어왔을 때, 포즈 추정하고, 어떤 행동을 하는지 추정하는 방법

4. Motion Transfer : 하나의 비디오, 하나의 사진 -> 사진에 있는 사람이 비디오에 있는 모션처럼 움직이도록 

Motion transfer(출처:구글)

5. Human image manipulation : 옷의 색, texture, 머리색 등을 변경

 

in the wild : 스튜디오나 특수장비가 있는 컨트롤된 환경이 아닌, 일상생활의 환경

 

 


 

2D Human pose estimation의 어려움

  • 폐색
  • 복잡한 자세 : 일상생활의 관절 가동범위 이상으로 움직이는 춤, 요가, 필라테스 등의 고난도 운동
  • 작은해상도 : 카메라에서 멀면 잘 안보임 (CCTV, 공공장소 감시 / 범죄자 움직임 분석)
  • 보통 crop해서 모델에 넣기 때문
  • motion blur : 입력 이미지의 정보가 불완전한 케이스(찍을때 손이 움직이거나, 피사체가 빨리 움직이거나, 춤 - 아이돌은 매 프레임마다 모션 블러 일어날 수도 있음, 피아노 연주, 기타 연주)
  • 잘림 : 보통 SNS 올릴 상반신만 올리는 경우가 많음, 안보이는 부분 어떻게 할건지

 

네트워크의 학습과 테스트

  • 기본적인 과정 : Input image - Feature extractor(보통 ResNet이나 Hourglass Network) - 2D heat map 추정
  • Input image : 우선 single person만 있는 cropped image만 한다고 가정
  • heat map : J x H x W (J=조인트 개수, H, W : 히트맵의 높이/너비)
  • 사실은 관절마다 2D Heatmap이 따로따로 있는 것
  • Heatmap 말고 Feature Extractor에서 2D Joint 바로 추정하는 방법 : 있긴 한데, 지금은 heat map 추정하는 방법들이 훨씬 높은 성능, 대부분 히트맵 선호
  • GAP해서 feature를 vectorize하고 좌표 추정하면 입력 이미지의 높이, 너비 개념이 없어지기 때문에 비선형적 연산을 요구해서 낮은 성능을 낸다

 

Heatmap 방식의 학습

  • GT 2D joint 에서 GT 2D heatmap을 만들고 L2 loss 적용해서 추정된 최종적으로 Feature extractor를 포함하는 NN이 GT에 가까운 heatmap을 추정하도록 한다

 

관절이 입력 이미지에서 정의가 안되어 있을 경우

  • 정의되어 있지 않은 관절들은 loss를 0으로 설정 : backprop 하지말고 신경쓰지말아라 (이런 heuristic rule 적용함)

 

Test

  • 2D heat map 추정 (JxHxW) : j번째 2D heatmap마다 하나의 Gaussian blob이 j번째 관절의 위치 중심에 만들어진다.
  • j번째 2D heatmap에 2D argmax 적용 : x, y 좌표 얻을 수 있음

Confidence 적용해서 Jx3을  수도 있다. (openpose)

 

 

 


 

 

3D HPE 어려움

3D human pose : 관절의 3D 좌표 및 회전, 카메라를 중심으로 하는 3D 공간 정의

 

Challenges

  • 2D와 같은 문제점
  • depth ambiguity : front view에서는 괜찮아 보이지만, 옆에서 보면, 이상해 보이는 것 / 제일 쉬운 해결방법은 multi-view 이미지 제공인데 in-the-wild에서 불가능
  • data collection : 3D data는 특수 장비로부터만 얻을 수 있다
    모션캡처(MoCap) 스튜디오가 가장 널리 사용됨 : 여러 view에서의 2D data를 triangulation을 통해 하나의 3D data로 변환
    MoCap studio data는 in-the-wild 이미지에 적용 불가! (움직임을 제외한 나머지는 모두 다름)

 

3D HPE 학습, 테스트

  • Input Image -> Feature Extractor(보통 ResNet 사용) -> 3D Pose 추정 (j번째 관절의 3D 포즈 : 그 관절의 3D 좌표 혹은 3D 회전)
  • 3D 좌표 추정 : x,y,z 단위는 픽셀이 아닌 real scale 사용 (미터, 밀리미터)
    3D heat map 방식 추정 : x, y (pixel), z(meter)
  • 회전

    * 입력 이미지 > Feature extractor > 3D rotations 추출 -> forward kinematics(미분가능한 연산) 해서 3D coordinates 얻는다 / Loss를 3D rotations, 3D coordinates 두 부분에 적용한다

    * 3D rotations : local rotations, 손목 로테이션은 팔꿈치에 상대적인 로테이션, 로테이션들이 누적돼서 좌표가 정해진다. 어깨에 에러있고, 팔꿈치에 에러가 생기면 손목에는 에러가 커진다.(endpoint 관절) 그래서 forward kinematics로 에러 누적을 방지하고자 좌표에 loss를 계산한다.

forward kinematics

: 관절들 사이의 길이와 관절들의 3D 회전으로부터 관절들의 3D 좌표를 recursive하게 계산한다

Kinematic chain : Tree 구조, child node

kinematic chain 예시 (출처: 구글)

 

single person

  • 사람이 어디있는지를 복원하는 것도 불가능하고, 중요하지 않기 때문에 root joint 상대적인 3D Pose 추정하도록 학습시킨다

 

Contents

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

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