brunch

You can make anything
by writing

C.S.Lewis

by TOBESOFT Ai Lab Jul 28. 2021

Hand Gesture Recognition (1)

다양한 Hand Gesture 인식 알고리즘

차량 내 제스처 인식


운전을 하면서 공조기나 네비 등을 조작해 본 적이 있는가?

운전 중에는 잠깐이라도 한눈팔면 사고로 이어질 수 있다. 그렇기 때문에 자동차 업체들은 운전자가 최대한 운전에만 집중할 수 있도록 다양한 기술을 개발하고 있다. 계기판에 다양한 정보를 알려주는 디지털 클러스터, 전면 유리창에 내비게이션 정보를 비춰주는 헤드업 디스플레이(HUD), 운전 중 오디오나 내비게이션이 등을 직접 조작하지 않고 특정 손 모양이나 모션을 취해 차량의 다양한 기능을 동작시켜 주는 제스처 인식 기술 등이 대표적이다.


이 중 제스처 인식 시스템의 개발 과정과 직면했던 문제와 고민들, 그리고 이를 해결했던 내용을 공유하려고 한다.




제스처 인식에 필요한 기술은?


제스처 인식을 하기 위해 무엇이 필요한지 생각해봤다.

우선 이미지에서 손의 위치를 찾아야 한다. (Object Detection)

그리고 그 손이 어떤 모양을 하고 있는지 구분할 수 있어야 한다. (Classification)


입력 이미지에서 손의 위치를 찾고 어떤 제스처인지 분류


제스처 인식 문제를 해결할 수 있는 방법은 다양하다. 순수 영상처리 기법만 사용하거나 딥러닝 모델을 사용해서 해결할 수 있다. 인식 시스템의 규모(연산량)에 따라 구축 비용이 달라지기 때문에 사용될 환경과 목적에 맞게 적정 성능을 낼 수 있는 효율적인 방법으로 시스템을 설계해야 한다.




영상처리 기법으로 제스처를 인식해보자


우선 손의 위치를 찾기 위해 단순한(연산량이 적은) 방법인 영상처리 기법부터 적용해 보았다. 딥러닝 모델처럼 학습을 위한 데이터도 필요 없고 이미 OpenCV 라이브러리에 영상처리 관련 다양한 알고리즘이 구현되어 있어 빠르게 조합해서 사용할 수 있기 때문이다.


OpenCV를 이용한 손의 위치 파악


손 이미지에서 다양한 영상처리 알고리즘(HSV, Blur, Binarization 등)을 적용해 최대한 깔끔한 마스크를 얻어냈다. 이렇게 얻어낸 마스크를 이용해 손의 윤곽을 찾고 특징이 될만한 점들(손 윤곽 모서리, 움푹 들어간 곳)을 찾았다.


결과 (클릭하면 전체 움직임을 볼 수 있다.)


위 이미지(gif)는 손의 위치를 잘 찾는 것처럼 보인다. 

하지만 잘 생각해봐야 되는 게 위의 이미지는 노이즈가 거의 없는 흰색 배경에서의 결과다. 만약 피부색이 아닌 장갑을 착용한 상태라면? 피부색과 비슷한 색이 배경으로 존재한다면? 조명이 어두운 상태라면? 손의 위치를 잘 찾지 못할 가능성이 크다. 그리고 제스처(손 모양)을 판별하는데 사용할 특징이 될만한 점들(노란점)이 불안정(나타났다가 사라졌다가..) 해 보인다. 시간을 더 투자한다면 다양한 상황을 세분화해서 규정하고 각 상황에 맞는 알고리즘을 적용해서 좀 더 성능이 좋아지도록 고도화할 수도 있다. 하지만 상황별 특징들을 찾아내보고 알맞는 설정값을 정해준다는 것은 결코 쉬운 일이 아니다.  


이러한 일들을 비교적 쉽게 해결해 주는 것이 딥러닝이다. 딥러닝 모델을 활용하면 이미지에서 다양한 특징들을 추출하고 문제를 해결해 줄 수 있는 최적의 특징들을 찾고 학습한다. 사용자는 상황에 맞는 모델과 다양한 환경에서 수집된 양질의 데이터만 있으면 된다.

   


딥러닝 모델로 제스처를 인식해보자


영상처리 기법을 이용해 손의 위치를 찾고 제스처를 인식할 경우 개발자가 다양한 환경 변화를 고려하여 여러 알고리즘으로 대응해야 된다. 하지만 낮은 수준에서 높은 수준의 중요 특징을 스스로 찾아 학습하는 딥러닝 모델을 사용하면 학습한 모델 만으로 다양한 환경 변화에 강인한 시스템을 만들 수 있다. 단, 위에 언급했다시피 다양한 환경이 포함된 수많은 양질의 데이터가 필요하다. 


제스처 인식 프로세스


제스처 인식을 위한 프로세스는 위 이미지와 같다. 물체 인식 모델을 통해 손의 위치를 파악하고 이진화를 한다. 그리고 이진화한 이미지를 제스처 분류 모델을 통해 미리 정한 제스처 종류를 판별한다.

손의 위치를 파악하기 위해 물체인식에 많이 쓰이는 SSD(SIngle Shot Multibox Detector)를 사용했고 SSD를 좀 더 가볍게 만들기 위해 앞단 특징 추출 부분에 VGG가 아닌 Mobilnet을 적용했다.


출처: EgoHands dataset (http://vision.soic.indiana.edu/projects/egohands/)

 

SSD 학습에는 EgoHands 데이터셋을 사용했다. 아래의 이미지는 SSD를 이용해 손의 위치를 찾아본 결과인데 위치가 파악되는 경우(좌)와 잘 안되는 경우(우)를 나누어 보았다.

인식 잘 안되는 경우 EgoHands 데이터셋을 보면 그 이유를 유추해 볼 수 있다. EgoHands 데이터셋의 경우 2명의 사람이 구글 글레스를 착용하고 퍼즐, 카드, 젠가, 체스 등의 게임을 하는 영상을 촬영해서 만든 것이다. 사람의 눈 위치에서 촬영된 영상이기 때문에 손등에 대한 데이터가 많고 다양한 손 모양과 각도에 대한 데이터가 부족하다. 이 문제는 추가적으로 부족한 손 모양, 각도에 대한 데이터를 만들어 학습하면 해결할 수 있다. 


SSD를 이용한 손 위치 파악 결과 결과 (클릭하면 전체 움직임을 볼 수 있다.)


손의 위치를 파악한 다음 어떤 제스처(손 모양)인지 파악해야 된다. 제스처 판별에는 간단한 CNN 모델을 이용한 분류기를 만들어 사용했다. 제스처 종류는 우선 간단하게 4가지(Ok, Peace, Punch, Stop)로 선정했고 학습 데이터는 앞전에 만든 SSD를 사용해 제스처 종류별로 얻어진 이미지를 수집해 사용했다.


제스처 종류


4가지의 제스처 종류는 위 이미지와 같다. 다양한 환경에서 정확한 인식을 위해 손의 각도와 방향 등 바꾸며 데이터를 생성했다. 배경 및 색상에 대한 영향을 줄이고 손의 윤곽을 부각 시키기 위해 이진화하였고 제스처 분류기 입력으로 사용했다. 


제스처 판별 결과 (클릭하면 전체 움직임을 볼 수 있다.)


노이즈가 적은 경우 제스처 판별이 잘 되는 것을 확인할 수 있었다. 하지만 노이즈가 많은 경우에는 결과가 좋지 못했다. 아래 이미지를 보면 이진화했을 때 손 뒤에 있는 가방의 윤곽이 노이즈로 작용하는 것을 확인할 수 있다. 


노이즈가 많은 경우의 제스처 판별 결과(클릭하면 전체 움직임을 볼 수 있다.)



결론


손의 위치를 파악하는 SSD 경우 잘 안되는 경우의 데이터를 추가 확보하면 비교적 쉽게 해결할 수 있다. 하지만 제스처를 판별할 때 사용된 이진화 이미지의 경우 배경에 노이즈가 많으면 오 분류하는 경우가 빈번하게 발생했고 손의 윤곽만 남기고 나머지 노이즈를 최대한 제거하기에는 고려해야 될 것들이 많다고 판단했다.

무엇보다 현재의 방법으로는 제스처(손 모양)가 복잡해지고 종류가 많아지면 분류하기 더 힘들 것이다. 또한 정적인 손 모양 제스처가 아닌 손의 모션 인식한다고 했을 때 손가락들의 섬세한 움직임을 파악하기 어려울 것이다. 그러므로 새로운 방법으로 접근해야 된다는 생각을 했다.



새로운 방법이 필요하다.


노이즈에 강인하며 손가락 하나하나의 움직임까지 섬세하게 인식할 수 있는 방법이 필요하다. 진행했던 방법도 어느 정도 결과는 나오지만 상용화를 하기 위해서는 한참 부족하고 한계가 있다고 판단했다.

원점에서 새로운 방법을 고민하고 찾아봤다. 그러던 중 현재 필요로 하는 정말 딱 맞는 방법을 찾게 됐다.


손의 관절 포인트 검출 결과 (클릭하면 전체 움직임을 볼 수 있다.)


바로 손의 관절을 찾는 것이다. 이렇게 손의 관절을 딥러닝 모델을 통해 찾게 되면 손의 움직임 정보를 훨씬 정밀하게 얻을 수 있다. 그리고 이 관절 포인트들의 움직임을 가지고 제스처 종류를 판별하면 된다. 

손뿐만 아니라 사람의 몸, 동물, 옷 등 다양한 분야에서 응용해 사용할 수 있는 확장 가능성이 높은 기술이다. 

다음 글에서 손 관절 포인트 검출하고 어떻게 제스처를 분류한지 알아보자.

작가의 이전글 [DACON] 신용카드 사용자 연체 예측 경진대회
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari