Skip to content

WillFelisberto/fadigAI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

FadigAI - Detecção de Sonolência com TinyML

Sistema embarcado para detecção de sonolência em motoristas utilizando TinyML, visão computacional e inferência local em microcontrolador.

O projeto utiliza um modelo de classificação binária treinado na plataforma Edge Impulse a partir do dataset Driver Drowsiness Dataset (DDD), com as classes awake e drowsy. A inferência é executada localmente no Seeed Studio XIAO ESP32S3 Sense utilizando a câmera integrada do dispositivo.

Objetivo

O objetivo do projeto é desenvolver uma solução embarcada de baixo custo para identificar sinais de fadiga em motoristas em tempo real, sem depender de conexão com a internet ou processamento em nuvem.

A proposta explora o uso de TinyML para executar um modelo de visão computacional diretamente em um microcontrolador, permitindo respostas rápidas e maior independência operacional.

Tecnologias utilizadas

  • Seeed Studio XIAO ESP32S3 Sense
  • Edge Impulse
  • Arduino IDE
  • TinyML
  • Edge AI
  • Visão computacional
  • Classificação binária de imagens
  • Quantização INT8
  • Dataset Driver Drowsiness Dataset (DDD)

Projeto no Edge Impulse

O projeto treinado no Edge Impulse pode ser acessado e clonado pelo link abaixo:

Clonar projeto no Edge Impulse

Dataset

O dataset utilizado foi o Driver Drowsiness Dataset (DDD), disponível no Kaggle:

Driver Drowsiness Dataset (DDD)

Foram utilizadas duas classes:

  • awake: motorista acordado/atento
  • drowsy: motorista sonolento

Antes do treinamento, foi realizada a equalização da quantidade de imagens entre as classes, com o objetivo de reduzir viés no modelo e melhorar o equilíbrio da classificação.

Fluxo do projeto

  1. Download e organização do dataset.
  2. Separação das imagens nas classes awake e drowsy.
  3. Equalização da quantidade de imagens entre as classes.
  4. Upload do dataset no Edge Impulse.
  5. Configuração do projeto como classificação de imagens.
  6. Definição do pipeline de processamento.
  7. Treinamento do modelo.
  8. Avaliação das métricas.
  9. Deploy do modelo como Arduino Library.
  10. Importação da biblioteca gerada na Arduino IDE.
  11. Desenvolvimento do arquivo .ino para captura de imagem e inferência local.

Hardware

O projeto foi desenvolvido para o:

Seeed Studio XIAO ESP32S3 Sense

Este dispositivo possui câmera integrada e capacidade de execução de modelos TinyML, permitindo realizar inferência local diretamente no microcontrolador.

Funcionamento

O sistema captura imagens utilizando a câmera integrada do XIAO ESP32S3 Sense e executa a inferência com o modelo treinado no Edge Impulse.

A cada inferência, o modelo retorna scores de confiança para as classes awake e drowsy. Esses scores são utilizados para determinar o estado atual do motorista.

Além da classificação direta, o código embarcado realiza uma análise contínua dos scores para reduzir falsos positivos causados por uma única predição isolada.

Métricas do modelo

Os resultados abaixo foram obtidos a partir do arquivo JSON de métricas exportado pelo Edge Impulse.

Resultados de teste

Métrica Valor
Accuracy 99.9485%
ROC AUC 0.99948
Loss 0.00108
Total de amostras 7767

Matriz de confusão - teste

Classe real Predito awake Predito drowsy
awake 3897 2
drowsy 2 3866

Resultados de validação

Métrica Valor
Accuracy 99.9518%
ROC AUC 0.99951
Loss 0.00090
Total de amostras 6225

Matriz de confusão - validação

Classe real Predito awake Predito drowsy
awake 3094 2
drowsy 1 3128

Gráficos

Os gráficos abaixo podem ser adicionados à pasta docs/images do projeto.

Matriz de confusão - teste

Matriz de confusão - teste

Matriz de confusão normalizada

Matriz de confusão normalizada

Matriz de confusão - validação

Matriz de confusão - validação

Métricas principais

Métricas principais

Métricas por classe

Métricas por classe

ROC AUC

ROC AUC

Loss

Loss

Interpretação dos resultados

O modelo apresentou desempenho elevado na classificação das classes awake e drowsy.

No conjunto de teste, composto por 7767 imagens, o modelo classificou corretamente 3897 imagens da classe awake e 3866 imagens da classe drowsy. Apenas quatro imagens foram classificadas incorretamente, sendo duas imagens awake classificadas como drowsy e duas imagens drowsy classificadas como awake.

Esse resultado representa uma acurácia de aproximadamente 99.9485%, indicando alta capacidade de separação entre as duas classes no dataset avaliado.

As métricas de precision, recall e f1-score também apresentaram valores próximos de 99.95%, demonstrando desempenho equilibrado entre as classes. Isso sugere que o balanceamento do dataset contribuiu para evitar que o modelo favorecesse uma classe em relação à outra.

Apesar dos resultados elevados, é importante destacar que o desempenho em ambiente real pode ser afetado por fatores como iluminação, posição da câmera, uso de óculos, movimentação da cabeça, variações faciais e qualidade da captura.

Análise de score da inferência

Durante a execução embarcada, o sistema não considera apenas a classe predita, mas também os scores de confiança retornados pelo modelo.

Essa abordagem permite identificar padrões persistentes de sonolência, reduzindo a chance de falsos positivos causados por uma única inferência incorreta.

Exemplo conceitual:

if (drowsy_score > awake_score) {
    // Possível estado de sonolência
}

A lógica completa de análise dos scores está implementada no arquivo .ino.

Estrutura sugerida do projeto

.
├── fadigAI.ino
├── README.md
├── docs
│   └── images
│       ├── matriz_confusao_teste_int8_absoluta.png
│       ├── matriz_confusao_teste_int8_percentual.png
│       ├── matriz_confusao_validacao_int8_absoluta.png
│       ├── metricas_principais_validacao_teste_int8.png
│       ├── metricas_por_classe_teste_int8.png
│       ├── roc_auc_validacao_teste_int8.png
│       └── loss_validacao_teste_int8.png
└── model
    └── edge-impulse-arduino-library

Como executar

1. Gerar a biblioteca no Edge Impulse

No Edge Impulse, acesse:

Deployment > Arduino Library

Depois, gere e baixe a biblioteca do modelo treinado.

2. Importar a biblioteca na Arduino IDE

Na Arduino IDE, acesse:

Sketch > Include Library > Add .ZIP Library

Selecione o arquivo .zip exportado pelo Edge Impulse.

3. Abrir o código

Abra o arquivo:

fadigAI.ino

4. Selecionar a placa

Configure a placa compatível com o Seeed Studio XIAO ESP32S3 Sense.

5. Compilar e enviar

Compile o código e envie para o dispositivo.

Após o envio, o sistema passará a capturar imagens pela câmera e executar a inferência localmente.

Limitações

  • O modelo foi avaliado em dataset controlado.
  • O desempenho pode variar em ambiente real.
  • Iluminação inadequada pode prejudicar a captura da câmera.
  • A posição da câmera influencia diretamente o resultado.
  • O uso de óculos, reflexos e movimentação da cabeça podem afetar a inferência.
  • O sistema ainda precisa ser validado em cenários reais de condução.
  • O uso contínuo pode exigir otimizações de consumo energético.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages