if(kakao) 2020 딥러닝으로 어려운 요가 자세 잡아드립니다.

남태우·2020년 11월 22일
0

Pose Estimation이란 ?

Pose EstimationKeypoint detection, 자세 인식 이라고 불립니다.
관절과 같은 사람의 주요 신체부위 keyPoint을 찾는 것입니다.


위 그림은 Pose Estimation이 keypoint를 찾아낸 위치입니다.

적용

Fitness : 운동에서 코칭이 가능합니다.
Entertainment : 게임에서 나의 동작과 게임의 동작이 얼마나 같은지 확인이 가능합니다.
Rehabilitation : 동작에 대한 피드백은 동적 재활에 사용성이 있음
Surveillance : 공공장소의 안전을 위해 설치된 카메라를 이용해서 사람이 어디에서 어디로 가는지 파악 가능
Safety : 어린아이나 거동이 어려운 분들이 위급한 상황일 때도 캡처할 수 있음
In-Store : 미국 아마존 매장에서는 사람의 움직임을 트래킹하여 누가 어떤 물건을 누가 잡는지, 사람 간의 상호작용이 어떻게 되는지 분석하여 자동 결제 시스템을 개발함.

Pose Estimation with Deep Learning 맛보기

Deep Learning Basic: Cat vs Dog

def build_cat_or_dog(cats, dogs):
  train([cats, dogs], [0,1])
  
def cat_or_dog(image):
  answer = network(image)
  
  return answer

build_cat_or_dog 개 혹은 고양이의 이미지를 입력을 받아 해당 이미지가 고양이와 가까우면 0, 개와 가까우면 1을 리턴해주는 네트워크
cat_or_dog 이미지를 넣어주면 출력 값으로 이 이미지가 고양이와 개 둘중에 어디에 가까운지 0 혹은 1을 리턴해줍니다.

Pose Estimation: Data, Annotation

위의 Cat vs Dog와 0과 1을 input으로 넣어주었는데 pose estimation은 사람의 포즈를 input으로 넣어줘야 합니다.
사람의 관절을 사람이 하나하나 마킹을 해서 데이터를 만들어야 합니다.
마킹한 것들을 keypoint라고 부릅니다.

key point로 pose estimation 모델에 만들 때 어떤 형태로?

Keypoint : 신체 중요 부위
이미지 상에서의 좌표 (x, y)
총 17개의 Keypoint

Deep Learning: Cat_or_dog vs Pose Estimation

def build_pose(images, keypoints):
  network.train(images, keypoints)
  
def pose(image):
  keypoints = network(image)
  # [x1, y1, ..., xk, yk]
  
  return keypoints

개 고양이 처럼 0과 1 두개의 숫자를 맞추는 것이 아니라 34개의 (x, y) 17쌍의 문제를 맞추는 것입니다.
build_pose keypoints가 변수가 34개의 숫자를 배열의 배열로 가지게 됩니다.
pose 이미지를 보고 34개의 좌표 값을 맞추게 됩니다.

이렇게 모델이 직접 좌표 값을 맞추는 방식은 regression 방식이라고 부릅니다.

Deep Learning: Heatmap

다른 방식은 Heatmap도 있습니다.

34개의 x, y keypoint를 맞추라는 대신, keypoint의 heatmap을 맞추는 방식입니다.
heatmap은 숫자의 범례의 따라 다양한 색으로 데이터를 표현하는 방식입니다.
keypoint의 (x, y) 중앙으로 기준 삼아서 가장 큰 값을 매핑한 적절한 분포를 만들고 이 값을 기준으로 3차원, 2차원으로 표현했을 때 아래의 그림과 같습니다.


어깨 위에서 heatmap를 그려보면 위 그림과 같습니다.
이 값을 실제로는 1.0 ~ 0.0 까지 부러럽게 표현한 2차원 배열의 heatmap입니다.
heatmap 입력 값을 사용하게 됩니다.
keypoint마다 만들기 때문에 총 17개가 만들어지게 됩니다.

def build_pose(images, keypoints):
  heatmaps = convert(keypoints)
  network.train(images, heatmaps)

input에서는 keypoints가 heatmap으로 변환 되는 convert 함수가 더 필요합니다.

def pose(image):
  heatmaps = network(image)
  keypoints = find_keypoint_from(heatmaps)
  
  return keypoints

딥러닝으로 학습된 네트워크를 사용할 때도 네트워크가 만들어내는 heatmap를 keypoint로 변환하는 과정이 필요하게 됩니다.

지금까지 본 방식이 heatmap 방식으로 pose estimation 한다고 말합니다.

현재까지는 한 사람으로 진행하였지만, 사람이 여러 명이 있다고 하면, 이미지를 잘라서 한 명씩 따로따로 keypoint를 찾는 것입니다.

좌측의 서퍼와 물구나무한 사람을 각각 네트워크에 넣는다고 하면 2번씩 반복하게 되고, 2명의 대해서 keypoint를 찾아낼 것입니다.

사람을 찾아내는 별도의 딥러닝 네트워크를 사용할 것입니다.
사람을 찾는 네트워크와 keypoint를 찾는 네트워크 2단계로 될 것이며, 이 방식을 Top-down 방식이라고 부릅니다.

Bottom up 방식은 이미지와는 별개로 keypoint를 먼저 다찾아 내고 연결관계를 찾아냅니다.
연결 도중에 다른 관절끼리의 연결이 생길 수 있는 문제점이 생깁니다.

Deep Learning: Simple Baseline

Pose model 구조

Top-down 방식 중에서 간단하면서 강력한 성능을 가진 simple baseline

ResNet + DeConv = Heatmap

ResNet을 사용해서 만든 picture을 DeConv layer을 사용하여 heatmap을 만들어 냅니다.

왼쪽의 RestNet 오른쪽의 3개의 DeConv layer
DeConv layer은 ResNet이 만든 picture을 확대시켜 Heatmap의 형태로 변환해주는 부분의 큰 역할을 담당실제 사용은 간단합니다.

Pose Estimation in kakaobrain

확실하게 pose estimation이 가능
kakao developers에서 인증키만 신청해서 받으면 pose api를 받아볼 수 있습니다.

(https://if.kakao.com/session/66)

profile
brand-new

0개의 댓글