본문 바로가기

Arduino/응용 프로젝트(1학기)

Face-Tracking 기술 구현하기

작성자 : 김경만

아두이노와 프로세싱을 이용하여 Face-Tracking 기술을 구현해 보자 


1. 개요


최근 얼굴인식 기술이 많이 발전하면서  얼굴인식 기술을 응용한 기술도 많이 나오고 있습니다. 그 중 하나가 Face-Tracking 이라는 기술로 얼굴을 추적하는 기술인데 CCTV에 많이 사용되고 있습니다. 움직이지 않는 CCTV보다 Face-Tracking 이 가능한 CCTV가 더욱 많은 범위를 효율적으로 보여줄 수 있으며 얼굴을 정확히 화면에 담을 수 있기 때문인데요. 이렇게 응용이 되고 있는 Face-Tracking 기술을 직접 구현해보고 또한 딱딱하게 카메라만 있는 것이 아닌 로봇을 만들어 사람을 처다 보는 것 처럼 만든다면 더욱 의미 있을 것 같아 제작하게 되었습니다.


준비물


아두이노 기판, 브래드 보드, 서보모터 2개, 브래킷 2개

여기서 잠깐, 서보모터란?

서보모터란 세 가지 연결부위를 가지고 있는 모터로 하나는 GND(접지), 다른 하나는 5V, 나머지 하나는 입력신호가 들어오는 전선으로 사용하며 입력된 값만큼 모터를 특정 방향으로 돌리는 모터입니다. 여기에서는 카메라와 연결하여 아두이노의 신호값을 받아서 카메라를 회전시키는데 이용됩니다.

여기서 잠깐, 브래킷이란?


브래킷이란 기기류를 매달기 위해 벽이나 구조체 등에서 돌출시킨 지지 구조재입니다. 여기서는 카메라를 매달아서 카메라의 방향을 조종하기 위해 필요한 부품입니다.

 

얼굴을 추적하여 카메라의 방향을 돌리기 위해서는 얼굴을 추적하는 기술과 그것을 통한 카메라의 회전이 있어야 합니다. 전체적인 메커니즘은 얼굴을 인식하여 얼굴이 항상 카메라의 중앙에 오도록 카메라를 회전시키는 것입니다. 얼굴을 추적하는 기술은 소프트웨어를 통해, 카메라의 회전은 하드웨어를 통해 구현할 것입니다.

2. Breadboard & Schematic

① 아두이노와 서보모터의 연결

얼굴을 추적하여 따라가기 위해서는 모터를 돌려야 하는 값을 아두이노가 컴퓨터에게 받아서 모터에게 보내주어야 합니다. 아래에 보이는 사진은 서보모터 2개와 아두이노를 브래드 보드를 이용하여 연결한 회로도이며 빨간색 선은 5V에, 검정색 선은 GND(접지)에, 노란색선은 입력핀에 연결시켜야 하며 노란색선이 바로 모터를 어느만큼 돌릴지 정해주는 입력값들이 보내지는 통로입니다.


② 서보모터와 웹캠의 연결

얼굴을 따라가기 위해서는 서보모터에 브래킷을 달고, 브래킷에 카메라를 부탁하는 형태를 만들어야 합니다. 이때, 얼굴은 카메라의 화면상에서 움직이기 때문에 x축 방향과 y축 방향 모두의 방향을 제어해 주어야 합니다. 그래서 서보모터를 2개 사용하는 것이며 하나는 x축, 하나는 y축을 맡게 됩니다. 브래킷과 서보모터는 나사를 통해 연결하였으며 브래킷과 카메라는 철사를 이용하여 연결하였습니다.


          <브래킷과 서보모터의 연결부분>                               <브래킷과 카메라의 연결부분>

3. Code     

소프트웨어의 역할은 카메라를 통해 입력받은 영상값에서 얼굴을 인식하고, 얼굴의 좌표를 통해 카메라가 회전해야하는 모터의 값을 계산하여 모터에 전달해주는 것입니다. 프로세싱과 아두이노, 그리고 Open CV 라는 세가지 프로그램을 사용하는데 Open CV는 영상을 처리해주는 프로그램으로 이미 알려진 프로그램입니다. 프로세싱은 이 프로그램을 통해 영상에서 얼굴을 찾고, 좌표를 계산하여 얼굴이 중앙에 오도록 바꾸어야 할 모터값을 아두이노에게 시리얼 통신을 이용하여 보내줍니다. 아두이노는 프로세싱에게 받은 모터값을 연결된 서보모터에게 전달해 주는 역할을 합니다.

① Open CV 설치 및 설정

먼저 Open CV 1.0 버전을 다운받으셔야 합니다. http://opencv.org 여기서 최신버전이 아닌 1.0 버전을 다운받으세요. 첨부파일을 보면 XML문서파일 2개가 있을것입니다. 이 XML문서 두개는 얼굴을 인식하게 해주는 기본 소스입니다. 즉, Open CV는 영상의 정보를 받아들여 이 XML문서에 있는 값에 해당하는지를 판단하여 얼굴인지 아닌지를 판단해 주는것입니다. XML문서에는 많은 수치가 쓰여져 있습니다. Open CV를 설치하셨다면 환경변수를 설정해주어야 하며 내컴퓨터의 Processing 파일 안에 Open CV 파일을 넣어주어야 합니다. 


haarcascade_frontalface_alt.xml


haarcascade_profileface.xml




② 프로세싱 소프트웨어

 

 


③ 아두이노 소프트 웨어


 

 

 

4. 완성 사진 

                                                               <완성된 사진>

                                            <로봇의 형태로 만든 것>

5. Video

사용한 웹캠이 자동 초점조절 기능이 있어서 초점을 맞출 때 얼굴을 잡지 못해 따라오지 못하는 문제가 발생했습니다. 


6. 결론

구현한 하드웨어에서 웹캠 부분에 로봇의 머리를 연결하고 밑의 서보모터 부분에 몸통 부분을 연결함으로써 몸통은 가만히  있고 머리만 사람을 향해 돌아가는 로봇을 만들었습니다. 연결방식을 웹캠은 로봇의 입에 끼운 후 스카치테이프로 고정시켰고 밑의 모터는 몸통부분에 크기에 맞는 구멍을 뚫어 끼웠습니다. 몸통의 아랫부분은 무게중심을 위해 넓적한 판으로 했습니다. 또한 얼굴이 중앙에 오도록 일정한 값만큼 계속 회전하는 알고리즘을 사용했었는데 얼굴을 빠르게 따라오지 못하는 모습을 보였습니다. 하지만 너무 많은 회전을 주게 되면 얼굴이 가만히 있을 때 왔다갔다 크게 흔드는 현상이 있었습이다. 그래서 저는 얼굴의 좌표와 화면의 중앙 좌표가 많이 차이날 수록 많이 모터값을 바꾸는 오차에 비례한 P제어를 사용했으며 위 동영상이 P제어를 사용한 동영상입니다. 학교 정보시간에 배운 PID제어에서 P제어를 제 프로젝트에 사용하여 더 좋은 효과를 내었기 때문에 기분이 좋았으며 카메라를 다루는 작업이라 신기하기도 하면서 재미있었습니다. 

 


 

출처 <서보모터 사진 : G마켓 - 서보모터 검색 http://goo.gl/fwXUmz
       <브래킷 사진 : https://www.sparkfun.com/tutorials/304>
       <서보모터와 아두이노 회로도 : https://www.sparkfun.com/tutorials/304>