Etc

4년의 마무리 졸업작품(동작인식 키오스크 제작)

taehwan 2012. 12. 27. 08:12

 안녕하세요. 개발자가 꿈인 태환의 블로그 운영자 권태환입니다. 2012년 4학년 졸업을 위한 졸업 작품 프로젝트를 진행하였습니다.  저희 프로젝트와 관련하여 꼭 글을 남기고 싶었고, 마무리 역시 잘 되었다고 생각합니다. 이렇게 남겨두는 것 역시 포트폴리오와도 같기 때문에 해당 프로젝트를 진행하면서 작성한 문서들을 기반으로 글을 남깁니다. 프로젝트를 진행한 사람은 총 3명입니다. 이 3명은 같은 동아리 선후배 사이이고, 모두 4학년 졸업작품을 위해서 이번 프로젝트를 설계, 구현하였습니다. 해당 프로젝트는 "교내에서 진행하는 캡스톤 경진대회""2012년 공학교육페스티벌 International Session"에 참여하였습니다.

 해당 프로젝트는 오픈소스로 GitHub에 등록되어있고, 해당 동영상 역시 Youtube에 등록되어 있습니다.

 GitHub 주소 : https://github.com/DLUG/TouchlessKiosk


팀원

 단국대학교 DLUG 소속 : 권태환, 정재훈, 김대송


팀 소개

 DLUG는 Dankook Linux User Group의 약자로 교내 중앙동아리의 동아리 이름입니다. 해당 동아리에 참여하고 있는 3명이 모여서 프로젝트를 기획 개발하게 되어 동아리 이름으로 팀명을 사용하였습니다. DLUG는 Linux를 사용하는 학생들의 모임이고, 이번 프로젝트 역시 Ubuntu 12.04 버전을 사용하여 개발되었습니다.


프로젝트 기획내용

 2009년에 TED에 소개되었던 동영상이 있습니다. 제목은 "Pranav Mistry: The thrilling potential of SixthSense technology"입니다.

  http://www.ted.com/talks/pranav_mistry_the_thrilling_potential_of_sixthsense_technology.html

 이 프로젝트는 현실과 가상을 하나로 합치는 SixthSense 기술에 대한 동영상입니다. 현실의 사용자의 움직임을 그대로 디지털로 전달해 사용자의 행동 패턴에 따라서 사진을 찍고, 모니터가 없이도 게임을하고, 글을 쓰거나 거꾸로 정보를 제공 받을 수 있는 시스템입니다. 이런 프로젝트를 기반으로 저희 프로젝트인 "동작인식 키오스크"가 나오게 되었습니다.

 키오스크에 새로운 방식의 사용자 인터페이스를 구현하여 좀 더 편리하게 접근할 수 있도록 개선 및 개발해보기로 하였습니다.

 일단 작은 화면이 아닌 큰 화면을 요구하였습니다. 기존의 작은 화면에서의 정보제공은 눈으로 보기도 힘들고, 글씨도 작아 간혹 눈이 좋지 않으신 분들이 보기에는 힘들 수 있기에 큰 화면을 선택하였고, 큰 화면을 선택함으로써 사용자에 제공할 수 있는 정보의 양이 많아지게 되었습니다. 큰 화면이다보니 다양한 정보를 한 화면에 담을 수 있는 장점이 되었지만, 사용자의 직접 터치를 제공할 수는 없게 되었습니다. 그래서 손동작을 인식하여 컨트롤 할 수 있는 인터페이스가 해법이 될 수 있을 것이라 생각하여 진행하였습니다. 거기에 메뉴를 직접 접근할 수 있도록 음성인식을 추가하여 프로젝트를 진행하게 되었습니다.


컨셉 사진

키오스크 란?

 원래는 옥외에 설치된 간이 판매대, 소형 매점등을 말한다고 합니다. 이게 정보통신에서는 터치스크린 방식의 정보 전달 시스템을 말한다고 합니다.

 자세한 내용은 "두산백과" - 네이버 지식백과를 링크합니다.

  http://terms.naver.com/entry.nhn?cid=200000000&docId=1221301&mobile&categoryId=200000728


