본문으로 건너뛰기

© 2026 Molayo

GitHub요약2026. 05. 23. 15:43

molyswu/hand_detection

요약

Tensorflow의 Object Detection API와 SSD 신경망을 사용하여 1인칭 시점(egocentric view)의 손을 탐지하는 기술 가이드입니다. Egohands 데이터셋을 활용하여 실시간 웹캠 및 유튜브 영상에서 손을 추적하는 방법과 코드를 제공합니다.

핵심 포인트

  • Tensorflow SSD를 이용한 손 탐지 모델 학습 및 구현
  • 1인칭 시점(Egocentric view) 탐지에 최적화된 Egohands 데이터셋 활용
  • Macbook Pro CPU 환경에서 실시간 탐지 성능(FPS) 확인 가능
  • 다른 객체 탐지 사례로 확장 가능한 튜토리얼 코드 제공

저장소: molyswu/hand_detection
언어: Python
Stars: 276
Forks: 85

설명:
Tensorflow에서 신경망 (Neural Networks, SSD)을 사용합니다. 이 저장소는 Tensorflow (Object Detection API)를 사용하여 손 탐지기 (hand detector)를 학습시키는 데 사용된 단계와 스크립트를 기록합니다. 모든 심층 신경망 (DNN) 기반 작업과 마찬가지로, 프로세스에서 가장 비용이 많이 들고 (그리고 위험한) 부분은 적절한 (주석이 달린) 데이터셋을 찾거나 만드는 것과 관련이 있습니다. 저는 주로 테이블 위의 손을 탐지하는 것 (1인칭 시점, egocentric view point)에 관심이 있었습니다. 처음에는 Oxford Hands Dataset을 사용하여 실험했으나 (결과가 좋지 않았습니다), 그 후 제 요구 사항에 훨씬 더 잘 맞는 Egohands Dataset을 시도했습니다. 이 저장소/포스트의 목표는 신경망이 손을 추적하는 (어려운) 문제 (1인칭 시점 및 기타 뷰)에 어떻게 적용될 수 있는지 보여주는 것입니다. 더 나아가, 다른 사용 사례에 적응할 수 있는 코드를 제공하는 것입니다. 만약 당신의 연구나 프로젝트에서 이 튜토리얼이나 모델을 사용한다면, 이것을 인용해 주세요. 여기 작동 중인 탐지기가 있습니다. <img src="images/hand1.gif" width="33.3%"><img src="images/hand2.gif" width="33.3%"><img src="images/hand3.gif" width="33.3%"> 웹캠의 비디오 스트림에서 실시간 탐지. <img src="images/chess1.gif" width="33.3%"><img src="images/chess2.gif" width="33.3%"><img src="images/chess3.gif" width="33.3%"> Youtube 비디오에서의 탐지. 위의 두 예제 모두 Macbook Pro CPU (i7, 2.5GHz, 16GB)에서 실행되었습니다.

일부 FPS 수치는 다음과 같습니다:

FPS이미지 크기 (Image Size)디바이스 (Device)비고 (Comments)
21320 * 240Macbook pro (i7, 2.5GHz, 16GB)결과를 시각화하지 않고 실행
16320 * 240Macbook pro (i7, 2.5GHz, 16GB)결과를 시각화하며 실행 (위 이미지)
11640 * 480Macbook pro (i7, 2.5GHz, 16GB)결과를 시각화하며 실행 (위 이미지)

참고: 이 리포지토리의 코드는 Tensorflow 1.4.0-rc0 버전으로 작성 및 테스트되었습니다. 다른 버전을 사용할 경우 일부 오류가 발생할 수 있습니다. 사용 중인 TF 버전에 맞추기 위해 리포지토리의 모델 체크포인트를 사용하여 직접 프로즌 모델 (frozen model) 그래프를 생성해야 할 수도 있습니다.

이 문서의 내용

  • 동기 (Motivation)
  • 왜 신경망 (Neural Networks)으로 손을 추적/탐지하는가
  • Tensorflow에서의 데이터 준비 및 네트워크 학습 (데이터셋, 임포트, 학습)
  • 손 탐지 모델 학습
  • 탐지기를 사용하여 손 탐지/추적하기
  • 최적화에 대한 생각

