Monitoramento facial inteligente para prevenΓ§Γ£o de acidentes causados por fadiga e distraΓ§Γ£o ao volante, usando visΓ£o computacional e anΓ‘lise biomΓ©trica em tempo real.
Criei o Sleep Recognition System para necessidade pessoal: viagens longas de carro me dΓ£o sono. SoluΓ§Γ£o completa de seguranΓ§a viΓ‘ria que monitora continuamente o estado de atenΓ§Γ£o do motorista via webcam. Utilizando o modelo MediaPipe Face Landmarker (468 pontos faciais 3D), o sistema calcula mΓ©tricas biomΓ©tricas clΓnicas em cada frame e dispara alertas multimodais (visual + sonoro) antes que um acidente ocorra.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β PIPELINE DE DETECΓΓO β
β β
β Webcam βββΆ MediaPipe βββΆ EAR / MAR / Yaw / Pitch β
β (468 pts) βΌ βΌ βΌ β
β SonolΓͺncia Bocejo DistraΓ§Γ£o β
β βΌ βΌ βΌ β
β Alarme Aviso Alerta + LOG β
β βΌ β
β CSV βββΆ Dashboard Web βββΆ Report β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Mede a abertura dos olhos comparando distΓ’ncias verticais e horizontais dos marcos faciais:
p2 p3
p1 ββββββββββββ p4
p6 p5
EAR alto β olhos abertos β motorista atento
EAR < 0.22 por > 1.5s β ALERTA DE SONOLΓNCIA
Mede a abertura da boca usando pontos das comissuras e lΓ‘bios:
m2 m3
m1 ββββββββββ m5
m8 m6
m7 m4
MAR > 0.60 por > 1.5s β BOCEJO / FADIGA ACUMULADA
Estima rotaΓ§Γ£o horizontal (Yaw) e vertical (Pitch) sem gimbal via razΓ£o de distΓ’ncias:
Yaw = (d_narizβolho_dir - d_narizβolho_esq) / (soma total)
Pitch = (d_narizβtesta - d_queixoβnariz) / (soma total)
|Yaw| > 0.33 β CabeΓ§a virada lateralmente
Pitch > 0.12 β CabeΓ§a baixa (celular)
Pitch < -0.38 β CabeΓ§a erguida demais
flowchart TD
A([π¬ InΓcio]) --> B[Inicializar MediaPipe\nFace Landmarker]
B --> C[Abrir Webcam\nOpenCV]
C --> D[Iniciar Flask Server\nThread separada :55800]
D --> E{{"π Loop de Captura"}}
E --> F[Capturar Frame]
F --> G{Rosto\nDetectado?}
G -->|NΓO| H[Resetar todos os timers\nExibir banner vermelho]
H --> E
G -->|SIM| I[Calcular EAR\nOlho esquerdo + direito]
I --> J[Calcular MAR\nAbertura da boca]
J --> K[Estimar Yaw + Pitch\nPosiΓ§Γ£o da cabeΓ§a]
K --> L{EAR < 0.22?}
L -->|NΓO| L1[Reset timer\nsonolΓͺncia]
L -->|SIM| L2{Timer β₯ 1.5s?}
L2 -->|SIM| L3[π΄ ALERTA SONOLΓNCIA\nAlarme contΓnuo\n900Hz pulsado]
L2 -->|NΓO| L4[Iniciar/continuar\ntimer]
K --> M{MAR > 0.60?}
M -->|NΓO| M1[Reset timer bocejo]
M -->|SIM| M2{Timer β₯ 1.5s?}
M2 -->|SIM| M3[π AVISO BOCEJO\nTom duplo\n480Hz/640Hz]
M2 -->|NΓO| M4[Iniciar/continuar\ntimer]
K --> N{"|Yaw| > 0.33\nou Pitch fora?"}
N -->|NΓO| N1[Reset timer\ndistraΓ§Γ£o]
N -->|SIM| N2{Timer β₯ 1.5s?}
N2 -->|SIM| N3[π£ ALERTA DISTRAΓΓO\nPulso rΓ‘pido\n650Hz/850Hz]
N2 -->|NΓO| N4[Iniciar/continuar\ntimer]
L3 --> O[Gravar evento\nCSV + contador]
M3 --> O
N3 --> O
O --> P[Atualizar shared_state\nAPI Flask /api/state]
P --> Q[Renderizar HUD\nEAR + MAR + Tracker + Alertas]
Q --> R[Exibir frame\ncv2.imshow]
R --> S{Tecla 'q'\npressionada?}
S -->|NΓO| E
S -->|SIM| T[Finalizar eventos ativos\nLiberar cΓ’mera]
T --> U[python3 analytics.py]
U --> V([π RelatΓ³rio PNG])
graph LR
subgraph ENTRADA["π₯ Entrada"]
CAM[Webcam]
end
subgraph CORE["βοΈ Core β drowsiness_detector.py"]
MP[MediaPipe\nFace Landmarker]
EAR_M[EAR Engine]
MAR_M[MAR Engine]
POSE[Head Pose\nEngine]
SM[SoundManager\nPygame / afplay]
HUD[HUD Renderer\nOpenCV]
end
subgraph PERSISTENCIA["πΎ PersistΓͺncia"]
CSV[(drowsiness_events.csv)]
end
subgraph WEB["π Dashboard Web β Flask :55800"]
API_STATE[GET /api/state\nTempo real]
API_EVENTS[GET /api/events\nHistΓ³rico]
DASH[dashboard.html\nInterface Web]
end
subgraph RELATORIO["π RelatΓ³rio β analytics.py"]
PANDAS[Pandas\nAnΓ‘lise]
MPL[Matplotlib\nVisualizaΓ§Γ£o]
PNG[drowsiness_report.png]
end
CAM --> MP
MP --> EAR_M
MP --> MAR_M
MP --> POSE
EAR_M --> SM
MAR_M --> SM
POSE --> SM
EAR_M --> HUD
MAR_M --> HUD
POSE --> HUD
EAR_M --> CSV
MAR_M --> CSV
POSE --> CSV
CSV --> API_EVENTS
CORE --> API_STATE
API_STATE --> DASH
API_EVENTS --> DASH
CSV --> PANDAS
PANDAS --> MPL
MPL --> PNG
Ao final de cada sessΓ£o, o comando python3 analytics.py gera um relatΓ³rio visual completo em drowsiness_report.png:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DASHBOARD DE ANΓLISE DE FADIGA E DISTRAΓΓO β
βββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ€
β π MΓTRICAS DA SESSΓO β Contagem por Tipo de Evento β
β β β
β Total Eventos: 10 β ββββ SonolΓͺncia 4 β
β SonolΓͺncias: 4 β βββ Bocejos 4 β barras β
β Bocejos: 4 β ββ DistraΓ§Γ£o 2 coloridas β
β DistraΓ§Γ΅es: 2 β β
β Tempo Risco: 14.3s β β
β Status: β οΈ ATENΓΓO β β
βββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββ€
β Linha do Tempo e DuraΓ§Γ£o dos Alertas β
β β
β 4.5s β€ β SonolΓͺncia β
β 3.5s β€ β β β β Bocejo β
β 2.5s β€ β β β β² DistraΓ§Γ£o β
β 1.5s β€ β² β β² β β
β ββββββββββββββββββββββββββββββββββββββββββββββββΆ Tempo β
β T+5 T+8 T+10 T+14 T+22 T+25 T+28 T+37 T+42 min β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ProgressΓ£o de Severidade ao Longo da SessΓ£o β
β β
β 4.5s β€ βββββββββββββββββββββββββββ β
β 3.0s β€ βββββββββββββββββββ β pico acumulado β
β 1.5s β€ βββββββββββ β β β β β β β β eventos individuais β
β ββββββββββββββββββββββββββββββββββββββββββββββββΆ Tempo β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ClassificaΓ§Γ£o de Risco AutomΓ‘tica:
| Status | CondiΓ§Γ£o | Cor |
|---|---|---|
| β SEGURO | < 2 alertas, tempo de risco < 10s | Verde |
| > 1 drowsy/distraΓ§Γ£o ou > 3 bocejos | Γmbar | |
| π¨ CRΓTICO | β₯ 4 alertas ou tempo de risco > 15s | Vermelho |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Frame OpenCV
β EAR (Olhos) 0.31 [βββββββββββββββββββ] β
β MAR (Boca) 0.18 [βββββββββββββββββββ] DASHBOARD β
β SonolΓͺncias: 2 β
β TRACKER βββββββββ YAW: +0.12 Bocejos: 1 β
β CABEΓA β β β PIT: +0.04 DistraΓ§Γ΅es: 0 β
β βββββββββ Status: ATENTO β
β β
β [ FEED DA CΓMERA EM TEMPO REAL ] β
β β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ‘ β Alerta
β π΄ ALERTA DE SONOLΓNCIA! FAΓA UMA PAUSA! 2.3s β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Componentes do HUD:
| Componente | DescriΓ§Γ£o |
|---|---|
| Barra EAR | NΓvel de abertura ocular com marcador de threshold |
| Barra MAR | NΓvel de abertura da boca com marcador de threshold |
| Head Tracker | Bolinha que se move conforme Yaw/Pitch da cabeΓ§a |
| Sidebar | Contadores de sessΓ£o em tempo real |
| Faixa de Alerta | Banner colorido pulsante na base da tela |
TrΓͺs alertas sonoros distintos gerados por sΓntese de onda senoidal pura (sem dependΓͺncias externas):
alarm.wav β 900 Hz pulsado (0.12s on / 0.13s off) β SonolΓͺncia
yawn_warning.wav β 480 Hz / 640 Hz alternado β Bocejo
distraction_warning.wav β 650 Hz / 850 Hz pulso rΓ‘pido β DistraΓ§Γ£o
Backend de Γ‘udio com fallback automΓ‘tico:
pygame.mixer disponΓvel? ββSIMβββΆ Pygame (multi-canal simultΓ’neo)
ββNΓOβββΆ macOS afplay (subprocess nativo)
ou alertas apenas visuais
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TECNOLOGIAS USADAS β
βββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ€
β VisΓ£o Computac. β OpenCV 4.x + MediaPipe Face Landmarker β
β AnΓ‘lise Facial β 468 pontos 3D Β· EAR Β· MAR Β· Head Pose β
β Backend Web β Flask (thread daemon) Β· REST JSON API β
β AnΓ‘lise de Dadosβ Pandas Β· Matplotlib (dark theme 300dpi)β
β Γudio β Pygame Mixer Β· afplay (macOS fallback) β
β Logging β CSV estruturado com timestamp ISO 8601 β
βββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββ
git clone https://github.com/wellson/Sleep_Recognition_System.git
cd Sleep_Recognition_System
python3 -m venv .venv
source .venv/bin/activate # macOS / Linux
# .venv\Scripts\activate # Windows
pip install -r requirements.txtpython3 generate_audio.py
# Cria: assets/alarm.wav Β· assets/yawn_warning.wav Β· assets/distraction_warning.wavpython3 drowsiness_detector.py- Dashboard Web em tempo real: http://localhost:55800
- Pressione
qpara encerrar com seguranΓ§a
python3 analytics.py
# Exporta: drowsiness_report.png (300 DPI, dark theme)chmod +x run.sh && ./run.shSleep_Recognition_System/
βββ drowsiness_detector.py # Core: detecΓ§Γ£o, HUD, Flask API
βββ analytics.py # GeraΓ§Γ£o de relatΓ³rio Matplotlib
βββ generate_audio.py # SΓntese de alarmes WAV
βββ dashboard.html # Interface web em tempo real
βββ face_landmarker.task # Modelo MediaPipe (prΓ©-compilado)
βββ run.sh # Menu interativo CLI
βββ requirements.txt # DependΓͺncias Python
βββ drowsiness_events.csv # Log de eventos da sessΓ£o
βββ drowsiness_report.png # RelatΓ³rio gerado
βββ assets/
βββ alarm.wav # Alarme de sonolΓͺncia
βββ yawn_warning.wav # Aviso de bocejo
βββ distraction_warning.wav # Alarme de distraΓ§Γ£o
| Timestamp | Event_Type | Duration_Seconds | Peak_Value |
|---|---|---|---|
2026-05-19 20:15:10 |
YAWN |
1.85 |
0.725 |
2026-05-19 20:22:40 |
DROWSINESS |
2.40 |
0.142 |
2026-05-19 20:31:05 |
DISTRACTION |
3.20 |
0.650 |
Event_Type: DROWSINESS Β· YAWN Β· DISTRACTION
Peak_Value: EAR mΓnimo (drowsiness) Β· MAR mΓ‘ximo (yawn) Β· desvio mΓ‘ximo (distraction)
| ParΓ’metro | Valor PadrΓ£o | DescriΓ§Γ£o |
|---|---|---|
EAR_THRESHOLD |
0.22 |
Limiar de fechamento ocular |
MAR_THRESHOLD |
0.60 |
Limiar de abertura da boca |
ALERT_DURATION |
1.5s |
Tempo mΓnimo para disparar alerta |
YAW_THRESHOLD |
0.33 |
RotaΓ§Γ£o lateral mΓ‘xima |
PITCH_DOWN_THRESHOLD |
0.12 |
InclinaΓ§Γ£o frontal mΓ‘xima |
PITCH_UP_THRESHOLD |
-0.38 |
InclinaΓ§Γ£o traseira mΓ‘xima |
| Flask Port | 55800 |
Porta do dashboard web |
| Endpoint | MΓ©todo | DescriΓ§Γ£o |
|---|---|---|
/ |
GET | Serve o dashboard.html |
/api/state |
GET | Estado atual em JSON (EAR, MAR, alertas) |
/api/events |
GET | HistΓ³rico completo do CSV em JSON |
Exemplo de resposta /api/state:
{
"ear": 0.31,
"mar": 0.18,
"yaw": 0.05,
"pitch": 0.02,
"is_drowsy": false,
"is_yawn": false,
"is_distracted": false,
"drowsy_count": 1,
"yawn_count": 2,
"distracted_count": 0,
"status": "ATENTO"
}Desenvolvido com foco em seguranΓ§a viΓ‘ria e prevenΓ§Γ£o de acidentes por fadiga.
VisΓ£o Computacional Β· Biometria Facial Β· AnΓ‘lise em Tempo Real
