[TF_Tutorial] On-device Real-time Hand Tracking
카테고리: TF_Tutorial
Main Reference:
- TensorFlow Blog : 3D Hand Pose with MediaPipe and TensorFlow.js
- Google AI Blog : On-Device, Real-Time Hand Tracking with MediaPipe
- MediaPipe - Hands
Paper:
- MediaPipe Hands: On-device Real-time Hand Tracking
🚤 Introduction
Example1 | Example2 | Example3 |
---|---|---|
Hand Tracking 기술은 기계의 제스처 제어, 수화 이해 등 여러 플랫폼에서 중요한 구성 요소가 될 수 있다. 특히 실제 세계의 정보와 가상 디지털 정보가 상호작용하는 VR/AR 분야에서는 핵심적인 기술이다. 기존의 Hand Tracking 모델들은 손에 장비를 착용하거나, 특수한 카메라를 사용하거나 하는 하드웨어에 의존적인 방식이었지만 본 모델은 이를 극복하고 다음 성과를 달성하였다.
- 카메라 이외에 추가적인 하드웨어는 필요없다.
- 2개 이상의 손도 탐지할 수 있고, 손의 일부가 가려지더라도 탐지된다.
- 모바일 환경에서 실시간 연산이 가능하다.
🚤 Model Architecture
본 모델은 2 stage Detector 구조를 이루고 있다.
- Bounding box를 찾는 손바닥 Detector
- 각 Bounding box(손) 별로 21개의 keypoints 탐지
Palm Detector (손바닥 탐지)
Palm Detector는 모바일 환경에서 실시간 얼굴 탐지에 사용되던 BlazeFace 모델과 비슷하게 설계했다. 그림을 보면 convolution 중간중간 feature map을 사용하는 FPN(Feature Pyramid Network)구조와 유사하다는 것을 알 수 있다. 그런데 왜 Hand Detector가 아닌 Palm Detector를 사용했을까? 손의 위치를 찾는 것이 생각보다 쉽지 않기 때문이다. 얼굴의 경우 눈. 코, 입 등 뚜렷한 특징들이 있는 반면 손에서는 그렇다 할 특징이 존재하지 않는다. 따라서 손이 아닌 손바닥(손가락 뺀), Palm Detector를 사용했으며 다음과 같은 특징이 존재한다.
- 손에비해 NMS(Non-Max Suppression)가 잘 먹힌다.
- 손가락 같이 삐쭉삐쭉하면 Region Proposal이 쉽지 않다.
- Object Detection 배경지식 참고
- 손바닥의 bounding box 모양은 정사각형만 고려해도 된다.
- 일반적인 Region Proposal은 가로:세로 비율이 1:1, 1:2, 2:1인 경우를 고려한다.
- focal loss를 이용한다.
- object detection에서 사용하는 loss function. (따로 정리해서 블로깅 하겠습니다)
Hand Landmark Model
- Input Data
- Real world, Synthetic Images : 아래 datasets 목차에서 다룸
- Hand Presence : ‘왼손/오른손’ 라벨링
- Handedness : ‘이미지에 손이 존재하는가?’ 라벨링
Output : 21 3D LandMarks
- 여기서 주목할 점은 대략적인 손 모양은 정해져 있다는 것이다.
- 따라서 keypoints만 구하면 3D 손 모양을 비교적 정확하게 렌더링 할 수 있다.
- 이를 통해 상대적인 깊이(relative depth dimension) 차원을 구할 수 있다.
- 2 + 1 = 3D (x, y, relative depth) coordinate
- 3D LandMarks. 깊을 수록 진한 색으로 표현된다.
Implementation in MediaPipe
MideaPipe를 이용한 본 모델의 핵심적인 최적화 방법은 Palm Detector를 필요한 경우에만(매우 드물게) 실행한다는 것이다.
현재 프레임에서 LandMarks를 계산할 때 Hand bounding box를 놓쳤는지 여부를 flag로 설정한다(Handedness 값). 만약 손을 놓치지 않았다면 Palm detecting을 실행하지 않고 현재 프레임의 keypoints에서 후속 프레임의 손 위치를 추정한다. 이를 그래프로 표기하면 다음과 같다.
- 왼쪽 그림 : 맨 처음 시행
- Flag_off : 손 놓치지 않음
- Palm Detecting 실행하지 않고 바로 RandMarks 계산
- Flag_on : 손 놓침
- Palm Detecting 다시 실행
- 이후 RandMarks 계산
🚤 Datasets
각 목적에 따라 세 가지 dataset을 이용해 모델을 훈련시켰다.
In-the-wild dataset
일반적인 이미지 6천 장
- 다양한 배경
- 다양한 손의 크기
- Negative Sample (손 없음)
In-house collected gesture dataset
디테일 중심의 이미지 1만 장
- 배경과 손의 크기는 제한
- 손의 각도와 가능한 제스처에 집중
Synthetic dataset (합성 이미지)
- 그림의 상단 : real-world dataset
- 그림의 하단 : RandMarks를 이용한 손 3D 렌더링 + 다양한 배경 합성
Dataset에 따른 성능
🚤 Perfomance
- 본 모델의 목적은 모바일 환경에서의 실시간 연산
- accuracy vs speed trade-off 관계로 3 가지 모델 존재
- Light 모델의 경우 아이폰 디바이스에서 1.1ms. 디게 빠름
- Pixel 3가 뭔가 했더니 구글에서 만든 핸드폰 (이게 사회생활..?)
- 미국 수화 데이터에 대한 성능 평가
- 이전 모델에 비해 성능이 어마어마하게 좋아짐
🚤 실습 코드
Input | Hands Pose Detection |
---|---|
TensorFlow Blog 글들을 구경하다 보면 기술이 너무 좋아서 깜짝깜짝 놀란다. 이 논문도 2020년에 나왔던데 요즘 vision 분야가 폭발적으로 성장하는 것 같다.
댓글 남기기