동작 원리

 저희가 제작한 키오스크는 큰 화면을 사용하고 있기 때문에 기존의 직접터치를 사용할 수는 없었습니다. 그래서 2가지 입력방식인 손동작과 음성인식을 추가하게되었습니다.

 1차적으로 사용자에게 음성인식을 통한 메뉴를 제공하게되는데, 이 때 음성인식은 Google의 Chrome 브라우저에서 동작하는 HTML 5 확장으로 제공되는 음성인식서비스를 사용하여, 음성을 텍스트로 변환하는 방식으로 사용하였습니다.

 2차적으로 동작인식을 사용하게됩니다. 이 동작인식은 웹캡 3개를 사용하게되는데 가운데의 웹캠은 사용자의 눈의 위치를 잡게되고, 나머지 2개의 웹캠이 사용자의 손을 인식하게 됩니다. 손동작에 2개를 사용하게된 이유는 오차를 줄이기 위해서 사용하게되었습니다. 눈과 손끝의 위치를 인지하게되는데 사용자가 단순히 지시하듯이 가르키게되면 가르키는 곳의 위치를 계산해내어 커서가 움직이게 됩니다.

 다수의 키오스크를 설치할 수 있다고 가정하여, 중앙 서버를 별도로 운영하고 다수의 키오스크에 제공될 데이터를 집중관리하는 시스템으로 구현하였습니다.(저희가 만든 실제품은 단독으로 동작하고있습니다.


동작인식 키오스크의 장점

 음성인식으로 안내를 받을 수 있는데 별다른 행동 없이 음성을 통해 원하는 메뉴를 즉시 제공 받을 수 있습니다. 하지만 음성인식 결과를 받지 못하는 경우가 발생할 수 있습니다. 이 경우를 대비하여 사용자가 원하는 메뉴를 기존의 직접 터치가 아닌, 큰 화면을 직접 가르키는 식의 행동을 통해 메뉴를 제공받을 수 있습니다.

 손동작과 음성인식을 제공하기 때문에 화면의 제약을 받지 않습니다. 큰 화면을 제공함으로써 사용자는 더 편하게 메뉴를 제공받을 수 있고, 안내시스템을 이용할 수 있게 되었습니다.


결과 화면

 2012년 공학교육페스티벌 International Session 참가 중


 제작한 시스템의 구성입니다. 본체와, 빔 프로젝트, 양쪽 끝에 카메라 2대와 음성 출력을 위한 스피커, 가운데에는 적외선 램프가 있습니다. 손동작 인식을 좀 더 효과적으로 잡을 수 있도록 하기위해 사용하였고, 양쪽 웹캠은 적외선을 탐지할 수 있도록 수정한 카메라입니다.


 키오스크 답게 광고 페이지를.. HTML 5로 제작


메뉴를 선택하는 화면 - HTML 5로 제작


프로토타입 동영상


최종 완성본 동영상


졸업작품을 완성하고나서... (by Dae-Song. K.)

 영상처리를 하기에 앞서 Reference를 정해야 했습니다. Reference의 종류를 잘 몰라 찾아보았는데 종류가 크게 SharperCV, EmguCV, OpenCV 이렇게 세 가지가 있었습니다. 이 중 SharperCV는 개발이 중단되었다하여 배제하였고, EmguCV와 OpenCV 중에 EmguCV는 C#을 기반으로 하는 Reference였으며 OpenCV는 C언어 또는 C++을 기반으로 하는 Reference였습니다. 그래서 저희는 조금이라도 더 익숙한 OpenCV로 선택하게 되었습니다. OpenCV도 1.x 버전은 C언어 기반이고 2.x 버전은 C++언어 기반이었습니다. 또한 저희는 처리량을 향상시키기 위해 CUDA Library를 사용할 계획이었기 때문에 CUDA Library와 호환이 되는 2.x 버전을 사용하였습니다. 적당히 아무거나 선택해서 사용하지 않고 저희가 필요하고 할 수 있는 것에 따라 다양한 선택지가 있다는 점이 마음에 들었습니다.

 얼굴 인식은 Haarcascade 알고리즘을 사용하였습니다. Haarcascade는 형태를 단순 비교 하는 알고리즘입니다. 얼굴은 형태가 뚜렷하고 얼굴 구조가 특징이 잘 잡혀있기 때문에 잘 인식하였고 얼굴은 잘 인식이 되었기에 손 역시 쉽게 적용할 수 있으리라 생각하였지만 손은 손바닥을 편 상태에서는 잘 인식하였으나 손가락 하나만을 인식시킬 때는 잘 되지 않았습니다. 잘 인식하지 않은 이유를 잘 몰라서 시간도 오래 걸리고 힘도 많이 들었습니다. 이때가 고생도 제일 많이 한 것 같습니다. 

 큰 문제는 두 가지가 있었는데 하나는 빛의 밝기 때문이고 다른 하나는 손가락을 하나 인식시키는 것에 대한 어려움이었습니다. 빛의 밝기 문제는 형광등의 세기나 햇빛 등에 많은 영향을 받았습니다. 카메라 자체에서 빛을 인식해 자동으로 밝기를 조절 하는 것도 문제였습니다. 그래서 가시광선은 필터를 이용하여 차단하고 적외선을 이용하여 보다 더 잘 인식될 수 있도록 하였습니다. 적외선도 램프를 사용하는 방법도 어느 정도 세기가 적당한지 알아내는 것도 쉽지 않았습니다. 

 손가락을 하나 인식시키는 것은 얼굴과 같이 트레이닝을 시켜서 인식시키면 대부분의 물체들을 손가락으로 인식할 수밖에 없다는 것을 알았고 그래서 배경을 일단 지우고 손만 남겨 인식하기로 하였는데 제공하는 알고리즘이 CUDA를 지원하지 않았습니다. 저희는 CUDA를 사용할 계획이었기 때문에 알고리즘을 직접 만들어야 했고 알고리즘을 만드는 일이 2주 정도나 걸려서 시간도 많이 할애되었고 상당히 힘든 작업이었습니다. 또 CUDA에서 사용 가능 할 수 있는 함수가 있고 안 되는 함수가 있어 CUDA를 지원하는 함수를 찾아내어 하는 점도 시간이 어느 정도 필요하였습니다.

 음성인식은 현재 오로지 Chrome 브라우저에서만 제공하고 있었기에 Chrome에서만 사용 가능한 HTML5문법을 사용하여 구현했습니다. 구현 자체는 어렵지 않았으나 인식률을 좀 더 높이기 위해 좀 더 좋은 방법을 찾아야할 것 같습니다.

 컨텐츠는 별도의 서버에 저장하여 독립적으로 저장하도록 하였습니다. 음성인식을 이용해야했고 조금 더 UI를 유연하고 쉽게 만들 수 있도록 Web을 이용하여 UI를 구성하였습니다. 이렇게 독립적으로 두었더니 이 부분은 관리하기도 편해졌고 필요할 때 수정하기도 편했습니다.

 이렇게 하나하나 단계를 만들어서 하다 보니 저희가 만들려는 프로그램의 구조도 더 세분화해서 알게 되는 점이 있어 더 좋았던 것 같습니다. 만드는 동안에는 한 번에 되는 것이 적어 고생만 하는 것 같아서 힘들었지만 제작이 어느 정도 끝나고 보니 결과가 생각한 만큼은 나온 것 같아서 보람도 느꼈습니다. 다음에 언제 또 영상 처리를 하게 될지는 모르겠지만 만약 그 때가 오면 지금 했던 일들이 많이 생각나고 또 도움도 될 것 같습니다.


제 후기

 이런 시스템을 개발함으로써 공부도 많이 했습니다. 손동작인식을 위한 알고리즘, 웹을 통해 컨텐츠를 제공해주기 위한 방법 등 학교에서 배우지 못한 부분들을 추가적으로 공부하고, 직접 운영하는 시스템까지 만들 수 있었습니다. 대학원에서나 할 법한 프로젝트 내용을 가지고, 대학생인 3명이서 시도를 하고, 논문을 찾고, 필요한 지식을 쌓아가며 진행한 프로젝트입니다. 카메라를 어떻게 하면 손을 더 잘 인식할 수 있을까 연구도 하고, 직접 웹캠을 수정하기도 하였습니다. 이번 프로젝트에 사용된 OS는 리눅스입니다. 리눅스를 택한 가장 큰 이유는 리눅스 동아리라는 점입니다. 이런 리눅스에서도 이런프로그램이 동작하고, 사용할 수 있다는 걸 보여주고 싶었고, 직접 개발도 할 수 있는 좋은 기회였습니다.

 교내 컴퓨터과 졸업작품의 90% 정도가 안드로이드로 앱을 만들어 졸업할려고 하는 사람들이 많고, 지금도 많이 있습니다. 앱을 만들면 편하긴 하지만 저희 팀은 처음부터 안드로이드를 생각하지 않고 시작하였습니다. 가장큰 이유는 3명모두 마음이 맞았고 적극적이였기 때문입니다. 같은 나이때의 졸업예정자, 학생들도 하는 그런 프로젝트를 저희도 생각해본 것이죠. 쉬운거 찾기보단 어려운것도 도전해보고 구현할 수 있는 어느정도 능력을 갖춘 3명이기도 합니다. 이런 친구들끼리 모여 만들었고, 같이 밤을 지새우기도하고, 함께 놀땐 놀고, 골머리 썩어가면서 만들어봤습니다. 위 "졸업작품을 완성하고나서..."라는 글을 보시면 아실 수 있으실 겁니다. 대단하지는 않습니다. 해보자라는 오기하나로 시작했으니깐요. 누구나 할 수 있다고 생각합니다.

 작년과 올 초 학원을 다니면서 프로젝트를 진행하려고 할 때마다 들었던 말이 있습니다. 그냥 제출하는 것마다 어려우니 하지말라라는 말만 들었습니다. 어려운거 몰라서 제출한건 없었습니다. 직접 구현해보고 싶었을 뿐... 구현능력이 떨어지면 그건 제 스스로가 판단해야 할 문제니깐요. 하지만 이번 졸업작품을 진행하면서는 담당교수님께 "니네가 할 수 있는게 아니니 하지말고 다른거해라" 또는 "쉬운거 하고 취업이나 해" 등의 이야기는 듣지 못했습니다. 한번해보라는 의미일 수도 있겠지만 하지말라라는 말을 듣지 못했다는 것에 대해 큰 도움이 되었고, 졸업작품을 진행하는 크나큰 원동력이 되었다고 생각합니다. 좀 더 열심히 할 걸 이라는 욕심도 생기고, 지난 시간이 아쉽기도 합니다. 너무 개으르지 않았나라는 생각도 들구요. 그래도 믿음을 주셨던 분들덕에 최종 졸업작품을 완성하고, "교내 캡스톤 경진대회""2012년 공학교육페스티벌 International Session"에도 참여할 수 있었던것 같습니다. 나아가 취업하는데도 영향을 주었구요^^; 졸작을 하면서 느꼈던 짧은 생각을 나름 정리해보았습니다. 읽어주셔서 감사합니다.


개발 환경

 Ubuntu Linux 12.04, Eclipse, Vim


개발 언어

 손동작 및 얼굴 인식 : C++ (OpenCV 2.4.2, CUDA 4.2 Library)

 컨텐츠 : HTML5, JavaScript (jQuery Framewrok)