얼굴 인식을 이용한 마우스 제어
Github: face-mouse-control
논문: 얼굴 인식과 Pyautogui 마우스 제어 기반의 비접촉식 입력 기법
동기
외할아버지는 사고로 양쪽 팔을 잃으셨다. 그래서 문득 “마우스 없이 컴퓨터를 조작할 수 있을까?”라는 생각이 들었다. 신체적 장애가 있거나 손을 사용할 수 없는 특수한 환경에서 마우스를 대체할 인터페이스가 필요했다. 특히 최근 많은 정보가 웹을 기반으로 제공되고 있기 때문에 웹 접근성에 대한 고민도 필요하다.
물론 마우스를 대체할 수 있는 보조 도구들이 존재한다. 대표적으로 eye tracker가 있다. 하지만 모두 상업 서비스로 장비를 구매하거나 소프트웨어를 사용하기 위해 비싼 비용을 지불해야 한다. 따라서 누구나 사용할 수 있는 오픈소스 소프트웨어가 있으면 좋겠다는 생각이 들었다.
학교에서 교수-학생 협력(Co-Deep learning) 프로젝트를 진행하고 있었고, 팀을 꾸려 대체 마우스 인터페이스
를 연구하기 시작했다.
최종 목표
처음부터 상용화 가능한 수준이 목표였다. 일상의 불편함을 해결하는 프로젝트이기 때문에 이론에만 머문다면 의미가 없다. 따라서 정확도는 물론 적은 자원으로 빠른 속도를 내야 한다. 구체적인 조건은 다음과 같다.
- Intel-i5 저전력 CPU 수준에서 작동한다.
- 외장 GPU가 없는 CPU 환경에서도 실행 가능하다.
- 8G RAM의 노트북에서 실행 가능하다.
- 웹캠이 설치된 노트북 외 다른 장비가 필요하지 않다.
- 얼굴 인식 성공률이 90%를 넘어야 한다.
- 위 조건에서 평균 30 FPS 이상으로 영상 정보를 처리한다.
- 사용자의 신체적 차이를 고려해 맞춤 설정이 가능하도록 GUI 환경을 제공한다.
- 웹 접근성을 높이기 위한 부가기능을 제공한다.
구현 목표
얼굴 주시방향을 따라 마우스가 이동하며, 눈 깜빡임으로 마우스 좌클릭을 실행한다. 작은 목표로 나누면 아래와 같다.
- 카메라로 프레임을 읽어와 얼굴 랜드마크를 인식한다.
- 랜드마크를 통해 사용자가 주시하고 있는 방향을 계산한다.
- 랜드마크를 통해 눈 깜빡임을 포착하고 클릭을 할 지 판단한다.
- 위 정보를 바탕으로 마우스 커서를 제어한다.
얼굴 인식 모델
FaceMesh
가 가장 준수한 성능을 보였다. FaceMesh
는 실시간 얼굴 인식에 특화된 모델로 빠른 처리 속도가 특징이다. HOG
, SSD
등 다른 모델과 비교했을 때, 속도와 정확도 모두 뛰어난 모습을 보였다.
동일한 문제를 계산하는데 소요된 시간이다.
Model | runtime(s) |
---|---|
FaceMesh | 1.12 |
HOG | 13.62 |
SSD | 3.86 |
자세한 분석은 논문의 3.2.1. 사용한 모델들
에 기록했다.
얼굴 방향 계산
얼굴 방향 계산은 Perspective-n-Point
문제이다. FaceMesh
는 3차원 얼굴 랜드마크 좌표를 반환한다. 따라서 카메라 왜곡이 없다면, 이미지 2차원 좌표와 3차원 좌표로 얼굴 회전벡터를 구할 수 있다.
눈 깜빡임 인식
눈의 가로, 세로 비율을 측정해 눈 깜빡임을 인식했다. “Real-Time Eye Blink Detection using Facial Landmarks(2016)”에 따라 가로 비율 대비 세로 비율이 감소하면 눈 깜빡임으로 처리했다. 하지만 눈을 무의식적으로 깜빡이는 경우 클릭으로 처리하면 안 된다. 따라서 일정 프레임 이상 감고 있어야 클릭으로 이어진다.
입력 구현
Pyautogui를 이용해 모든 조작을 구현했다. Pyautogui 는 마우스 조작, 키보드 조작이 가능하다. 이를 통해 클릭, 이동, 확대/ 축소 기능을 구현했다.
Tkinter로 사이드바에 확대/ 축소 등 버튼을 구현했다. “상지장애인을 위한 시선 인터페이스에서의 객체 확대 및 음성 명령 인터페이스 개발(2021)”에 따르면 웹 화면을 140% 확대했을 때 가장 조작하기 편하다고 한다. 따라서 화면 확대/ 축소 기능을 버튼으로 구현했다.
사용자 피드백
다양한 연령대의 사용자 10명을 모집해 간단한 과제를 해결하게 했다. 예를 들어, 구글 검색(클릭), 웹툰 시청(스크롤 및 확대) 등이 있다. 완료한 참가자는 불편하거나 개선할 점을 설문지에 작성했다.
주요 내용은 마우스가 바로 정지하지 않는 문제였다. 사용자가 마우스를 움직이기 위해 좌/우측을 주시한다. 이후 정지하기 위해 순간 정면을 바라본다. 이때 고개를 정면으로 돌리는 순간에도 여전히 좌/우측을 바라보기 때문에 마우스가 계속 이동한다. 즉, 마우스가 바로 정지하지 않고 미끄러진다는 것이다.
해결책으로 변화률 계산을 추가했다. 순간 빠르게 정면을 주시할 경우 즉시 마우스를 정지한다. 다시 말해, 각도의 급격한 감소를 발견하면 즉시 정지 명령을 실행한다.
그외 수정 사항은 사이드바 버튼 배열 개선, 처리 속도 측정을 이용한 프레임 드랍 감소 등이 있다.
전문가 피드백
감사하게도 학교 도움으로 현업 전문가분들께 피드백 받는 기회를 얻었다. 우리 팀이 프로젝트에 대해 발표하고 전문가분과 질의응답하는 시간을 가졌다. 피드백은 아래 사진으로 첨부했다.
Palette팀의 얼굴 인식 활용 대체 입력 프로젝트가 매우 잘 수행되었습니다. 특히, 기존의 연구나 상품들이 제공하지 못했던 여러 기법들을 머신러닝과 딥러닝 기술을 잘 활용해 저렴한 비용으로 사용 가능하도록 새로운 방식을 잘 제안하였다고 판단됩니다. 시간과 비용의 관점에서 기존의 Pre-train된 머신러닝 모델들을 잘 활용하고, dlib과 OpenCV 패키지들 잘 활용하였습니다. 한걸음 더 나아가, 이후에는 직접 여러 face landmark recognition 모델을 활용해 인식률을 높이고, 이후 피드백을 받은 부분을 조금 더 보완해 나간다면, 상품화와 실제 서비스로 내 놓아도 손색이 없을 정도로 훌륭한 서비스가 될 것으로 예상됩니다. 끝으로, 이런 과정과 진행을 모두 github repo에 공개해 이후에도 지속적인 발전이 가능한 오픈소스로 꾸준하고 지속적인 관심을 받을 것으로 기대됩니다. - Microsoft 김대우 이사
수정 (April, 2025)
사용한 라이브러리의 버전 지원 문제로 기존에 구현한 Python 3.8 환경에서는 사용이 불가했다. 따라서 Python 3.12를 기반으로 패키지 버전을 업데이트하고 일부 로직도 수정했다. 더불어 Windows 11과 MacOS를 모두 호환할 수 있도록 UI 렌더링 코드를 수정했다.
느낀 점
막연하게 머리 속으로 생각해왔던 기능을 구현해 보고 동작하는 모습을 보니 뿌듯했다. 실시간 영상 정보 처리 방법이나 얼굴 객체 검출 등 작업을 수행하며 실력이 발전했다. 무엇보다 팀 단위로 작업한 프로젝트이기 때문에 ‘it works on my computer‘ 문제가 발생하지 않기 위해 환경 구축으로 버전을 통일하고, Github으로 버전을 관리하는 등 협업 경험을 쌓을 수 있었다. 생각보다 블로그가 도움이 되었다. Conda나 OpenCV 글도 프로젝트 당시 팀원에게 공유하기 위해 작성한 글이다. 알고 있는 내용을 구구절절 설명하는 것보다 블로그 링크를 공유하는 편이 효율적이고 편리했다. 다음에 실시간 이미지 처리를 하게 되면 이번에 배운 내용이 도움이 될 것 같다.