Skip to content

wellson/Sleep_Recognition_System

Repository files navigation

πŸ‘οΈ Sleep Recognition System

Sistema de DetecΓ§Γ£o de SonolΓͺncia e DistraΓ§Γ£o em Tempo Real

Python OpenCV MediaPipe Flask License

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.


🎯 Visão Geral

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.

Demo

▢️ Assista ao vΓ­deo de demonstraΓ§Γ£o

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    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    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”¬ FundamentaΓ§Γ£o MatemΓ‘tica

Eye Aspect Ratio (EAR) β€” DetecΓ§Γ£o de Fechamento Ocular

Mede a abertura dos olhos comparando distΓ’ncias verticais e horizontais dos marcos faciais:

$$\text{EAR} = \frac{||p_2 - p_6|| + ||p_3 - p_5||}{2 \cdot ||p_1 - p_4||}$$

         p2    p3
    p1 ●──●────●──● p4
         p6    p5

EAR alto β†’ olhos abertos β†’ motorista atento
EAR < 0.22 por > 1.5s β†’ ALERTA DE SONOLÊNCIA

Mouth Aspect Ratio (MAR) β€” DetecΓ§Γ£o de Bocejos

Mede a abertura da boca usando pontos das comissuras e lΓ‘bios:

$$\text{MAR} = \frac{||m_2 - m_8|| + ||m_3 - m_7|| + ||m_4 - m_6||}{2 \cdot ||m_1 - m_5||}$$

       m2  m3
  m1 ●──●──●──● m5
       m8  m6
         m7 m4

MAR > 0.60 por > 1.5s β†’ BOCEJO / FADIGA ACUMULADA

Head Pose Estimation β€” DetecΓ§Γ£o de DistraΓ§Γ£o

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

πŸ—ΊοΈ Fluxograma do Sistema

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])
Loading

πŸ—οΈ Arquitetura dos Componentes

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
Loading

πŸ“Š Dashboard AnalΓ­tico

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
⚠️ ATENÇÃO > 1 drowsy/distraΓ§Γ£o ou > 3 bocejos Γ‚mbar
🚨 CRÍTICO β‰₯ 4 alertas ou tempo de risco > 15s Vermelho

πŸ–₯️ HUD em Tempo Real (Glassmorphism)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ← 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

πŸ”Š Sistema de Áudio

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

πŸ› οΈ Stack TecnolΓ³gica

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    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 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ InstalaΓ§Γ£o e ExecuΓ§Γ£o

1. Clonar e preparar ambiente

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.txt

2. Gerar arquivos de Γ‘udio

python3 generate_audio.py
# Cria: assets/alarm.wav Β· assets/yawn_warning.wav Β· assets/distraction_warning.wav

3. Iniciar o monitoramento

python3 drowsiness_detector.py

4. Gerar relatΓ³rio analΓ­tico

python3 analytics.py
# Exporta: drowsiness_report.png (300 DPI, dark theme)

Modo menu interativo (macOS/Linux)

chmod +x run.sh && ./run.sh

πŸ“ Estrutura do Projeto

Sleep_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

πŸ“‹ Estrutura do Log CSV

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Γ’metros de ConfiguraΓ§Γ£o

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

🌐 API REST (Dashboard em Tempo Real)

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

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors