Skip to Content

Entrena un modelo de detección de objetos con Edge Impulse para ESP32-CAM

Entrena un modelo de detección de objetos con Edge Impulse para ESP32-CAM

En este tutorial aprenderás a entrenar un modelo de detección de objetos con Edge Impulse para el ESP32-CAM. La recopilación de datos, el etiquetado y el entrenamiento del modelo se realizarán en la plataforma Edge Impulse, pero el modelo de detección se ejecutará directamente en el ESP32-CAM.

Dado que el ESP32-CAM tiene una capacidad de procesamiento limitada, no esperes altas precisiones o velocidades. Sin embargo, existen muchas aplicaciones TinyML donde el ESP32-CAM es suficiente. Por ejemplo, podrías construir una cerradura inteligente con reconocimiento facial que solo te permita el acceso a ti, un alimentador de mascotas que detecte y alimente a tu mascota cuando aparezca, o un sistema de reconocimiento de gestos para controlar luces o electrodomésticos con movimientos de la mano.

Sin embargo, en esta introducción a la detección de objetos con Edge Impulse mantendremos las cosas simples y entrenaremos un sistema que detecta y distingue solo dos objetos.

Partes necesarias

Necesitarás un ESP32-CAM para ejecutar la detección de objetos. Puedes conseguir un ESP32-CAM con un USB-TTL Shield para programarlo o un adaptador FTDI USB-TTL. El adaptador FTDI USB-TTL es un poco más incómodo de usar pero deja los pines GPIO fácilmente accesibles. Para este tutorial, recomendaría el USB-TTL Shield, pero asegúrate de obtener el correcto (ver el Programming the ESP32-CAM tutorial para más detalles).

ESP32-CAM con 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.

¿Qué es Edge Impulse?

Edge Impulse es una plataforma web diseñada para facilitar la creación de modelos de machine learning eficientes para dispositivos embebidos y edge. Permite construir y desplegar aplicaciones TinyML (Tiny Machine Learning) de forma sencilla.

Edge Impulse Workflow
Flujo de trabajo de Edge Impulse (source)

Recopilación y etiquetado de datos

Puedes recopilar datos de una gran variedad de sensores, incluyendo cámaras, micrófonos, acelerómetros, giroscopios, sensores ambientales y más. Hay varias formas de recopilar datos:

  1. Recopilación de datos en vivo vía USB/serial: Las placas de desarrollo compatibles (como ESP32, Arduino Nano 33 BLE Sense o placas ST) pueden conectarse directamente a Edge Impulse Studio para transmitir datos de sensores en tiempo real.
  2. Recopilación remota de datos usando el CLI de Edge Impulse: Para dispositivos sin interfaz o remotos, los usuarios pueden usar el CLI para enviar datos por Wi-Fi o serial a la plataforma Edge Impulse.
  3. App para móvil: La app móvil de Edge Impulse (disponible para Android e iOS) puede usarse para capturar imágenes, audio y datos de movimiento directamente desde tu teléfono y enviarlos al panel de tu proyecto.
  4. Subir conjuntos de datos existentes: Los usuarios pueden importar datos en formatos CSV, JSON o personalizados y etiquetarlos dentro de la interfaz web.
  5. Recopilación continua de datos: Algunos dispositivos pueden configurarse para muestreo continuo y luego segmentar los datos en ventanas manejables.

Una vez recopilados los datos, Edge Impulse ofrece herramientas para el etiquetado. La interfaz permite etiquetar muestras individuales o en lotes grandes. Para datos visuales y de audio, puedes hacer zoom, recortar y anotar eventos o características de interés. La plataforma también soporta etiquetado automático y aumento de datos para mejorar la calidad del conjunto de datos.

Procesamiento de señal y entrenamiento del modelo

Después del etiquetado, los datos pasan por bloques DSP (Procesamiento Digital de Señal), que transforman los datos crudos del sensor en características adecuadas para machine learning. Estos bloques están optimizados para entornos con pocos recursos y son específicos para el tipo de entrada (por ejemplo, MFCC para audio, redimensionado y corrección de color para visión, o FFT para datos de vibración).

