이 글은 제 졸업작품 내용을 담은 글입니다.
제가 어릴 때 상상했던 대학생의 졸업작품과는 거리가 조금은 먼.. 허접한 작품이지만 열심히 만들었기에 아카이빙 차원에서 글로 남깁니다. 보고서 형태의 문서(명칭은 졸업논문인..)와 코드로 남아있긴 하지만.. 그냥 에필로그처럼 전반적인 내용을 글로 남겨보고 싶었습니다.
웹캠 영상을 이용한 시선 추적 알고리즘 기반 컴퓨터 화면제어
졸업작품을 제작해야겠다는 마음이 들었을 때
제가 진로로 희망하는 서버 개발 위주 프로젝트도 좋겠지만,
꼭 만들어보고 싶은 것에 도전해보고 싶었습니다.
그냥 만들어보고 싶은 것도 아니고, 완전 fit하게 만들고 싶은 것을 만들어보고 싶었어요.
그땐 딱 웹캠만으로 시선을 추적하여 마우스를 대체하는 프로그램을 만들고 싶었습니다.
(유튜브보다가 광고 건너뛰기 누르기 귀찮아서 떠올렸습니다.)
웹캠 수준의 카메라만 있다면 마우스나 리모콘을 대체할 수 있다는게 미쳤지 않나요?
손 까딱 안하고 티비 볼 수 있습니다.
이번 프로젝트의 목표: 실제로 내가 유튜브 볼 때 사용할 만큼의 성능
(이정도로 결과물 성능이 나오진 않았지만... 정말 정말 많이 부족합니다...but, 졸업작품은 끝나도 프로젝트는 죽지 않았다🔥)
각설하고 설명 좀 해보겠습니다.
전체적인 흐름은 아래 그림과 같습니다.
1. 웹캠으로 시선정보를 얻고
2. 시선정보로 화면에서 유저가 응시하는 좌표 예측
프로그램은 mac기반 status bar app으로 제작하였습니다.
이런 식으로 프로그램 실행 시, 상태바에 표시되며 learn mode(패턴 학습을 모드. 아래 설명 나옵니다.), predict mode( 시선 추적으로 클릭이벤트 발생하는 모드) 전환하는 버튼이나 나의 카메라 창과 함께 시선보는 기능 만들었습니다.
또한, 실시간 나의 화면에서의 응시 좌표도 빨간 점으로 표시했습니다. (이 부분이.. 생각보다 힘들었어요... cv창이나 그런 것 없이 딱 내가 쓰고 있는 창에서 빨간 점만 보이게 하는 것...)
👁️ 1. 웹캠으로 시선 정보 얻기
OpenFace라는 오픈소스 라이브러리를 사용했습니다. OpenFace는 얼굴 랜드마크 추출, 시선 방향 추적, 머리 자세 추정, 얼굴 동작 단위 인식 등을 지원합니다.
OpenFace를 통해 사용자의 눈 좌표 위치, 시선 벡터와 이 시선벡터의 x축 y축 회전각도 정보를 웹캠으로 부터 얻었습니다.
또한 화면과 얼굴 사이의 거리는 사용자로부터 입력 받도록 하였습니다.
👁️ 2. 시선 정보로 사용자가 응시하는 화면의 좌표 매핑하기
화면과 얼굴 평면이 z좌표의 평행 이동을 통해 동일한 평면으로 종복되는 상태임을 가정합니다.
우선 시선벡터의 화면 교차점과 눈 사이의 거리부터 구해줍니다.
이후엔 화면 교차점을 구해줍니다.
이후엔 화면 중심을 기점으로 화면 교차점과 눈 좌표 차이를 반영하여 매핑하였습니다.
이렇게 기본적으로 매핑 후 실행하면 아래와 같습니다.
현재는 좌표 움직임이 많이 떨리고 이동이 부드럽지 않습니다. 특히, 눈 깜빡일 때 상하 이동이 크게 반영되었습니다.
👁️ 3. 화면 좌표 값 보정
칼만 필터로 좌표의 떨림이나 눈 깜빡이는 경우 상하 움직임을 완화해줍니다.
칼만 필터는 시스템의 상태를 추정하고 관측값에 포함된 노이즈를 줄이는 알고리즘입니다.
확실히 부드러운 움직임을 보입니다.
다만, 화면의 사각 모서리까지 움직임이 잘 도달하지 않는 경향이 있었습니다.
아까 화면 중심을 기분으로 화면 교차점과 눈 좌표 차이를 scaling 만큼 반영했었습니다.
이 부분에서 scaling을 화면중심 기준 방향 별로 개별적으로 사용합니다.
각 scaling은 (방향 별 기울기) * (화면 중심으로부터 좌표가 떨어진 거리) + intercept로 사용합니다.
이 값은 클릭이벤트가 발생할 때마다 클릭 좌표와 예측 좌표를 비교하며 보정합니다.
사각까지 잘 이동합니다.
👁️ 4. 클릭 이벤트 발생시키기
*아래 부분 클릭 인터페이스가 발표 때 교수님이 피드백해주시기도 했고, 저도 맘에 안드는 구조이긴합니다만.. 일단 현 상태는 아래와 같이 작동합니다.
응시좌표가 특정 범위 내에서 1.5초 이상 고정될 경우
해당 영역에 YES / NO 아이콘이 생성됩니다.
이 아이콘 기준 왼쪽으로 시선을 움직이면 클릭됩니다.
👁️ 5. 클릭 패턴 파악할 수 있을지도..?
완벽하게 시선만 의존하여 클릭하기엔, 정확한 지점을 계속 응시하는 것에 눈의 피로가 발생했습니다.
또한, 약간의 좌표 오차가 있어도 잘못된 클릭이벤트가 발생합니다...
굉장히 까다롭죠...
저는 클릭은 이용하는 서비스, 웹, 인터페이스(?) 등등마다 클릭 전 시선의 움직임 패턴이 있을 것이 있을 것이라고 생각했습니다.
그래서 아주 간단한 순차데이터 머신러닝 모델 HMM을 적용해봅니다.
* 여기에도 조금 아쉬운 부분은 많지만.. 개선여지가 아주 많아 보인다는 긍정적인 평가를 내려보겠습니다.
HMM(Hidden Markov Model)은 순차 데이터 패턴을 학습하고 예측하는데 사용되는 통계 모델입니다. HMM을 적용하여 시선 움직임 패턴을 학습하고, 정확한 클릭이벤트를 발생시켜보겠습니다.
10 x 10으로 화면 영역을 분할하여, 각각의 전이행렬과 관측행렬을 갖도록 하였습니다. 클릭 이벤트에 대한 최신 10개의 화면 좌표를 학습하였고, 화면 좌표는 각도 별 방향 값을 0~7로 대입하여 사용하였습니다.
마우스를 이용해서 먼저 시선 움직임과 이를 통한 클릭이벤트를 학습시킵니다.
위 움짤은 44번 파일은 위 -> 아래의 시선 움직임을 학습시키고, 45번은 오른쪽 -> 왼쪽의 시선 움직임을 학습시킨 모습입니다.
클릭하고 싶은 좌표로의 정확한 이동이 없어도 이전 시선 움직임을 통해 원하는 곳에 클릭 이벤트가 발생됩니다.
사실 이 부분에서 제가 다른 모델 중 HMM을 도입 이유가 적은 데이터로도 사용할 수 있기 때문이었는데, 생각보다 많은 데이터가 필요했습니다... 저는 웹 별로 사용자가 자주 쓰는 웹에 대한 클릭 패턴을 각자 학습시켜, 저장해두고 사용하는 그림을 생각했는데....
👁️ 결론
결론적으로 제가 목표로 삼은 유튜브 마우스 없이 사용하기는 만족시키지 못했습니다.😢
정확히 말하자면 가능은 하다만... 눈의 피로감이 쌓이는... 이럴거면 마우스 꺼내들고 싶은... 그런 ...
다만, 어느정도 크기의 클릭 버튼에 대한 클릭은 나쁘지 않게 사용 가능합니다.
하지만.. 여기서 또 .. 마우스 클릭과 비교하자면... 마우스는... 물리적인 마우스 이동으로 아주 즉각적으로... 클릭이 가능하기 때문에.. 속도 차이가 꽤나 있다는 것이 생각치 못한 아쉬움이었습니다. 시선 기반 클릭은 1.5초 간 응시해야 아이콘이 생기고, 이후 yes 선택해야 클릭이 발생하기 때문에... 좀 느렸어요.
다만, 제가 만든 웹캠만을 이용한 클릭 이벤트는 물리적 제약 없이 클릭할 수 있는 대안적 입력 방식으로서의 가능성을 보여줍니다. (논문에 쓴 문장 그대로 쓰기 ㅎㅎ) 이 부분에서 저는 의미가 있다고 생각합니다. 또한, 추후 클릭 전 시선의 패턴을 좀더 잘 활용하면 마우스급의 클릭 시간도 충분히 도달할 수 있을 것이라 생각하고요.
아쉬운 점(이용 시 사용자의 위치가 제한적인 점, HMM, 인터페이스 등등)이 많아서 끝내기 진심으로 너무나도 아쉬웠지만, 일단은 졸업작품을 제출해야했기에 한 번의 쉼표를 찍으며 정리해보았습니다. 엄청 간단하게 적었지만 제 코딩 스킬이나 지식 부족으로 많은 시간이 투자되었고... 많은 깨달음이 있었습니다. 특히, 지도 교수님이 꾸준히 졸업작품 스터디를 진행하며 피드백해주시지 않았다면 정말 졸업 못할 뻔하여 너무 감사드리는 마음입니다.
약간 미래에 휴대폰이나 노트북 같은 무거운 하드웨어 없이
그냥 아이언맨에서 쓰는 컴퓨터 처럼 허공에 동동 뜨는 화면(?)을 늘 상상하는데
여기 시선으로 화면 제어..
캬~~ 느낌 아시죠?
재밌었습니다 ㅎㅎ (라고 미화)
'AI' 카테고리의 다른 글
은닉 마르코프 모델 HMM (Hidden Markov Model) (0) | 2024.09.08 |
---|