Skip to Content

Treinar um Modelo de Detecção de Objetos com Edge Impulse para ESP32-CAM

Treinar um Modelo de Detecção de Objetos com Edge Impulse para ESP32-CAM

Neste tutorial, vais aprender a treinar um Modelo de Detecção de Objetos com Edge Impulse para o ESP32-CAM. A recolha de dados, a rotulagem dos dados e o treino do modelo acontecerão na plataforma Edge Impulse, mas o Modelo de Detecção será executado diretamente no ESP32-CAM.

Como o ESP32-CAM tem capacidade de processamento limitada, não esperes altas precisões ou velocidades. No entanto, existem muitas aplicações TinyML onde o ESP32-CAM é suficiente. Por exemplo, podes construir uma fechadura inteligente com reconhecimento facial que concede acesso apenas a ti, um alimentador de animais que detecta e alimenta o teu animal quando aparece, ou um sistema de reconhecimento de gestos para controlar luzes ou aparelhos com movimentos da mão.

Neste tutorial introdutório à deteção de objetos com Edge Impulse, vamos manter as coisas simples e treinar um sistema que detecta e distingue apenas dois objetos.

Peças Necessárias

Vais precisar de um ESP32-CAM para executar a deteção de objetos. Podes obter um ESP32-CAM com um USB-TTL Shield para programação ou um Adaptador FTDI USB-TTL. O Adaptador FTDI USB-TTL é um pouco mais complicado de usar, mas deixa os pinos GPIO facilmente acessíveis. Para este tutorial, recomendo o USB-TTL Shield, mas certifica-te de que obténs o correto (ver Programming the ESP32-CAM tutorial para detalhes).

ESP32-CAM com USB-TTL Shield

Adaptador FTDI USB-TTL

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

O que é o Edge Impulse?

Edge Impulse é uma plataforma web desenhada para permitir a criação de modelos de machine learning eficientes para dispositivos embebidos e edge. Facilita a construção e implementação de aplicações TinyML (Tiny Machine Learning).

Edge Impulse Workflow
Fluxo de Trabalho do Edge Impulse (source)

Recolha e Rotulagem de Dados

Podes recolher dados de uma grande variedade de sensores, incluindo câmaras, microfones, acelerómetros, giroscópios, sensores ambientais e mais. Existem várias formas de recolher dados:

  1. Recolha de dados em tempo real via USB/serial: Placas de desenvolvimento suportadas (como ESP32, Arduino Nano 33 BLE Sense ou placas ST) podem ser ligadas diretamente ao Edge Impulse Studio para transmitir dados dos sensores em tempo real.
  2. Recolha remota de dados usando o Edge Impulse CLI: Para dispositivos headless ou remotos, os utilizadores podem usar o CLI para enviar dados via Wi-Fi ou serial para a plataforma Edge Impulse.
  3. App para telemóvel: A app móvel Edge Impulse (disponível para Android e iOS) pode ser usada para capturar imagens, áudio e dados de movimento diretamente do teu telemóvel e enviá-los para o painel do projeto.
  4. Carregar conjuntos de dados existentes: Os utilizadores podem importar dados em formatos CSV, JSON ou personalizados e rotulá-los na interface web.
  5. Recolha contínua de dados: Alguns dispositivos podem ser configurados para amostragem contínua e segmentados depois em janelas de dados geríveis.

Depois de recolher os dados, o Edge Impulse oferece ferramentas para rotulagem. A interface de rotulagem suporta marcar amostras individuais ou rotulagem em lote de grandes conjuntos de dados. Para dados visuais e áudio, podes ampliar, cortar e anotar eventos ou características de interesse. A plataforma também suporta rotulagem automática e aumento de dados para melhorar a qualidade do conjunto de dados.

Processamento de Sinal e Treino do Modelo

Após a rotulagem, os dados passam por blocos DSP (Digital Signal Processing), que transformam dados brutos dos sensores em características adequadas para machine learning. Estes blocos são otimizados para ambientes de poucos recursos e são específicos ao tipo de entrada (ex.: MFCCs para áudio, redimensionamento e correção de cor para visão, ou FFT para dados de vibração).

Segue-se o treino do modelo. O Edge Impulse oferece:

  • Classificação, para detetar presença/ausência ou identificar classes (ex.: tipos de objetos, palavras faladas).
  • Regressão, para prever valores contínuos (ex.: estimar ângulos, temperatura ou posição de objetos).
  • Deteção de objetos, para detetar e localizar múltiplos objetos em imagens.
  • Deteção de anomalias, para identificar outliers ou padrões invulgares sem necessidade de dados rotulados.

Podes usar arquiteturas de modelos pré-construídas da Model Zoo do Edge Impulse, que inclui versões otimizadas de MobileNet, ResNet e SqueezeNet, entre outras, ou definir modelos personalizados usando Keras e TensorFlow Lite. Também podes importar modelos ONNX ou TensorFlow.

Otimização e Implementação do Modelo

Depois de treinar um modelo, o Edge Impulse ajuda a otimizá-lo para implementação no edge usando técnicas como quantização (reduzindo o tamanho do modelo e melhorando a velocidade de inferência) e fusão de operadores.

A implementação é muito flexível, com opções incluindo:

  • SDK C++: Um SDK totalmente autónomo que pode ser integrado em qualquer projeto C++. Ideal para microcontroladores e firmware bare-metal.
  • Biblioteca Arduino: Gera automaticamente uma biblioteca compatível com Arduino para executar o teu modelo em placas como ESP32, Arduino Portenta e Nano 33 BLE.
  • Firmware pré-construído: Para dispositivos suportados, o Edge Impulse fornece binários de firmware com o modelo treinado incorporado, prontos para flash e execução.
  • WebAssembly: Executa modelos no navegador ou em qualquer sistema que suporte WebAssembly.
  • Implementação baseada em Linux: Para dispositivos como Raspberry Pi, BeagleBone ou Nvidia Jetson, podes implementar usando SDKs Python ou containers Docker.

Model Zoo e Transfer Learning

O Edge Impulse também oferece um pequeno Model Zoo com modelos leves e pré-otimizados para casos de uso edge. Estes modelos incluem:

  • Variantes MobileNet para classificação de imagens
  • FOMO (Fast Object Detection for Microcontrollers), um modelo pequeno de deteção de objetos adequado para aplicações em tempo real
  • Classificadores de áudio compatíveis com Syntiant
  • Modelos personalizados para deteção de palavras-chave
  • Exemplos de regressão e deteção de anomalias

Muitos destes modelos podem ser ajustados via transfer learning, permitindo alcançar alta precisão mesmo com conjuntos de dados relativamente pequenos, aproveitando pesos pré-treinados existentes.

Registo no Edge Impulse

Antes de poderes usar o Edge Impulse, precisas de te registar. A boa notícia é que o Plano Developer é gratuito. Estarás limitado a três projetos privados, mas isso é suficiente para experimentares. Vai a https://studio.edgeimpulse.com/signup e preenche os teus dados no formulário:

Edge Impulse signing-up form
Formulário de registo do Edge Impulse

Depois de te registares, podes criar um projeto, que vamos discutir na próxima secção. Se tiveres algum problema, o Edge Impulse Documentation também pode ajudar.

Criar Projeto no Edge Impulse

Para criar um projeto, vai a https://studio.edgeimpulse.com/studio/profile/projects, clica no botão “+ Create new project” à direita. Isto abrirá um diálogo onde podes inserir o nome do projeto, por exemplo “esp32-cam-object-detection” e definir algumas propriedades do projeto, como mostrado abaixo:

Criar Projeto Edge Impulse

Para o tipo de projeto, seleciona “Personal” e torna-o privado. Depois, simplesmente pressiona o botão verde “Create new project” na parte inferior.

Dashboard do Edge Impulse

Depois de criar um projeto, serás redirecionado para o Dashboard. Há algumas secções que quero destacar para ti:

Edge Impulse Dashboard
Dashboard do Edge Impulse

No centro aparece o nome do teu projeto, por exemplo esp32-cam-object-detection, que podes editar. No canto superior direito podes selecionar a plataforma alvo.

O AI Thinker ESP32-CAM não aparece como placa suportada, mas existe o Espressif ESP-EYE, que deves escolher para este tutorial. Com uma pequena alteração, o código gerado funcionará também para o ESP32-CAM.

