ÍNDICE DE CONTEÚDO
- Machine Learning em Microcontroladores – Introdução
- Machine Learning na Franzininho WiFi: Inferência de Temperatura e Umidade (Parte 1)
- Machine Learning na Franzininho WiFi: Inferência de Temperatura e Umidade (Parte 2)
- Machine Learning na Franzininho WiFi: Classificação de Movimento com Acelerômetro e LEDs (Parte 1)
- Machine Learning na Franzininho WiFi: Classificação de Movimento com Acelerômetro e LEDs (Parte 2)
Introdução
Este é um projeto para analisar a qualidade do ambiente com base em dados de temperatura e umidade. Utilizaremos a Franzininho WiFi, juntamente com o sensor DHT11, para coletar esses dados. Em seguida, enviaremos as informações para a plataforma Edge Impulse, onde treinaremos um modelo de Machine Learning. Após o treinamento, implementaremos o modelo na Franzininho WiFi, permitindo que ela faça inferências em tempo real, classificando o ambiente como normal ou anormal com base em novas leituras de dados.
Hardware Necessário
- 1 Franzininho WiFi
- 1 DHT11
Edge Impulse
Edge Impulse é uma plataforma para desenvolvimento de IA, que facilita a criação, treinamento e implementação de modelos de Machine Learning (ML) em dispositivos embarcados e de borda (edge devices), como microcontroladores e sensores. Sendo amplamente utilizada em aplicações de TinyML, onde modelos de aprendizado de máquina são otimizados para rodar em hardware com recursos limitados, como o ESP32, Arduino, e outros dispositivos de IoT.
A Edge Impulse oferece um plano gratuito para estudantes, universitários e makers. Acesse https://edgeimpulse.com/ e crie sua conta gratuita, que será utilizada ao longo deste projeto.
Código para coleta de dados
Primeiro, carregue na sua Franzininho WiFi um código que faça a leitura dos dados do sensor DHT11 e os imprima na serial com o timestamp, na seguinte ordem: timestamp, temperatura e umidade.
Embarcados Experience 2024: Evento Presencial
Participe do Embarcados Experience 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include "DHT.h" #define FREQUENCY_HZ 50 #define INTERVAL_MS (1000 / (FREQUENCY_HZ + 1)) #define DHTPIN 15 // Pino digital conectado ao sensor DHT #define DHTTYPE DHT11 // Tipo de sensor DHT DHT dht(DHTPIN, DHTTYPE); static unsigned long last_interval_ms = 0; void setup() { Serial.begin(115200); Serial.println(F("Inicializando DHT...")); dht.begin(); } void loop() { if (millis() > last_interval_ms + INTERVAL_MS) { last_interval_ms = millis(); // Ler a umidade e a temperatura float h = dht.readHumidity(); float t = dht.readTemperature(); // Verifica se a leitura falhou if (isnan(h) || isnan(t)) { Serial.println(F("Falha ao ler o sensor DHT!")); return; } // Obter o timestamp atual em milissegundos unsigned long timestamp = millis(); // Enviar os dados para a Edge Impulse via serial com timestamp Serial.print(timestamp); Serial.print(","); Serial.print(t); Serial.print(","); Serial.println(h); // Exemplo de saída: "123456,23.40,56.00" } } |
Um detalhe importante neste código é a definição da constante FREQUENCY_HZ. Vamos usar uma ferramenta de ingestão de dados do Edge Impulse, é essencial configurar uma taxa de amostragem adequada.
Ferramenta de ingestão de dados do Edge Impulse
Para que a Edge Impulse receba os dados coletados pela sua placa, utilizaremos a ferramenta de ingestão fornecida pela plataforma para conectar o dispositivo ao Edge Impulse. Siga os passos abaixo para configurá-la:
- Faça o login na sua conta criada na Edge Impulse
- Instale a Edge Impulse CLI em sua máquina. Certifique-se de que o Node.js esteja instalado e use o seguinte comando:
1 |
npm install -g edge-impulse-cli --force |
Para explicação detalhada acesse: edge-impulse-cli
- Após a instalação de Edge Impulse CLI, abra o terminal CMD ou powershell e use o comando:
1 |
edge-impulse-data-forwarder –device-name “nomeSuaEscolha” |
Se for o seu primeiro acesso, serão solicitadas suas credenciais de login, que são o e-mail e senha utilizados para criar sua conta na Edge Impulse.
- Durante esse processo, é necessário que a placa esteja conectada à sua máquina para que a Edge Impulse CLI possa identificar a porta serial correta e a frequência de envio de informações. Após a identificação, será solicitado que você defina os dados que serão enviados. Esses dados devem ser separados por vírgulas (,). No nosso caso, os dados enviados serão: timestamp, temperature, humidity.
- Por fim, escolha um nome para o dispositivo. Se tudo correr conforme o esperado, ao abrir a plataforma Edge Impulse, você verá o dispositivo listado e conectado.
Em caso de erros ou dúvidas sugiro a leitura de cli-data-forwarder
Aquisição dos dados na Edge Impulse
Após conectar o dispositivo à plataforma Edge Impulse, avançamos para a etapa de aquisição de dados. Para iniciar, clique em “Data acquisition” e, em seguida, modifique “Collect data”. Escolha o dispositivo que será utilizado e, no campo “Sensor”, selecione o tipo de dados a serem lidos. Em “Label”, rotule os dados de acordo com a categoria que está sendo coletada, para o treinamento do modelo é preciso no mínimo 2 categorias de dados.
No nosso exemplo, a primeira coleta será rotulada como “normal”. Defina o tempo de coleta em milissegundos (ms) e a frequência de amostragem. Para este exemplo, utilizamos 180.000 ms (3 minutos) como tempo de coleta e uma frequência de 50 Hz, que já havia sido configurada previamente.
A nossa segunda aquisição será com dados categorizados como “anomalia”. Ao realizar essa coleta coloquei um pano úmido próximo ao sensor de umidade.
Note que as aquisições realizadas foram feitas na seção “Training”, ou seja, destinadas ao conjunto de treinamento. É necessário também coletar dados para o conjunto de testes. Normalmente, a divisão entre treinamento e teste segue a proporção de 80% para treino e 20% para teste. Assim, se você coletou, por exemplo, 5 minutos de dados para treinamento, deve agora coletar 1 minuto para o conjunto de teste (20% de 5 minutos).
Para fazer isso, vá até a seção “Dataset”, clique em “Test” e inicie a coleta de dados para o conjunto de testes. Assim como na etapa de treinamento, aqui também vamos coletar dados categorizados como “normal” e “anomalia”.
Esta etapa de coleta de dados é o que determina o sucesso do modelo. No exemplo que estamos construindo, foram coletados poucos dados para fins demonstrativos. No entanto, em um projeto real, é fundamental garantir uma quantidade significativa e diversificada de dados. Isso aumenta a precisão do modelo ao identificar padrões e generalizar para novas situações. A qualidade e a representatividade dos dados também são essenciais, logo é importante coletar dados em diferentes condições e ambientes, bem como garantir que as categorias (normais e anomalias, por exemplo) estejam equilibradas.
Criando um Impulso
Os dados foram coletados na etapa anterior, seguiremos para a etapa de criação de impulso. Em “Impulse design” > “Create Impulse” e siga os seguintes passos:
- Adicione um bloco de “Processamento dos Dados”. Nele vamos escolher “Raw Data”
- Adicione o bloco de “Construção do Modelo”. Nele vamos escolher “Classificação”.
- Salve o Impulso.
Treinamento Modelo
Na etapa de treinamento de modelo, primeiro vá em “Impulse design” > “Raw Data” e clique em “Generate Features”. Essa etapa transforma os dados brutos coletados em características (ou features) que podem ser usadas para treinar um modelo de machine learning.
Depois, vá para “Impulse design” > “Classifier” e clique em “Save & Train”. Aqui vamos treinar o modelo.
Em seguida, “Impulse design” > “Retrain Model”, clique em “Train Model”. Essa etapa, realiza o re-treino do modelo para ajustar ou melhorar o desempenho do modelo de machine learning com base em novos dados ou alterações na configuração do Impulso.
Agora nosso modelo está pronto. Você pode testar o modelo em “Model Testing”.
Interpretando resultados do treinamento do modelo
Na etapa anterior, ao treinar o modelo, foram gerados os resultados de suas métricas de desempenho. Com os dados coletados, obtive os seguintes resultados:
- O modelo alcançou uma acurácia de 84,7% no conjunto de validação. Isso significa que 84,7% das previsões do modelo estão corretas, considerando tanto as classes “normal” quanto “anomalia”.
- A perda (loss) é de 5,32. A perda reflete o quão longe as previsões do modelo estão dos valores reais, com valores menores indicando um modelo mais preciso. Esse valor, apesar de ser aceitável, apresenta um grau de erro que indica que o modelo ainda pode ser ajustado.
- Na classe “anomalia”, o modelo acertou 66,7% das vezes, mas cometeu erros em 33,3% das previsões (falsos negativos ou falsos positivos). Na classe “normal”, o desempenho foi ótimo, com 100% de precisão. Isso sugere que o modelo está melhor em identificar padrões “normais”, no entanto apresenta dificuldades em detectar corretamente todas as “anomalias”. Isso indica uma possível necessidade de coletar mais dados da categoria anomalia ou balancear o conjunto de dados.
- O F1 Score da classe “anomalia” é 0,80 e da classe “normal” é 0,88, indicando que o modelo é razoavelmente bom em equilibrar precisão e recall (taxa de verdadeiro positivo).
- A área sob a Curva ROC (AUC) é de 0,83, o que significa que o modelo tem uma boa capacidade de distinguir entre as classes, embora ainda haja espaço para melhorias.
Se você quiser entender mais sobre essas métricas sugiro a leitura do seguinte artigo: what-is-accuracy-precision-recall-and-f1-score
Implantação Modelo
Após a coleta dos dados, treinamento do modelo e validação dos resultados, é hora de realizar a implantação convertendo nosso modelo em um arquivo .tflite que pode ser carregado no microcontrolador. No Edge Impulse, na aba “Deployment”, selecione a plataforma desejada, para nosso exemplo será a Arduino IDE. Clique em “Build” e aguarde a conversão. Ao finalizar, um arquivo .zip contendo seu modelo será gerado. No próximo artigo, ensinaremos como utilizá-lo na Franzininho WiFi.
Conclusão
Neste artigo, aprendemos a utilizar a plataforma Edge Impulse para gerar um modelo de Machine Learning capaz de rodar em um microcontrolador. Coletamos dados de temperatura e umidade com a Franzininho WiFi e o sensor DHT11 e realizamos o treinamento do modelo na plataforma. Na próxima parte, veremos como utilizar o modelo implantado para classificar novos dados diretamente no dispositivo.