Shine's dev log

[python] 아이트래킹 및 신원확인 프로그램 본문

기타

[python] 아이트래킹 및 신원확인 프로그램

dong1 2021. 9. 5. 01:14

1. 개요

 

졸업 프로젝트로 온라인 시험 부정행위 방지에 관한 개발을 했었는데, 내가 맡은 부분은 아래와 같다.

 

 1) 응시자의 눈동자위치와 고개 회전 정도를 분석하여 (아이트래킹) 부정행위를 막는 기능

 2) 응시자의 신분증 상의 얼굴과 실제 웹캠 상의 얼굴을 비교하여 대리시험을 막는 기능

 

하나의 exe 파일로 만들때 용이하게 하기 위해 하나의 파이썬 스크립트로 개발하였다.

 

코드는 아래에서 확인할 수 있다.

 

https://github.com/godeastone/Eyetracking

 

 

 

2. 구현

 

 1) 아이트래킹 구현

 

아이트래킹 정보는 크게 네가지 기능을 수행한다.

 

첫번째 기능응시자의 눈동자의 회전 정도를 파악하는 기능이다.

 

해당 기능을 구현하기 위해 dlib 라이브러리와 OpenCV 라이브러리를 활용하여 응시자 얼굴의 눈을 탐지하였으며, 탐지된 눈을 이등분하여 오른쪽과 왼쪽에 포함된 흰자의 비율을 파악하였다.

 

해당 비율을 통해 응시자의 눈동자가 어느 한쪽으로 치우쳐졌는지 파악하였으며, 일정 기준 이상 벗어났을 경우 경고 메시지를 출력하도록 구현하였다. 해당 과정을 구현한 수도 코드는 아래에 있다.

 

아이트래킹 정보 수집 코드 - 눈동자 회전 정도 파악

 

 

두번째 기능응시자의 고개 회전 정도를 파악하는 기능이다.

 

앞서 파악한 응시자의 얼굴에서 코 끝과 양 입술 끝을 파악하여 선으로 연결하였다. 연결한 두 선의 길이 비율을 계산한 뒤, 해당 비율을 통해 응시자의 고개가 어느정도 회전하였는지 파악하였다.

 

일정 기준 이상 벗어났을 경우 경고 메시지를 출력하도록 구현하였으며, 해당 과정을 구현한 수도 코드는 아래에 있다.

 

아이트래킹 정보 수집 코드 – 고개 회전 정도 파악

 

앞서 설명한 눈동자와 고개의 회전 정도를 파악하기 위해서는 기준을 설정해야 한다.

일반적으로 웹캠의 가운데를 바라볼 경우를 기준으로 세울 수 있지만, 처음부터 웹캠이 비스듬하게 설치된 경우나, 모니터가 응시자의 시선 가운데 있지 않은 경우 기준을 웹캠의 가운데로 하면 여러 문제가 생길 수 있다.

 

따라서 응시자가 Argos 프로그램을 실행하고 일정 기간동안 측정된 눈동자와 고개의 회전 정도를 기준으로 설정하게 된다. 기준을 설정하는 과정을 구현한 수도 코드는 아래와 같다.

 

아이트래킹 정보 수집 코드 - 기준 설정

 

 

세번째 기능은 응시자의 웹캠에 두명 이상의 사용자가 감지되었을 경우 경고 메시지를 전송하는 기능이다.

 

시험 도중에 두명 이상의 얼굴이 감지되었을 경우, 모여서 시험을 응시하는 행위로 의심할 수 있다. dlib의 얼굴 감지 함수를 통해 얼굴을 인식하였으며, 만약 두개 이상의 얼굴이 감지되었을 경우, 경고 메시지를 표시하며, 특정 시간동안 해당 기능은 비활성화된다. 해당 과정을 구현한 수도코드는 아래와 같다.

 

아이트래킹 정보 수집 코드 - 얼굴 두개 감지

 

 

마지막 네번째 기능응시자의 웹캠에 응시자의 얼굴이 일정시간 이상 감지되지 않았을 경우 경고 메시지를 전송하는 기능이다. 시험 도중에 일정시간 이상 얼굴이 감지되지 않을 경우, 컨닝페이퍼를 보거나, 무단으로 시험장을 이탈하는 행위를 의심할 수 있다. 해당 기능 역시 dlib의 얼굴 감지 함수를 통해 얼굴을 인식하였으며, 만약 특정 시간 이상 얼굴이 감지되지 않았을 경우, 경고 메시지를 표시한다. 해당 과정을 구현한 수도코드는 아래와 같다.

 

아이트래킹 정보 수집 코드 - 얼굴 감지 안됨

 

 

 

 2) 신원인증 구현

 

신원인증 기능은 응시자의 대리시험 등을 방지하기 위한 기능이다.

 

해당 기능을 구현하기 위해 앞서 아이트래킹 과정에서 인식한 웹캠 상의 얼굴과 신분증 사진 데이터를 바탕으로 face_recognition 라이브러리를 활용하였다.

 

해당 라이브러리를 통해 인식된 두 얼굴 사이의 distance를 숫자로 나타낼 수 있는데, 해당 값이 1에 가까울수록 서로 얼굴이 다르다는 의미이다. 신원 인증을 진행하는 과정 도중에 얼굴이 2개 감지될 경우, 신원인증이 자동으로 시작되며, distance 값을 기준으로 신원이 일치할 확률을 표시하였다. 해당 코드를 구현한 수도코드는 아래 그림과 같다.

 

신원 인증 정보 수집 코드

 

 

 

3. 테스트

 

 

참고로 우리팀의 최종 구현 목표는, 위의 기능을 통해 획득한 다양한 응시자 관련 정보를 아래 그림과 같이, 관리자에게 웹페이지 형식으로 나타내주는 기능이었다.

 

 

 

 

4. 참고자료

 

아이트래킹 - https://pysource.com/2019/01/04/eye-motion-tracking-opencv-with-python/

face recognition - https://github.com/ageitgey/face_recognition

openCV - https://pysource.com/2019/01/07/eye-detection-gaze-controlled-keyboard-with-python-and-opencv-p-1/