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.
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.
- 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)
O projeto treinado no Edge Impulse pode ser acessado e clonado pelo link abaixo:
Clonar projeto no Edge Impulse
O dataset utilizado foi o Driver Drowsiness Dataset (DDD), disponível no Kaggle:
Driver Drowsiness Dataset (DDD)
Foram utilizadas duas classes:
awake: motorista acordado/atentodrowsy: 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.
- Download e organização do dataset.
- Separação das imagens nas classes
awakeedrowsy. - Equalização da quantidade de imagens entre as classes.
- Upload do dataset no Edge Impulse.
- Configuração do projeto como classificação de imagens.
- Definição do pipeline de processamento.
- Treinamento do modelo.
- Avaliação das métricas.
- Deploy do modelo como Arduino Library.
- Importação da biblioteca gerada na Arduino IDE.
- Desenvolvimento do arquivo
.inopara captura de imagem e inferência local.
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.
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.
Os resultados abaixo foram obtidos a partir do arquivo JSON de métricas exportado pelo Edge Impulse.
| Métrica | Valor |
|---|---|
| Accuracy | 99.9485% |
| ROC AUC | 0.99948 |
| Loss | 0.00108 |
| Total de amostras | 7767 |
| Classe real | Predito awake |
Predito drowsy |
|---|---|---|
awake |
3897 | 2 |
drowsy |
2 | 3866 |
| Métrica | Valor |
|---|---|
| Accuracy | 99.9518% |
| ROC AUC | 0.99951 |
| Loss | 0.00090 |
| Total de amostras | 6225 |
| Classe real | Predito awake |
Predito drowsy |
|---|---|---|
awake |
3094 | 2 |
drowsy |
1 | 3128 |
Os gráficos abaixo podem ser adicionados à pasta docs/images do projeto.
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.
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.
.
├── 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-libraryNo Edge Impulse, acesse:
Deployment > Arduino LibraryDepois, gere e baixe a biblioteca do modelo treinado.
Na Arduino IDE, acesse:
Sketch > Include Library > Add .ZIP LibrarySelecione o arquivo .zip exportado pelo Edge Impulse.
Abra o arquivo:
fadigAI.inoConfigure a placa compatível com o Seeed Studio XIAO ESP32S3 Sense.
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.
- 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.