Luego viene el entrenamiento del modelo. Edge Impulse ofrece:

  • Clasificación, para detectar presencia/ausencia o identificar clases (por ejemplo, tipos de objetos, palabras habladas).
  • Regresión, para predecir valores continuos (por ejemplo, estimar ángulos, temperatura o posición de objetos).
  • Detección de objetos, para detectar y localizar múltiples objetos en imágenes.
  • Detección de anomalías, para identificar valores atípicos o patrones inusuales sin requerir datos etiquetados.

Puedes usar arquitecturas de modelos preconstruidas del Model Zoo de Edge Impulse, que incluye versiones optimizadas de MobileNet, ResNet y SqueezeNet, entre otros, o definir modelos personalizados usando Keras y TensorFlow Lite. También puedes importar modelos ONNX o TensorFlow.

Optimización y despliegue del modelo

Una vez entrenado el modelo, Edge Impulse ayuda a optimizarlo para su despliegue en edge usando técnicas como cuantización (reducción del tamaño del modelo y mejora de la velocidad de inferencia) y fusión de operadores.

El despliegue es muy flexible, con opciones que incluyen:

  • SDK en C++: Un SDK completamente autónomo que puede integrarse en cualquier proyecto C++. Ideal para microcontroladores y firmware bare-metal.
  • Librería Arduino: Genera automáticamente una librería compatible con Arduino para ejecutar tu modelo en placas como ESP32, Arduino Portenta y Nano 33 BLE.
  • Firmware precompilado: Para dispositivos soportados, Edge Impulse ofrece binarios de firmware con el modelo entrenado integrado, listos para flashear y ejecutar.
  • WebAssembly: Ejecuta modelos en el navegador o en cualquier sistema que soporte WebAssembly.
  • Despliegue basado en Linux: Para dispositivos como Raspberry Pi, BeagleBone o Nvidia Jetson, puedes desplegar usando SDKs de Python o contenedores Docker.

Model Zoo y Transfer Learning

Edge Impulse también te ofrece un pequeño Model Zoo con modelos ligeros y preoptimizado para casos de uso en edge. Estos modelos incluyen:

  • Variantes de MobileNet para clasificación de imágenes
  • FOMO (Fast Object Detection for Microcontrollers), un modelo pequeño de detección de objetos adecuado para aplicaciones en tiempo real
  • Clasificadores de audio compatibles con Syntiant
  • Modelos personalizados para detección de palabras clave
  • Ejemplos de regresión y detección de anomalías

Muchos de estos modelos pueden ajustarse mediante transfer learning, lo que permite alcanzar alta precisión incluso con conjuntos de datos relativamente pequeños, aprovechando pesos preentrenados existentes.

Registro en Edge Impulse

Antes de usar Edge Impulse necesitas registrarte. La buena noticia es que el plan Developer es gratuito. Estarás limitado a tres proyectos privados, pero es suficiente para probar. Ve a https://studio.edgeimpulse.com/signup e introduce tus datos en el formulario:

Edge Impulse signing-up form
Formulario de registro de Edge Impulse

Después de registrarte puedes crear un proyecto, que veremos en la siguiente sección. Si tienes problemas, el Edge Impulse Documentation también puede ayudarte.

Crear proyecto en Edge Impulse

Para crear un proyecto ve a https://studio.edgeimpulse.com/studio/profile/projects, haz clic en el botón «+ Create new project» a la derecha. Se abrirá un diálogo donde puedes poner un nombre al proyecto, por ejemplo «esp32-cam-object-detection» y configurar algunas propiedades, como se muestra a continuación:

Crear proyecto en Edge Impulse

Para el tipo de proyecto, selecciona «Personal» y hazlo privado. Luego simplemente pulsa el botón verde «Create new project» abajo.

Panel de control de Edge Impulse

Tras crear el proyecto deberías ser redirigido al Dashboard. Hay algunas secciones que quiero destacar:

Edge Impulse Dashboard
Panel de control de Edge Impulse

En el centro aparece el nombre de tu proyecto, por ejemplo esp32-cam-object-detection, que puedes editar. En la esquina superior derecha puedes seleccionar la plataforma objetivo.

El AI Thinker ESP32-CAM no aparece como placa soportada, pero sí está la Espressif ESP-EYE, que debes elegir para este tutorial. Con un pequeño cambio el código generado funcionará también para el ESP32-CAM.

