1. 들어가며: 단순한 안면 인식을 넘어 생명을 지키는 기술로
최근 자율주행 2~3단계 차량이 보급되면서 가장 주목받는 기술 중 하나가 바로 **운전자 모니터링 시스템(Driver Monitoring System, DMS)**입니다. 단순히 카메라로 얼굴을 비추는 것을 넘어, 운전자가 전방을 주시하고 있는지, 혹은 졸음으로 인해 위험한 상태인지를 실시간으로 판단해야 합니다.
저 역시 장거리 운전 시 발생할 수 있는 아찔한 상황을 방지하고자 이 프로젝트를 시작했습니다. 하지만 오픈소스 코드를 그대로 실행했을 때, 안경을 쓴 상태에서의 인식 오류나 야간 운전 시의 저조도 문제 등 실무적인 한계가 분명했습니다. 이번 포스팅에서는 이러한 한계점들을 어떻게 극복하고, 실제 차량 환경에서 쓸 만한 수준으로 로직을 고도화했는지 공유하고자 합니다.
2. 프로젝트 환경 및 하드웨어 구성
정밀한 안면 랜드마크 검출을 위해 다음과 같은 환경을 구축했습니다.
- 언어 및 라이브러리: Python 3.10, OpenCV, Dlib (68-Landmark Model), Imutils
- 하드웨어: 노트북 내장 웹캠 및 적외선(IR) 보조 조명이 탑재된 외부 웹캠
- 테스트 환경: 실제 차량 운전석과 유사한 조도 환경을 조성하고, 안경 착용 여부 및 모자 착용 여부에 따른 변수를 통제하며 데이터를 수집했습니다.
일반적인 웹캠은 야간에 무용지물이 되는 경우가 많아, 실무에서는 940nm 파장의 IR LED와 연동된 카메라를 사용하는 것이 핵심입니다. 저는 테스트 단계에서 일반 웹캠의 노이즈를 최소화하기 위해 전처리 알고리즘에 공을 들였습니다.
3. 핵심 알고리즘: EAR(Eye Aspect Ratio)의 이해와 구현
운전자의 졸음 상태를 판단하는 가장 과학적인 지표는 **눈 세로-가로 비율(EAR)**입니다. 안면 랜드마크 68개 중 양쪽 눈에 해당하는 12개의 좌표를 추출하여 아래와 같은 수식으로 계산합니다.
이 수식은 눈이 감길수록 분자가 작아져 결과값이 0에 수렴하는 원리를 이용합니다. 아래 이미지는 제가 설계한 EAR 기반의 졸음 감지 시스템 파이프라인입니다.

단순히 한 프레임에서 눈이 감겼다고 경보를 울리면 안 됩니다. 눈을 깜빡이는 정상적인 행위와 졸음으로 인해 눈을 감고 있는 행위를 구분하기 위해 **'연속된 N개의 프레임 동안 임계값 이하 유지'**라는 시간적 필터를 적용하는 것이 실무의 핵심입니다.
4. 실전 트러블슈팅: 안경 반사와 낮은 인식률 해결
프로젝트 진행 중 가장 큰 문제는 안경 착용자의 인식이었습니다. 안경테가 눈의 랜드마크를 가리거나, 렌즈에 반사된 빛이 dlib 모델을 교란했습니다.
- 해결책 1 (이미지 피라미드 고도화): cv2.resize를 통해 입력 영상을 키우고, 히스토그램 평활화(CLAHE)를 적용하여 안경 뒤에 가려진 눈의 윤곽선을 강조했습니다.
- 해결책 2 (임계값 동적 설정): 사람마다 눈의 크기가 다르므로, 프로그램 시작 후 초기 5초간 사용자의 평소 눈 크기를 샘플링하여 **개인화된 임계값(Threshold)**을 실시간으로 설정하도록 로직을 수정했습니다.
아래 이미지는 실제 전처리를 통해 안면 랜드마크가 정교하게 추출되는 과정입니다.

5. 최종 구현 결과 및 경보 시스템 작동
모든 로직을 통합하여 실시간 모니터링 결과물을 도출했습니다. 운전자가 눈을 감은 상태가 약 1.5초(약 45프레임) 이상 지속되면 시스템은 즉시 'DROWSINESS ALERT!' 문구를 화면에 띄우고 경고음을 발생시킵니다.
[실제 구현 결과 화면]

테스트 결과, 주간 환경에서는 98% 이상의 정확도를 보였으며, 안경 착용 시에도 동적 임계값 덕분에 오작동을 현저히 줄일 수 있었습니다. 터미널 창에서는 실시간으로 현재의 EAR 값과 누적된 졸음 프레임 수가 출력되어 시스템의 판단 근거를 명확히 보여줍니다.
6. 마치며: DMS 기술의 확장성
이번 프로젝트를 통해 기초적인 영상 처리 기술이 어떻게 실제 안전 시스템으로 발전할 수 있는지 확인했습니다. 현재는 눈 깜빡임에만 집중하고 있지만, 향후에는 **입 벌림 감지(하품 인식)**와 **고개 꺽임 각도(Head Pose Estimation)**를 결합하여 더욱 정교한 주의 상태 분석 모델로 발전시킬 계획입니다.
특히 Raspberry Pi나 Jetson Nano와 같은 엣지 컴퓨팅 장비에 이 모델을 이식한다면, 저비용으로도 강력한 차량용 안전 보조 장치를 제작할 수 있을 것입니다.
'Computer Vision + Python > 산업 응용 & 비즈니스활용 (전문가)' 카테고리의 다른 글
| 실전 Python 보안 프로젝트: 이미지 속 위험물(흉기/금지물) 탐지 시스템 구축과 오탐(False Positive) 극복기 (0) | 2026.01.03 |
|---|---|
| 이론을 넘어선 실전: Python 차량 번호 인식(LPR) 및 위반 감지 시스템 구축기 (0) | 2026.01.02 |
| 실전 Python 산업용 비전: 공정 라인 결함 검사(Auto-Inspection) 시스템 구축과 '미세 결함' 탐지 노하우 (0) | 2025.12.30 |
| Python 실전 의료 영상 분석: CT/MRI DICOM 데이터 처리와 윈도잉(Windowing) 최적화 노하우 (0) | 2025.12.29 |
| Python으로 의료 영상(Medical Imaging) 처리 – CT/MRI 이미지 분석 기초 (0) | 2025.12.25 |