Na barra lateral à esquerda estão as funções para aquisição de dados e design do Impulse. Um “Impulse” é uma pipeline curta de processamento de dados, que contém o pré-processamento dos dados (ex.: escalamento) e o modelo de rede neural.

Aquisição de Dados no Edge Impulse

O Edge Impulse suporta vários métodos para recolher dados. Vamos usar o mais fácil, que é recolher imagens com o teu smartphone.

Clica no item “Data acquisition” na barra lateral, que abrirá um novo painel. No lado direito, em “Collect data”, clica no link “Connect a device”:

Edge Impulse Connect a Device
Edge Impulse Conectar um Dispositivo

Isto abrirá um diálogo com três opções. Usa o código QR à esquerda com o teu telemóvel para abrir uma app que permite tirar fotos como amostras de dados com o telemóvel:

Connect Device via QR code
Conectar Dispositivo via código QR

Aqui está uma imagem da app como aparecerá no teu telemóvel depois de dares permissões para executar a app e tirar fotos:

Edge Impulse Data Collection App
App de Recolha de Dados do Edge Impulse

Clica no botão azul “Capture” para tirar fotos, que serão enviadas para a plataforma Edge Impulse. Lá, iremos rotulá-las numa segunda fase.

Makkuro Kurosuke e Carro

Para este tutorial vou usar dois objetos a serem detetados, um Makkuro Kurosuke e um Carro:

Makkuro Kurosuke and Car
Makkuro Kurosuke e Carro

Caso não conheças, Makkuro Kurosuke (ou Susuwatari) é uma personagem fictícia do filme do Studio Ghibli My Neighbor Totoro, e pode ser traduzido livremente como “Pequeno Espírito de Fuligem”. Para a rotulagem, vou chamá-lo simplesmente de “Kurosuke”.

Estes dois objetos são interessantes para experimentar a deteção de objetos. O Kurosuke é praticamente sem características, apenas uma bola preta que pode ser facilmente confundida com outros objetos pretos. O carro, por outro lado, é complexo na forma, e o modelo precisa aprender uma boa representação para o detetar de forma fiável.

Se recolheres os dados, certifica-te de que o fazes nas mesmas condições em que a deteção do modelo será realizada. Caso contrário, o detector provavelmente cometerá muitos erros ao detetar objetos.

Por exemplo, cobre diferentes ângulos, distâncias, fundos e níveis de iluminação para tornar a deteção robusta. Abaixo alguns exemplos de dados que recolhi (e rotulei):

Example Captures
Exemplos de Capturas

Note, no entanto, que quanto mais as condições ambientais mudam, mais difícil é a tarefa para o detector de objetos e mais dados precisas recolher. Se quiseres simplificar a tarefa, usa o mesmo fundo, ângulo e luz – em outras palavras: controla o ambiente o máximo possível.

Rotulagem de Dados

Depois de recolheres fotos suficientes para ambos os objetos – aponta para um mínimo de 30 fotos por objeto – podes começar a rotular os dados. As fotos (amostras) aparecerão no lado esquerdo e, se clicares numa, terás uma vista ampliada da foto no canto inferior direito:

Selecting pictures for labelling
Selecionar fotos para rotulagem

Ali podes usar o rato para desenhar uma caixa delimitadora em torno do objeto a detetar e dar-lhe um rótulo, no meu caso “Car” ou “Kurosuke”:

Labelling the Car in a picture
Rotulagem do Carro numa foto

Terás de fazer isto para todas as tuas imagens e ser consistente com a rotulagem dos dois (ou mais) objetos que queres detetar.

A boa notícia é que a plataforma Edge Impulse propõe uma caixa delimitadora após a primeira rotulagem, o que torna o processo muito mais rápido. Podes alterar o tamanho e a localização das caixas propostas clicando nos ícones de arrastar ou redimensionar nos cantos da caixa.

Criar Impulse no Edge Impulse

Depois de completares a recolha e rotulagem dos dados, clica em “Create Impulse” em “Impulse Design” na barra lateral do Dashboard:

Create Impulse
Criar Impulse

Isto abrirá o painel com alguns blocos de processamento, como mostrado abaixo.:

