7. DMS : 운전자 상태 인식 시스템

그림1

이미지 참조 : 운전자 모니터링 시스템

✅ DMS(Driver Monitoring System)

운전자 모니터링 시스템(DMS, Driver Monitoring System)은 AI 기반의 센서 및 알고리즘을 활용하여 운전자의 상태를 실시간으로 감지하고 분석하는 기술입니다. 이 시스템은 운전 중 졸음, 주의 분산, 감정 상태, 시선 방향, 머리 위치, 얼굴 표정 등을 인식하여 운전자의 안전을 확보하는 데 목적이 있습니다.

⚪ DMS(Driver Monitoring System) 예시

● 졸음 운전 감지 시, 경고음 및 진동 시트로 운전자 깨우기 → 사고 예방
● 운전자 주의 분산(전방 미주시, 스마트폰 응시 등) 감지 → 시각·청각 경고
● 운전 중 음주 또는 약물 복용 징후 탐지 → 시동 제한 또는 경고 전송
● 장시간 운전 감지 시, 휴식 권유 메시지 제공 → 피로 누적 방지
● 감정 분석 기반, 스트레스 상태 판단 후 주행 보조 조정 (예: 민감한 브레이크 → 완화)

🛠 주요 구성 요소
1. AI 비전 기술 카메라와 딥러닝 기반 얼굴 인식/시선 추적 알고리즘 사용.
2. 생체 신호 분석: 심박수, 눈 깜빡임 속도, 졸음 감지 등 생리학적 데이터 활용.
3. 운전자 행동 분석: 핸들 조작, 반응 시간, 시선 이동 등을 통한 피로도 및 주의력 상태 분석.
4.경고 시스템: 위험 상황이 감지되면 운전자에게 시각, 청각, 진동 등의 방식으로 경고.

🎯 주요목적
● 졸음운전, 부주의 운전 등 운전자 과실로 인한 사고 예방
● 자율주행 차량과의 인터페이스 역할 수행 (운전자 개입 필요 시점 파악)
● 교통 안전 향상과 보험 비용 절감 효과

💡 예시를 통한 이해

📍 DMS 시나리오:
졸음 운전 감지 시스템
운전자의 눈 깜빡임 빈도, 안구 움직임, 머리 기울기 등을 AI가 분석하여 졸음 징후를 감지합니다. 졸음이 감지되면 차량은 경고음을 울리고 시트를 진동시켜 운전자의 주의를 환기시키며, 일부 차량은 자동으로 감속하거나 정차합니다.

주의 분산 경고 시스템
운전자가 전방을 응시하지 않거나 스마트폰을 응시하는 행동이 감지되면, 시스템은 경고음을 발생시키고 계기판에 시각적 경고를 제공합니다. 딥러닝 기반 안면 및 시선 추적 기술을 활용해 높은 정확도로 주의 상태를 실시간 분석합니다.

음주·약물 운전 탐지 시스템
AI는 운전자의 안색, 눈동자 움직임, 음성 떨림, 반응 속도 등을 통해 이상 징후를 감지합니다. 감지된 경우, 시동이 제한되거나 관제 시스템에 경고가 전송되어 제3자 개입을 유도할 수 있습니다..

피로 누적 경고 및 휴식 권유 시스템
장시간 운전 및 잦은 차량 제동 등의 패턴을 분석하여 피로 상태를 예측합니다. 일정 기준을 넘어서면 차량은 "휴식이 필요합니다"라는 메시지를 송출하고, 휴게소 안내 기능이 활성화됩니다.

감정 기반 운전자 지원 시스템
AI는 운전자의 표정, 목소리 톤, 호흡 패턴 등을 분석하여 스트레스나 분노 상태를 감지합니다. 이때 차량은 운전 보조 시스템을 보다 부드럽게 조정하거나, 편안한 음악을 추천해 감정 완화를 유도합니다.

1️⃣ 졸음을 감지 하는 방법

그림1

* 졸음 감지 시스템


👁️‍🗨️ EAR란?

EAR(Eye Aspect Ratio)는 눈의 세로 길이 / 가로 길이 비율을 말하며, 눈이 감기면 세로 길이는 작아지고, EAR 값은 작아집니다.즉, 눈이 일정 이상 감긴 상태를 의미하며 이 값을 너무 낮게 하면 졸음을 감지 할 수 없고, 너무 높이면 자주 졸음으로 잘못 판단합니다. 이렇게 EAR을 사용하여 운전자의 졸음 상태를 확인 할 수 있습니다.

2️⃣ 졸음 감지 시스템 예제

PC 에 연결 되어진 웹캠(WebCam)을 사용자의 얼굴 중 눈을 감지 하여, 현재 눈을 감은 상태인지, 뜬 상태인지를 구분하여
사용자의 졸음 상태를 확인 하는 예제 입니다.

그림1

* 본 프로그램은 다른 예제에 비해 Run Module(F5) 실행 후 시작까지 다소 시간이 걸릴 수 있습니다.


if ear < EAR_THRESH:
#EAR이 0.32보다 작아지면, 눈을 감은 것으로 판단
#참고: 일반적으로 0.25~0.35 사이가 많이 쓰입니다 (사람마다 다르기 때문)

EAR_CONSEC_FRAMES = 15
#15프레임 동안 계속 눈을 감고 있어야 졸음으로 간주
#즉, EAR이 15프레임 연속 0.32보다 작아야 졸음 경고 발생

* 이 예제는 mediapipe모듈을 사용합니다. mediapipe 모듈이 없다면 pip installmediapipe를 사용하여 설치 해주세요

* 또한 이 예제는 PC에 연결 되어진 웹캠(WebCam)을 사용합니다. 만약 PC에 웹캠이 설치 되어 있지 않다면,
웹캠을 연결해주세요


📊 졸음 필터링

깜빡임(순간 눈 감기)를 졸음으로 착각하지 않도록 하는 필터링 해야 합니다.만약 카메라가 30fps 기준 (1초에 30프레임)이라면, 약 0.5초(15프레임) 이상 눈을 감고 있어야 졸음으로 인식되어 집니다.

📌 전체 판단 흐름 요약

1. 매 프레임마다 EAR 값 계산
2. EAR이 0.32 미만이면 → 눈 감은 걸로 간주 → counter += 1
3. EAR이 다시 커지면 → counter 초기화
4. counter가 15프레임 연속 유지되면 → 졸음 상태로 판단 → 경고 출력 + 이미지 저장

📂 졸음 감지 시 캡쳐하여 바탕화면 저장

이 시스템은 카메라를 통해 운전자의 얼굴과 눈을 실시간으로 분석합니다.졸음이 감지되면, 현재 화면(프레임)을 바탕화면에 자동 저장합니다.

3️⃣ 전체 판단 흐름 요약

👁️ 1. 눈 감김 감지 기준
- 사람의 눈이 감기면, 눈의 세로 길이가 줄어듭니다.
- 이를 수치화한 것이 EAR(Eye Aspect Ratio) 입니다.
- EAR 값이 0.31보다 작을 때, 눈이 감겼다고 판단합니다.

⏱️ 2. 일정 시간 동안 감겼는지 확인
- 카메라는 초당 30프레임(30fps)으로 작동합니다.
- 눈 감김 상태가 15프레임 이상(약 0.5초 이상) 지속될 때만,
- 깜빡임이 아닌 졸음으로 판단합니다.

⚠️ 3. 졸음 상태로 판단되면…
- 상태 표시가 "⚠️ 졸음 감지!"로 바뀝니다.
- 프레임 상단에 "DROWSINESS ALERT!"라는 경고 문구가 뜹니다.
- 그리고 현재 화면이 자동으로 바탕화면에 저장됩니다.

💾 4. 사진 저장 방식
- 이미지 저장은 save_capture() 함수에서 이루어집니다.
- 저장 조건은 최근 저장 이후 2초가 지나야 합니다. (중복 저장 방지)

4️⃣ DMS 기반 졸음 운전 감지 시스템 시나리오

🚘 DMS 기반 졸음 운전 감지 시스템
Drowsiness Detection via AI-driven Driver Monitoring = 시선 추적 + 생체 패턴 분석 + AI 경고 판단 시스템

🔧핵심 기술