추신: 만약 여기서 제공하는 모델을 사용 중이거나 사용해 보셨다면, 언제든지 Twitter (@vykthur)를 통해 연락하여 여러분의 작업물을 공유해 주세요!

동기 (Motivation)

  • 왜 신경망 (Neural Networks)으로 손을 추적/탐지하는가?

컴퓨터 비전 (Computer Vision) 분야에는 손을 추적하기 위한 여러 기존 접근 방식이 존재합니다. 참고로, 이러한 접근 방식 중 다수는 규칙 기반 (rule based) 방식입니다 (예: 질감 및 경계 특징을 기반으로 배경 추출, 색상 히스토그램 및 HOG 분류기를 사용하여 손과 배경을 구분하는 방식 등). 이로 인해 강건성 (robustness)이 그리 높지 않습니다.

예를 들어, 이러한 알고리즘들은 배경이 특이하거나, 급격한 조명 조건의 변화로 인해 피부색이 급격히 변하는 상황, 또는 추적 중인 객체가 폐쇄 (occlusion)되는 상황에서 혼란을 겪을 수 있습니다. (HCI 관점에서의 손 포즈 추정 (hand pose estimation)에 관한 리뷰 논문을 참조하세요.) 충분히 큰 데이터셋이 있다면, 신경망 (neural networks)은 다양한/열악한 조명, 노이즈가 많은 환경, 다양한 시점, 그리고 폐쇄 (occlusion)와 같은 기존 객체 추적/탐지 (object tracking/detection) 알고리즘의 과제들을 해결하고 성능이 뛰어난 모델을 훈련할 기회를 제공합니다. 실시간 추적/탐지에 사용할 때의 주요 단점은 모델이 복잡할 수 있고, 추적 전용 (tracking-only) 알고리즘에 비해 상대적으로 느리며, 양질의 데이터셋을 구축하는 비용이 상당히 많이 들 수 있다는 점입니다. 하지만 빠른 신경망 (fast neural networks)의 발전과 함께 상황이 변하고 있습니다. 또한, 이 연구 분야 전체는 사용자 정의 객체 탐지 (custom object detection)를 위한 모델 훈련 과정을 단순화하는 딥러닝 프레임워크 (예: tensorflow object detection api) 덕분에 접근성이 더욱 높아졌습니다. 더 중요한 것은, SSD, Faster R-CNN, RFCN (여기 참조를 보세요) 등과 같은 빠른 신경망 모델의 출현으로 인해 신경망이 실시간 탐지 (및 추적) 애플리케이션을 위한 매력적인 후보가 되었다는 점입니다. 이 저장소(repo)가 이를 입증할 수 있기를 바랍니다.

만약 탐지기 (detector)를 훈련하는 과정에 관심이 없다면, 제가 제공하는 사전 학습된 모델 (pretrained model)을 사용하여 손을 탐지하는 단계로 바로 넘어가셔도 됩니다. 모델을 훈련하는 것은 다단계 과정 (데이터셋 구축, 정제, 훈련/테스트 파티션 분할 및 추론 그래프 (inference graph) 생성)입니다.