Object Detection Impulse
Impulse de Deteção de Objetos

Inicialmente, os blocos no painel podem ser diferentes, mas podes apagá-los clicando no pequeno ícone de caixote do lixo no canto inferior direito de cada bloco. Depois, adiciona novos blocos clicando em “Add … block” e seleciona e configura-os:

Especificamente, precisas de um bloco “Image data” (entrada) com tamanho de imagem 96×96 pixels e modo de redimensionamento “Fit longer axis”.

Segue-se um bloco “Image” (processamento) e depois um bloco de Object Detection (aprendizagem). O último bloco são as características de saída. Podes ver que já mostra os dois objetos (Car, Kurosuke) que queremos detetar.

Depois de concluído, criaste um “Impulse”, que é essencialmente uma pipeline curta de processamento de dados composta por um bloco de processamento de características e um bloco de rede neural (modelo).

Características do Edge Impulse

Depois podes ajustar e analisar as características extraídas pelo bloco de processamento de imagem. Clica em “Image” em “Impulse Design” na barra lateral do Dashboard:

Isto abrirá um novo painel, onde deves selecionar “Grayscale” para o parâmetro Color depth:

Isto significa que vamos converter a imagem para escala de cinzentos, que é mais rápida de processar e consome menos memória. Consequentemente, a deteção de objetos será mais rápida, mas a precisão da deteção provavelmente sofrerá um pouco, pois perdemos a informação de cor.

Explorador de Características

Depois pressiona o botão azul “Save parameters” e depois podes ter de pressionar “Generate Features” para executar o Explorador de Características:

Feature Explorer for grayscale images
Explorador de Características para imagens em escala de cinzentos

O explorador de características converte cada uma das nossas imagens em escala de cinzentos em vetores com 96×96 = 9216 dimensões. Depois projeta-os em duas dimensões e plota-os num plano. Assim, cada ponto no gráfico acima representa uma imagem e a cor indica qual o objeto que a imagem contém.

O que queres ver aqui são pontos da mesma cor agrupados em clusters apertados e que os dois clusters das duas cores diferentes estejam afastados. Isso indica que as características são adequadas para distinguir as duas classes de objetos. Abaixo está um exemplo fictício de um agrupamento muito bom que indicaria que temos características quase perfeitas:

Clustering for near-perfect features
Agrupamento para características quase perfeitas

No meu caso, podes ver que os pontos estão algo agrupados, mas a separação entre clusters não é grande, mas aceitável. Isso significa que não é um problema trivial de deteção e a precisão da deteção de objetos provavelmente não será perfeita.

No entanto, o explorador de características olha apenas para os pixels brutos e o modelo de deteção ainda não foi treinado nem avaliado. Mas o explorador permite experimentar diferentes características. Por exemplo, abaixo mostra o gráfico de características para imagens RGB (em vez de escala de cinzentos):

Feature Explorer for RGB images
Explorador de Características para imagens RGB

Como podes ver, o agrupamento não é muito melhor, se é que é, e por isso mantemos as imagens em escala de cinzentos, pois o nosso tempo de inferência será mais rápido. Nas próximas secções, mostro como treinar e avaliar o modelo. Depois teremos uma melhor compreensão do desempenho da deteção.

Treinar Modelo no Edge Impulse

Para treinar o modelo de deteção, clica em “Object detection” na barra lateral:

Isto abrirá um painel à direita com definições para o processo de treino e um botão azul no final “Save & train”:

Settings for model training
Definições para treino do modelo

Podes manter as definições como estão e funcionará bem. Eu próprio aumentei a Learning rate de 0.001 para 0.01, pois o conjunto de dados é pequeno e o problema de deteção não é muito difícil.

Uma taxa de treino mais alta fará a convergência do processo de treino mais rápida (a perda/erro diminui mais rápido) e podes alcançar maior precisão para o mesmo número de ciclos de treino. No entanto, se a taxa for demasiado alta, o treino não convergirá e o modelo não aprenderá.

Saída do Treino

Podes monitorizar o processo de treino na janela do console chamada Training output. Ali deves ver números a diminuir continuamente para o Train LOSS:

Training output
Saída do treino