1. 👁️‍🗨️ 시선 추적 및 얼굴 인식 시스템
Eye Gaze & Head Pose Monitoring
· NIR(근적외선) 카메라 기반 얼굴·눈동자 추적
· 깜빡임 빈도, 눈꺼풀 개폐 속도, 고개 각도 추적
· 전방 주시 여부 판단 및 비정상 자세 탐지

2. 📡 생체 반응 분석 센서
Bio-signal Monitoring via Seat & Steering Sensors
· 운전자의 심박수, 호흡, 땀 분비량 등 측정
· 피로 축적 시 생리 신호 패턴 변화 감지
· 운전대 및 시트에 탑재된 센서 기반 측정

3. 🤖 졸음 상태 판단 AI
AI-based Drowsiness Risk Classifier
· 입력된 시선 및 생체 데이터를 딥러닝 모델로 분석
· CNN + LSTM 기반 실시간 상태 분류
· 졸음 확률이 일정 수치 초과 시, 긴급 경고 시스템 작동

💡 예시를 통한 이해

📍 DMS 시나리오: 졸음 감지 및 정지
1. 운전 중인 차량에서, 운전자의 눈 깜빡임이 평소보다 느려집니다.
2 시선이 흐트러지며 고개가 아래로 처집니다
3. AI는 이 데이터를 실시간 분석하여 졸음 상태로 판단합니다.
4. 차량은 다음과 같은 조치를 수행 합니다.
5. LED를 켜고 경고음을 울림
6. 계기판에 “졸음 감지. 를 표시합니다.
7. 졸음 상태를 캡쳐하여 디바이스에 저장 합니다.

5️⃣ DMS 기반 졸음 운전 감지 시스템

이제 DMS 졸음 시뮬레이터에 주미 연결 코드를 적용하여 아래 프로그램을 실행 해보겠습니다.


그림4

* 본 프로그램은 다른 예제에 비해 Run Module(F5) 실행 후 시작까지 다소 시간이 걸릴 수 있습니다.


#연결 할 주미의 IP 를 작성해주세요
zumi_ip = "192.168.0.82"
zumiAI = ZumiAI()
zumiAI.connect(zumi_ip)

#카메라를 계속 호출하면
self.update_frame()

#zumi에게 forward_infinite(1) 명령과 충돌 하기 때문에
#아래와 같은 형식으로 별도의 스레드에서 실행 시킵니다.
threading.Thread(target=lambda : zumiAI.forward_infinite(1), daemon=True).start()


6️⃣ 프로그램 요약 및 버튼 설명


🟩정상 상태 🟨얼굴 미탐지 🟥졸음 감지!

웹캠을 통하여 운전자의 EAR을 감지하고 정상 상태인지, 얼굴을 탐지 할 수 없는 상태인지, 졸음 상태인지를 확인 합니다. 만약 졸음 상태라면, 주행하던 주미를 정지 시키고 졸음 상태를 캡쳐하여 디바이스(=PC 바탕화면)에 저장 합니다.


🟦Zumi 연결됨 ⬜ 주미 AI 연결

주미 AI가 정상적으로 연결 되었다면, 파란색으로 표시 해주고, 만약 연결 되지 못했다면 회색 배경으로 표시 됩니다.


🟦IP 표시 ⬜ Unconnecter

주미 AI가 정상적으로 연결 되었다면, 연결 된 주미 AI의 IP를 표시 해주고, 만약 연결 되지 못했다면 회색 배경으로 Unconnected를 표시 됩니다.


🟥강제 졸음 감지

웹캠(Webcam)을 통해서 졸음을 실시간으로 감지 하고 있지만, 감지 값이 이상하거나 강제로 주미 AI를 멈춰야 할 때엔, 해당 버튼을 클릭하여 강제로 멈출 수도 있습니다.


🟩주행하기

해당 버튼을 누르면 주미AI 가 앞으로 1의 속도로 무한히 전진 합니다. 만약 웹캠(Webcam)으로 졸음이 감지 되거나 강제 졸음감지 버튼을 누르면 주행을 멈춥니다.


⬛ 참고하기

아래 이미지를 인쇄하여, 눈을 뜬 사람 (정상 상태) , 눈을 감은 사람 (졸림 상태) 를 대신하여 사용 할 수 있습니다.

그림5

* 본 이미지는 AI로 제작되어진 이미지 입니다.