이러한 부분들의 세부 사항을 가볍게 다루겠지만, TensorFlow Object Detection API를 사용하여 커스텀 객체 탐지기 (object detector)를 훈련하는 방법을 더 자세히 다루는 몇 가지 다른 튜토리얼이 있습니다 [ 여기여기 참조 ]. 처음부터 커스텀 객체 탐지기를 훈련하는 것에 관심이 있다면 해당 튜토리얼들을 살펴보는 것을 권장합니다. ## Tensorflow에서의 데이터 준비 및 네트워크 훈련 (데이터셋, 임포트, 훈련) Egohands 데이터셋 손 탐지기 (hand detector) 모델은 Egohands Dataset 데이터셋의 데이터를 사용하여 구축되었습니다. 이 데이터셋은 몇 가지 이유로 매우 유용합니다. 4,800개의 이미지에 걸쳐 손이 위치한 고품질의 픽셀 수준 주석 (pixel level annotations, >15,000개의 정답 레이블 (ground truth labels))을 포함하고 있습니다. 모든 이미지는 48개의 서로 다른 환경 (실내, 실외) 및 활동 (카드 놀이, 체스, 젠가, 퍼즐 풀기 등)에 걸쳐 1인칭 시점 (egocentric view, Google Glass)으로 촬영되었습니다. <img src="images/egohandstrain.jpg" width="100%"> Egohands 데이터셋을 사용하는 경우, 다음과 같이 인용할 수 있습니다: > Bambach, Sven, et al. "Lending a hand: Detecting hands and recognizing activities in complex egocentric interactions." Proceedings of the IEEE International Conference on Computer Vision. 2015. Egohands 데이터셋 (레이블이 지정된 데이터가 포함된 zip 파일)은 비디오 데이터가 수집된 48개의 위치 폴더 (폴더당 100개의 이미지)를 포함합니다. -- LOCATION_X -- frame_1.jpg -- frame_2.jpg ... -- frame_100.jpg -- polygons.mat // 현재 폴더의 모든 100개 이미지에 대한 주석 (annotations) 포함 -- LOCATION_Y -- frame_1.jpg -- frame_2.jpg ... -- frame_100.jpg -- polygons.mat // 현재 폴더의 모든 100개 이미지에 대한 주석 (annotations) 포함

데이터를 Tensorflow 형식으로 변환하기 Egohands 데이터셋을 Tensorflow 모델 학습에 필요한 형식(tfrecord)으로 변환하기 위해 몇 가지 초기 작업이 필요합니다. 이 저장소에는 이러한 CSV 파일들을 생성하는 데 도움이 되는 스크립트인 egohands_dataset_clean.py가 포함되어 있습니다.

  • Egohands 데이터셋을 다운로드합니다.
  • 각 파일명이 고유하도록 모든 파일의 이름을 디렉토리 이름이 포함되도록 변경합니다.
  • 데이터셋을 학습(train, 80%), 테스트(test, 10%), 평가(eval, 10%) 폴더로 분할합니다.
  • 각 폴더의 polygons.mat를 읽어 경계 상자(bounding boxes)를 생성하고, 정확성을 확인하기 위해 이를 시각화합니다 (위 이미지 참조).
  • 스크립트 실행이 완료되면, train, test, eval 세 개의 폴더를 포함하는 images 폴더가 생성됩니다. 각 폴더에는 tfrecords 생성에 사용할 수 있는 각각의 CSV 라벨 문서인 train_labels.csv, test_labels.csv가 포함되어야 합니다.

참고: Egohands 데이터셋은 손에 대해 네 가지 별도의 라벨(자신의 왼손, 자신의 오른손, 타인의 왼손, 타인의 오른손)을 제공하지만, 저의 목적상 일반적인 hand 클래스에만 관심이 있으므로 모든 학습 데이터를 hand로 라벨링합니다. 4개의 라벨을 지원하는 tfrecords를 생성하도록 데이터 준비 스크립트를 수정할 수 있습니다.

다음 단계: 데이터셋과 CSV 파일을 tfrecords로 변환합니다. 이에 대한 유용한 가이드는 여기에서 확인할 수 있습니다. 각 폴더에 대해 학습 과정에 필요한 train.record, test.record를 생성할 수 있어야 합니다.

손 탐지(hand detection) 모델 학습하기

이제 데이터셋이 구성되었으므로(그리고 tfrecords가 준비되었으므로), 다음 작업은 이를 기반으로 모델을 학습시키는 것입니다. 신경망(neural networks)의 경우, 전이 학습 (transfer learning)이라고 불리는 프로세스를 사용하여 전체 모델을 학습시키는 데 필요한 시간을 단축할 수 있습니다.