Se o Train LOSS subir ou oscilar, a tua learning rate é demasiado alta. O Validation LOSS também deve diminuir continuamente. Se vires que sobe, treinaste por muitas épocas e deves reduzir o número de ciclos de treino.

Quando o treino estiver completo, a plataforma mostra a matriz de confusão e outras métricas de avaliação baseadas no conjunto de validação:

Model evaluation
Avaliação do modelo

No meu caso, obtenho uma matriz de confusão perfeita e um F1 SCORE perfeito de 100%. Na matriz de confusão podes ver que o modelo distingue perfeitamente (100%) entre BACKGROUND, CAR e KUROSUKE.

No entanto, isto é um pouco enganador e não representa o verdadeiro desempenho do modelo em dados novos. A avaliação do modelo é feita no conjunto de validação e, se os dados de treino e validação forem muito pequenos (como no meu caso), a avaliação tende a ser excessivamente otimista. Para uma estimativa mais precisa do desempenho do modelo, deves recolher mais dados de treino.

Também podes ir a “Model testing” e avaliar o desempenho do modelo nos dados de teste:

Como podes ver, a precisão no conjunto de teste é apenas 75%

Model evaluation on test data
Avaliação do modelo em dados de teste

Mas, novamente, o meu conjunto de teste é muito pequeno (12 amostras) e a precisão estimada não será muito fiável.

Implementar Modelo no Edge Impulse

Agora, estamos prontos para implementar o modelo no ESP32-CAM. Clica em “Deployment” em “Impulse Design” na barra lateral do Dashboard:

Isto abrirá um painel com opções de implementação:

Deployment options
Opções de implementação

Podes manter as opções padrão, que devem ser “Arduino library”, “TensorFlow Lite” e “Quantized (int8)” como mostrado acima. Se clicares no botão azul “Build” na parte inferior, a plataforma irá construir uma biblioteca Arduino .ZIP, que podes descarregar:

O nome desta biblioteca é derivado do nome do projeto e do número de implementações. No meu caso é ei-esp32-cam-object-detection-arduino-1.0.13.zip

Instalar Modelo de Deteção no ESP32-CAM

Finalmente, podemos instalar o nosso modelo de deteção treinado no ESP32-CAM. Basta instalar a biblioteca descarregada (ei-esp32-...zip) como habitual no Arduino IDE via Sketch -> Include Library -> Add .ZIP library.

Se for bem-sucedido, podes abrir um sketch chamado “esp32_camera” que está localizado em File -> Examples -> esp32-cam-object-detection_inferencing -> esp32:

O nome do exemplo será o nome do teu projeto (no meu caso esp32-cam-object-detection) com o sufixo “_inferencing”.

Definir Modelo da Câmara

Agora, antes de poderes executar o modelo, há duas alterações importantes a fazer! Primeiro, se olhares para o código do sketch esp32_camera, encontrarás constantes definidas para as placas ESP-EYE e AI-THINKER. Deves comentar ou apagar a constante CAMERA_MODEL_ESP_EYE e descomentar a constante CAMERA_MODEL_AI_THINKER como mostrado abaixo:

Se agora executares o sketch, provavelmente ainda não funcionará! Requer a ESP32 Core Version 2.0.4 instalada! Mais sobre isso na próxima secção.

Instalar ESP32 Core 2.0.4

Em agosto de 2025, o ESP32 Core está na versão 3.3.0. Mas se tentares executar o sketch esp32_camera com esta versão, receberás um erro “cam_hal: DMA overflow“!

Para instalar o ESP32 Core 2.0.4, abre o BOARDS MANAGER e seleciona 2.0.4 para o core esp32. Depois de instalado, deve parecer assim:

ESP32 Core 2.0.4 instalado

Agora, deves conseguir executar o modelo de deteção sem erro. O Arduino IDE indicará que há atualizações para as tuas placas disponíveis:

mas não deves instalá-las, pois isso substituiria o ESP32 Core Version 2.0.4 por uma versão mais recente.

Compilar e Executar Modelo de Deteção no ESP32-CAM

Note que a primeira compilação levará um tempo considerável. 15 minutos ou mais, dependendo do teu sistema! Compilações subsequentes serão mais rápidas.