En la barra lateral izquierda están las funciones para adquisición de datos y diseño de Impulsos. Un «Impulse» es una pequeña cadena de procesamiento de datos, que contiene el preprocesamiento (por ejemplo, escalado) y el modelo de red neuronal.

Adquisición de datos en Edge Impulse

Edge Impulse soporta varios métodos para recopilar datos. Usaremos el más sencillo, que es recoger imágenes con tu smartphone.

Haz clic en «Data acquisition» en la barra lateral, se abrirá un panel nuevo. A la derecha, bajo «Collect data» haz clic en el enlace «Connect a device»:

Edge Impulse Connect a Device
Edge Impulse conectar un dispositivo

Se abrirá un diálogo con tres opciones. Usa el código QR a la izquierda con tu móvil para abrir una app que te permitirá tomar fotos como muestras de datos con tu teléfono:

Connect Device via QR code
Conectar dispositivo vía código QR

Aquí tienes una imagen de la app tal como aparecerá en tu teléfono tras dar permisos para usar la cámara y tomar fotos:

Edge Impulse Data Collection App
App de recopilación de datos de Edge Impulse

Pulsa el botón azul «Capture» para tomar fotos, que se enviarán a la plataforma Edge Impulse. Allí las etiquetaremos en un segundo paso.

Makkuro Kurosuke y Coche

Para este tutorial usaré dos objetos a detectar, un Makkuro Kurosuke y un coche:

Makkuro Kurosuke and Car
Makkuro Kurosuke y Coche

Por si no lo sabes, Makkuro Kurosuke (o Susuwatari) es un personaje ficticio de la película de Studio Ghibli Mi vecino Totoro, y puede traducirse libremente como «Pequeño duendecillo de hollín». Para el etiquetado, lo llamaré simplemente «Kurosuke».

Estos dos objetos son interesantes para probar la detección de objetos. El Kurosuke es mayormente sin rasgos, solo una bola negra que puede confundirse fácilmente con otros objetos negros. El coche, en cambio, es complejo en forma y el modelo debe aprender una buena representación para detectarlo con fiabilidad.

Si recopilas los datos, asegúrate de hacerlo bajo las mismas condiciones en que se realizará la detección. De lo contrario, el detector probablemente cometerá muchos errores al detectar objetos.

Por ejemplo, cubre diferentes ángulos, distancias, fondos y niveles de iluminación para hacer la detección robusta. A continuación algunos ejemplos de datos que recopilé (y etiqueté):

Example Captures
Ejemplos de capturas

Ten en cuenta que cuanto más cambien las condiciones ambientales, más difícil será la tarea para el detector y más datos necesitarás recopilar. Si quieres simplificar la tarea, usa el mismo fondo, ángulo y luz — en otras palabras: controla el entorno tanto como sea posible.

Etiquetado de datos

Una vez que tengas suficientes fotos de ambos objetos — apunta a un mínimo de 30 fotos por objeto — puedes empezar a etiquetar los datos. Las fotos (muestras) aparecerán a la izquierda y si haces clic en una, verás una vista ampliada en la esquina inferior derecha:

Selecting pictures for labelling
Seleccionar fotos para etiquetar

Allí puedes usar el ratón para dibujar un cuadro delimitador alrededor del objeto a detectar y asignarle una etiqueta, en mi caso «Car» o «Kurosuke»:

Labelling the Car in a picture
Etiquetando el coche en una foto

Debes hacer esto para todas tus imágenes y ser consistente con el etiquetado de los dos (o más) objetos que quieres detectar.

La buena noticia es que la plataforma Edge Impulse propone un cuadro delimitador tras la primera etiqueta, lo que acelera mucho el proceso. Puedes cambiar el tamaño y la ubicación de los cuadros propuestos haciendo clic en los iconos de arrastrar o redimensionar en las esquinas del cuadro.

Crear Impulse en Edge Impulse

Una vez completada la recopilación y etiquetado de datos, haz clic en «Create Impulse» bajo «Impulse Design» en la barra lateral del Dashboard:

Create Impulse
Crear Impulse

Se abrirá el panel con algunos bloques de procesamiento como se muestra a continuación.:

Object Detection Impulse
Impulse de detección de objetos

Inicialmente, los bloques en el panel pueden ser diferentes, pero puedes eliminarlos haciendo clic en el icono de papelera en la esquina inferior derecha de cada bloque. Luego añade nuevos bloques haciendo clic en «Add … block» y seleccionándolos y configurándolos:

Específicamente, necesitas un bloque «Image data» (entrada) con un tamaño de imagen de 96×96 píxeles y modo de redimensionado «Fit longer axis».

Luego un bloque «Image» (procesamiento) y después un bloque de Object Detection (aprendizaje). El último bloque son las características de salida. Ya puedes ver que muestra los dos objetos (Car, Kurosuke) que queremos detectar.

Una vez hecho, has creado un «Impulse», que es esencialmente una pequeña cadena de procesamiento de datos que consiste en un bloque de procesamiento de características y un bloque de red neuronal (modelo).

Características en Edge Impulse

Luego puedes ajustar y analizar las características extraídas por el bloque de procesamiento de imagen. Haz clic en «Image» bajo «Impulse Design» en la barra lateral del Dashboard:

Se abrirá un panel nuevo, donde debes seleccionar «Grayscale» para el parámetro Color depth:

Esto significa que convertiremos la imagen a escala de grises, que es más rápida de procesar y consume menos memoria. En consecuencia, la detección será más rápida pero la precisión probablemente se reduzca un poco, ya que se pierde la información de color.

Explorador de características

Luego pulsa el botón azul «Save parameters» y puede que tengas que pulsar «Generate Features» para ejecutar el explorador de características:

Feature Explorer for grayscale images
Explorador de características para imágenes en escala de grises

El explorador convierte cada una de nuestras imágenes en escala de grises en vectores de 96×96 = 9216 dimensiones. Luego los proyecta a dos dimensiones y los representa en un plano. Así, cada punto en el gráfico representa una imagen y el color indica qué objeto contiene.

Lo que quieres ver aquí es que los puntos del mismo color estén agrupados en racimos compactos y que los dos racimos de colores diferentes estén bien separados. Eso indica que las características son adecuadas para distinguir las dos clases de objetos. A continuación un ejemplo inventado de un agrupamiento muy bueno que indicaría que tenemos características casi perfectas:

Clustering for near-perfect features
Agrupamiento para características casi perfectas

En mi caso, puedes ver que los puntos están algo agrupados pero la separación entre grupos no es muy grande, aunque aceptable. Eso significa que no es un problema trivial y la precisión de la detección probablemente no sea perfecta.

Sin embargo, el explorador solo mira los píxeles crudos y el modelo de detección aún no ha sido entrenado ni evaluado. Pero el explorador permite probar diferentes características. Por ejemplo, a continuación se muestra el gráfico de características para imágenes RGB (en lugar de escala de grises):

Feature Explorer for RGB images
Explorador de características para imágenes RGB

Como ves, el agrupamiento no es mucho mejor, si acaso, por lo que nos quedamos con las imágenes en escala de grises, ya que nuestro tiempo de inferencia será más rápido. En las siguientes secciones te mostraré cómo entrenar y evaluar el modelo. Así entenderemos mejor el rendimiento de la detección.

Entrenar modelo en Edge Impulse

Para entrenar el modelo de detección haz clic en «Object detection» en la barra lateral:

Se abrirá un panel a la derecha con configuraciones para el entrenamiento y un botón azul al final «Save & train»:

Settings for model training
Configuración para el entrenamiento del modelo

Puedes mantener las configuraciones tal cual y funcionará bien. Yo mismo aumenté la tasa de aprendizaje de 0.001 a 0.01, ya que el conjunto de datos es pequeño y el problema de detección no es muy difícil.

Una tasa de aprendizaje más alta hace que la convergencia del entrenamiento sea más rápida (la pérdida/error disminuye más rápido) y puedes lograr mayor precisión con el mismo número de ciclos. Sin embargo, si la tasa es demasiado alta, el entrenamiento no converge y el modelo no aprende.

Salida del entrenamiento

Puedes monitorizar el proceso en la ventana de consola llamada Training output. Allí deberías ver números que disminuyen continuamente para el Train LOSS:

Training output
Salida del entrenamiento

Si el Train LOSS sube o fluctúa, la tasa de aprendizaje es demasiado alta. El Validation LOSS también debería disminuir continuamente. Si sube, entrenaste demasiadas épocas y deberías reducir el número de ciclos.

Una vez finalizado el entrenamiento, la plataforma muestra la matriz de confusión y otras métricas de evaluación basadas en el conjunto de validación:

Model evaluation
Evaluación del modelo

En mi caso, obtengo una matriz de confusión perfecta y un F1 SCORE perfecto del 100%. En la matriz puedes ver que el modelo distingue perfectamente (100%) entre BACKGROUND, CAR y KUROSUKE.

Sin embargo, esto es un poco engañoso y no refleja el rendimiento real del modelo con datos nuevos. La evaluación se hace con el conjunto de validación y si los datos de entrenamiento y validación son muy pequeños (como en mi caso), la evaluación tiende a ser demasiado optimista. Para una estimación más precisa, deberías recopilar más datos de entrenamiento.

También puedes ir a «Model testing» y evaluar el rendimiento del modelo con los datos de prueba:

Como ves, la precisión en el conjunto de prueba es solo del 75%

Model evaluation on test data
Evaluación del modelo con datos de prueba

Pero de nuevo, mi conjunto de prueba es muy pequeño (12 muestras) y la precisión estimada no será muy fiable.

Desplegar modelo en Edge Impulse

Ahora estamos listos para desplegar el modelo en el ESP32-CAM. Haz clic en «Deployment» bajo «Impulse Design» en la barra lateral del Dashboard:

Se abrirá un panel con opciones de despliegue:

Deployment options
Opciones de despliegue

Puedes mantener las opciones por defecto, que deberían ser «Arduino library», «TensorFlow Lite» y «Quantized (int8)» como se muestra arriba. Si haces clic en el botón azul «Build» abajo, la plataforma generará una librería Arduino .ZIP que podrás descargar:

El nombre de esta librería se deriva del nombre del proyecto y el número de despliegues. En mi caso es ei-esp32-cam-object-detection-arduino-1.0.13.zip

Instalar modelo de detección en ESP32-CAM

Finalmente, podemos instalar nuestro modelo entrenado en el ESP32-CAM. Solo instala la librería descargada (ei-esp32-...zip) como de costumbre en el IDE de Arduino vía Sketch -> Include Library -> Add .ZIP library.

Si todo va bien, puedes abrir un sketch llamado «esp32_camera» que está en File -> Examples -> esp32-cam-object-detection_inferencing -> esp32:

El nombre del ejemplo será el de tu proyecto (en mi caso esp32-cam-object-detection) con el sufijo «_inferencing».

Definir modelo de cámara

Ahora, antes de ejecutar el modelo hay dos cambios importantes que hacer. Primero, si miras el código del sketch esp32_camera encontrarás constantes definidas para las placas ESP-EYE y AI-THINKER. Debes comentar o eliminar la constante CAMERA_MODEL_ESP_EYE y descomentar la constante CAMERA_MODEL_AI_THINKER como se muestra a continuación:

Si ahora ejecutas el sketch probablemente aún no funcione. ¡Requiere que esté instalada la ESP32 Core Version 2.0.4! Más sobre esto en la siguiente sección.

Instalar ESP32 Core 2.0.4

A fecha de agosto de 2025, la versión del ESP32 Core es la 3.3.0. Pero si intentas ejecutar el sketch esp32_camera con esta versión, obtendrás un error «cam_hal: DMA overflow«.

Para instalar ESP32 Core 2.0.4 abre el BOARDS MANAGER y selecciona la versión 2.0.4 para el core esp32. Una vez instalado, debería verse así:

ESP32 Core 2.0.4 instalado

Ahora deberías poder ejecutar el modelo de detección sin error. El IDE de Arduino te avisará de actualizaciones disponibles para tus placas:

pero no querrás instalarlas, ya que reemplazarían la versión 2.0.4 del ESP32 Core por una más nueva.

Compilar y ejecutar modelo de detección en ESP32-CAM

Ten en cuenta que la primera compilación tomará bastante tiempo. 15 minutos o más, según tu sistema. Las compilaciones siguientes serán más rápidas.

Una vez compilado y flasheado, puedes apuntar tu ESP32-CAM a algunos objetos y los resultados de detección se imprimirán en el Monitor Serial:

ESP32-CAM with objects to detect
ESP32-CAM con objetos a detectar

Verás la etiqueta (clase) del objeto detectado, por ejemplo «car», la confianza de la detección, por ejemplo 0.726, y las coordenadas del cuadro delimitador:

Detection Results printed in Serial Monitor
Resultados de detección impresos en el Monitor Serial

El sistema también indica cuánto tarda una detección. En mi caso, son 714 ms. Ten en cuenta que el tiempo de detección (inferencia) es independiente del número de muestras de entrenamiento y apenas se ve afectado por el número de objetos a detectar. Así que siéntete libre de mejorar el rendimiento del modelo recopilando más datos de entrenamiento.

Conclusiones y comentarios

En este tutorial aprendiste a entrenar un modelo de detección de objetos con Edge Impulse y desplegarlo en un ESP32-CAM.

Ten en cuenta que Edge Impulse ofrece mucho más de lo cubierto aquí y te recomiendo leer el Edge Impulse Documentation. Por ejemplo, hay pruebas en vivo del modelo en un navegador o en tu móvil, bastante interesante. Más allá del ESP32-CAM, hay muchos otros objetivos y opciones de despliegue soportados. Y aunque recopilamos los datos de entrenamiento con un móvil, también puedes hacerlo desde el dispositivo mismo.

Esta última es la mejor opción pero un poco más compleja (en el caso del ESP32-CAM). ¿Por qué es mejor? Porque los datos de entrenamiento se recopilan con la misma cámara que usa el modelo de detección. Notarás que si pruebas la clasificación en vivo vía móvil, la precisión es mejor que la que obtienes en el ESP32-CAM.

Inconvenientes de Edge Impulse con ESP32-CAM

Aunque Edge Impulse facilita mucho entrenar y desplegar un modelo de visión, hay algunos inconvenientes. El ESP32-CAM no está soportado directamente, pero solo requiere un pequeño cambio en el código. El problema mayor es que el código solo funciona con la versión antigua ESP32 Core 2.0.4 (agosto 2025), de lo contrario obtienes el error «cam_hal: DMA overflow» al intentar ejecutarlo.

Además, aunque la instalación vía librería .ZIP es cómoda, significa que llenas tu carpeta de librerías si haces varios proyectos. Sería mejor copiar el código directamente en el sketch para mantenerlo local. Lo intenté pero no funcionó y probablemente requiere manipulación de rutas. Sin embargo, también puedes desplegar el código C++ pero no funcionará directamente en el IDE de Arduino.

Detección de objetos en PC

La capacidad de cómputo del ESP32-CAM es bastante limitada, por lo que el tiempo de detección es lento y el modelo no es muy preciso. Si necesitas detección más rápida y precisa, puedes transmitir el vídeo del ESP32-CAM a tu PC y ejecutar el modelo allí. Consulta el Object Detection with ESP32-CAM and YOLO tutorial para más detalles.

SenseCraft y XIAO ESP32-S3-Sense

Si solo quieres ejecutar un modelo de detección de caras o personas en un microcontrolador pequeño, echa un vistazo a los Face Detection with XIAO ESP32-S3-Sense and SenseCraft AI y Edge AI Room Occupancy Sensor with ESP32 and Person Detection tutoriales. Allí usamos la plataforma SenseCraft y un microcontrolador XIAO ESP32-S3-Sense. El despliegue es más sencillo pero necesitarás un segundo microcontrolador. Échales un vistazo.

Alimentado por batería

Ejecutar un modelo de detección en un microcontrolador abre la puerta a sistemas de detección alimentados por batería. Sin embargo, mantener el ESP32-CAM encendido continuamente consume bastante batería. Podrías usar un sensor PIR para activar el sistema solo si detecta movimiento. Para más detalles, consulta nuestro Motion Activated ESP32-CAM tutorial. Y si eres completamente nuevo en ESP32-CAM, te recomiendo también el Programming the ESP32-CAM tutorial.

Si tienes alguna pregunta, no dudes en dejarla en la sección de comentarios.

¡Feliz bricolaje! 😉