이는 관련 도메인(여기서는 이미지 분류 (image classification))에서 잘 학습된 기존 모델을 가져와, 우리의 목적에 맞게 손을 탐지하도록 마지막 레이어(layer)들을 재학습시킬 수 있음을 의미합니다. 정말 멋지죠! 신경망 (neural networks)은 때때로 학습에 몇 주 또는 몇 달이 걸릴 수 있는 수천 또는 수백만 개의 파라미터 (parameters)를 가질 수 있다는 점을 고려하면, 전이 학습 (transfer learning)은 학습 시간을 아마도 몇 시간 단위로 단축하는 데 도움을 줍니다. Tensorflow는 몇 가지 모델들을 제공하며 (model zoo), 저는 현재 가장 빠른 모델 중 하나라는 점을 고려하여 ssd_mobilenet_v1_coco 모델을 시작점으로 선택했습니다 (SSD 연구 논문을 여기서 읽어보세요). 학습 프로세스는 로컬 CPU 머신에서 수행할 수 있으며 시간이 다소 걸릴 수 있지만, (클라우드) GPU 머신에서 수행하는 것이 더 좋습니다 (제가 사용한 방식입니다). 참고로, 제 MacBook Pro(Mac의 CPU 아키텍처를 활용하기 위해 소스에서 컴파일된 Tensorflow 사용)에서 학습했을 때 얻은 최대 속도는 스텝(step)당 5초였던 반면, GPU를 사용했을 때는 스텝당 약 0.5초였습니다. 참고로 제 Mac(i7, 2.5GHz, 16GB)에서 200k 스텝을 실행하는 데는 약 12일이 걸리는 반면, GPU에서는 약 5시간이 걸립니다.

자신의 이미지로 학습하기: 레이블 CSV 파일과 이미지가 주어졌을 때 tfrecord를 생성하는 방법에 대해서는 pythonprogramming의 Harrison이 제공하는 가이드를 사용해 주세요. 이 가이드는 로컬에서 학습할 경우 학습 프로세스를 시작하는 방법도 다룹니다. [[여기] (https://pythonprogramming.net/training-custom-objects-tensorflow-object-detection-api-tutorial/)를 참조하세요]. GCP와 같은 서비스를 사용하여 클라우드에서 학습하는 경우, 여기 가이드를 확인하세요.

학습 과정이 진행됨에 따라, 전체 손실 (Total Loss, 오차)은 가능한 최소값(약 1 내외의 값)으로 감소할 것으로 기대됩니다. 전체 손실에 대한 TensorBoard 그래프를 관찰함으로써 (아래 이미지 참조), 학습 과정이 언제 완료되었는지(더 이상의 반복/단계(iterations/steps)에서도 전체 손실이 감소하지 않는 시점)에 대한 감을 잡을 수 있습니다. 저는 학습 작업을 200k 단계(약 5시간 소요) 동안 실행하였고, 전체 손실(오차) 값이 2.575인 지점에서 멈췄습니다. (돌이켜보면, 약 50k 단계에서 학습을 중단했어도 유사한 전체 손실 값을 얻었을 것입니다). TensorFlow를 사용하면 모델이 테스트 데이터에서 얼마나 잘 작동하는지 평가하는 평가(evaluation)를 동시에 실행할 수도 있습니다. 성능을 위해 흔히 사용되는 지표는 평균 정밀도 (mAP, mean Average Precision)로, 이는 정밀도-재현율 곡선 (precision-recall curve) 아래의 면적을 요약하는 데 사용되는 단일 숫자입니다. mAP는 모델이 테스트 데이터셋의 정답 바운딩 박스 (ground truth bounding box)와 최소 50% 이상의 중첩을 갖는 바운딩 박스를 얼마나 잘 생성하는지를 측정하는 척도입니다. 여기서 학습된 손 검출기 (hand detector)의 경우, mAP 값은 0.9686@0.5IOU였습니다. mAP 값은 0에서 1 사이의 범위를 가지며, 높을수록 좋습니다. <img src="images/accuracy.jpg" width="100%"> 학습이 완료되면, 학습된 추론 그래프 (inference graph, frozen_inference_graph.pb)가 내보내기(export)되어 (이를 수행하는 방법은 앞서 참조한 가이드를 확인하세요) hand_inference_graph 폴더에 저장됩니다. 이제 흥미로운 탐지를 수행할 시간입니다. ## 검출기를 사용하여 손을 탐지/추적하기 If 아직 수행하지 않으셨다면, Tensorflow 및 Tensorflow object detection API 설치에 관한 가이드를 따라주세요. 이 가이드는 TensorFlow 프레임워크를 설정하고, TensorFlow git을 클로닝하는 과정을 안내할 것입니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0