Depois de compilado e flashado, podes apontar o teu ESP32-CAM para alguns objetos e os resultados da deteção serão impressos no Monitor Serial:

ESP32-CAM with objects to detect
ESP32-CAM com objetos para detetar

Verás o rótulo (classe) do objeto detetado, ex.: “car”, a confiança da deteção, ex.: 0.726 e as coordenadas da caixa delimitadora:

Detection Results printed in Serial Monitor
Resultados da Deteção impressos no Monitor Serial

O sistema também indica quanto tempo uma deteção demora. No meu caso, são 714ms. Note que o tempo de deteção (inferência) é independente do número de amostras de treino e pouco afetado pelo número de objetos a detetar. Por isso, sente-te à vontade para melhorar o desempenho do modelo recolhendo mais dados de treino.

Conclusões e Comentários

Neste tutorial aprendeste a treinar um Modelo de Deteção de Objetos com Edge Impulse e a implementar o modelo num ESP32-CAM.

Note que o Edge Impulse oferece muito mais do que foi abordado neste tutorial e recomendo que leias o Edge Impulse Documentation. Por exemplo, há testes ao vivo do modelo num navegador ou no teu telemóvel – bastante fixe. Para além do ESP32-CAM, existem muitos outros alvos e opções de implementação suportados. E enquanto recolhemos os dados de treino usando um telemóvel, também podes recolher os dados diretamente do dispositivo.

Esta última é a melhor opção, mas um pouco mais complexa (no caso do ESP32-CAM). Porquê melhor? Porque os dados de treino são então recolhidos da mesma câmara que o modelo de deteção usa. Vais notar, se experimentares a classificação ao vivo via telemóvel, que a precisão da deteção é melhor do que a que obténs no ESP32-CAM.

Desvantagens do Edge Impulse com ESP32-CAM

Embora o Edge Impulse facilite muito o treino e implementação de um modelo de visão, há algumas desvantagens. O ESP32-CAM não é diretamente suportado, mas requer apenas uma pequena alteração no código. O maior problema é que o código só funciona com o desatualizado ESP32 2.0.4 Core (agosto 2025), caso contrário recebes o erro “cam_hal: DMA overflow” ao tentar executá-lo.

Além disso, embora a instalação via biblioteca .ZIP seja conveniente, também significa que estás a encher a tua pasta de bibliotecas com várias bibliotecas se estiveres a construir múltiplos projetos. Seria melhor copiar o código diretamente para o sketch para mantê-lo local. Tentei isso, mas não funcionou e provavelmente requer algumas manipulações de caminhos. No entanto, podes implementar o código C++ também, mas não funcionará diretamente no Arduino IDE.

Deteção de objetos no PC

O poder de computação do ESP32-CAM é bastante limitado, pelo que o tempo de deteção é relativamente lento e o modelo não é muito preciso. Se precisares de deteção mais rápida e precisa, podes transmitir o vídeo do ESP32-CAM para o teu PC e executar o modelo de deteção lá. Vê o Object Detection with ESP32-CAM and YOLO tutorial para detalhes sobre isso.

SenseCraft e XIAO ESP32-S3-Sense

Se só queres executar um modelo de deteção de rosto ou pessoa num microcontrolador pequeno, dá uma vista de olhos ao Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI e ao Edge AI Room Occupancy Sensor with ESP32 and Person Detection tutoriais. Lá usamos a plataforma SenseCraft e um microcontrolador XIAO ESP32-S3-Sense. A implementação é mais fácil, mas vais precisar de um segundo microcontrolador. Dá uma vista de olhos.

Alimentado a bateria

Executar um modelo de deteção num microcontrolador abre a porta para um sistema de deteção alimentado a bateria. No entanto, executar o ESP32-CAM continuamente ainda consome bastante bateria. Podes usar um sensor PIR para ativar o sistema de deteção apenas se for detetado movimento. Para detalhes, vê o nosso Motion Activated ESP32-CAM tutorial. E, se fores completamente novo no ESP32-CAM, recomendo também o Programming the ESP32-CAM tutorial.

Se tiveres alguma dúvida, sente-te à vontade para deixá-la na secção de comentários.

Boas experiências a criar 😉