En este artículo Espressif explica cómo configurar ESP-WHO en la placa ESP32-S3-EYE, correr un ejemplo de reconocimiento facial y extenderlo con callbacks de detección personalizados.

¿Qué es ESP-WHO y qué chips soporta?

ESP-WHO es una plataforma de desarrollo de procesamiento de imágenes construida sobre chips Espressif. Ofrece un framework práctico para desarrollar aplicaciones de visión por computador, incluyendo detección de rostros humanos, reconocimiento facial, detección de peatones y lectura de códigos QR.

El framework permite correr cargas de procesamiento de imágenes directamente sobre los SoC de Espressif. Se apoya en la librería ESP-DL para inferencia optimizada de modelos de deep learning y se integra con periféricos comunes como cámaras, pantallas y almacenamiento. La versión actual soporta los chips ESP32-S3 y el más nuevo ESP32-P4.

ESP-WHO usa una arquitectura basada en tareas montada sobre FreeRTOS. Las clases base WhoTaskBase y WhoTask definen un ciclo de vida consistente para las operaciones asíncronas dentro del framework.

Jerarquía de componentes

ESP-WHO organiza la funcionalidad en componentes. El pipeline de captura de frames vive en who_frame_cap, donde WhoFrameCapNode funciona como clase base para los pasos de procesamiento. Los nodos se conectan vía colas y event bits para formar un pipeline asíncrono.

Para detección y reconocimiento, WhoDetect consume frames desde un WhoFrameCapNode y corre un modelo de detección de ESP-DL (por ejemplo, detección facial o de peatones). WhoRecognitionCore extiende la detección agregando extracción y matching de features, gestionando una máquina de estados interna con operaciones ENROLL, RECOGNIZE y DELETE.

El flujo típico se ve así:

Código
Cámara → Captura de frames → Detección → Reconocimiento (opcional) → Salida (LCD/Terminal)

ESP-WHO sigue una arquitectura por capas con ESP-IDF como cimiento. Usa Board Support Packages (BSP) para abstraer diferencias de hardware, de modo que el mismo código de aplicación corre en distintos targets como la ESP32-S3-EYE o la ESP32-P4-Function-EV-Board. Las aplicaciones seleccionan los drivers de hardware correctos en tiempo de compilación a través de archivos de configuración como sdkconfig.bsp.<board_name>.

Los ejemplos actuales soportan estas placas de evaluación:

En el tutorial Espressif usa la ESP32-S3-EYE. Primero compila y corre el ejemplo de reconocimiento facial, y luego lo extiende para encender un LED cada vez que detecta un rostro.

¿Cómo se compila el ejemplo de reconocimiento facial?

La placa ESP32-S3-EYE incluye cámara y display, así que las detecciones se visualizan en tiempo real. El ejemplo también permite gestionar las features faciales (guardar y borrar) mediante botones.

Prerrequisitos

ESP-WHO requiere actualmente ESP-IDF v5.5.x. Antes de empezar hay que confirmar que esa versión esté instalada.

Instalar ESP-IDF v5.5.x

  • Abrir EIM, o instalarlo si no está en la máquina.
  • Elegir Custom installation (la opción rápida instala por defecto ESP-IDF v6).
  • Seleccionar e instalar ESP-IDF v5.5.x (al momento del tutorial, 5.5.4).

!Instalación de ESP-IDF v5.5.4

Compilar y correr el ejemplo

Clonar el repositorio esp-who:

Código
git clone https://github.com/espressif/esp-who.git

Abrir la carpeta esp-who/examples/human-face-recognition. Para correr esp-who hay que configurar un par de flags de CMake. Las instrucciones aplican tanto a VSCode como a CLI.

Desde CLI:

Código
eim select
source ~/.espressif/tools/activate_idf_v5.5.4.sh
idf.py --version
export IDF_EXTRA_ACTIONS_PATH=<ruta>/esp-who/tools/
idf.py -DSDKCONFIG_DEFAULTS=sdkconfig.bsp.esp32_s3_eye set-target esp32s3
idf.py build
idf.py -p <puerto> flash
idf.py -p <puerto> monitor

Durante el arranque deberían aparecer logs mostrando la inicialización de la cámara, los botones y el stack gráfico LVGL, con la cámara OV2640 detectada en la dirección 0x30. Si todo funciona, la salida de la cámara aparece en la pantalla LCD y al apuntarla a un rostro se ven puntos que marcan las features faciales.

!Detección facial en la pantalla LCD

¿Cómo se agrega una acción al detectar un rostro?

El ejemplo usa la clase WhoRecognitionAppLCD, que maneja los frames de la cámara, corre la detección, dibuja bounding boxes alrededor de los rostros detectados y permite enrolar, reconocer o borrar features faciales desde el display.

Para sumar un comportamiento personalizado, basta con crear una subclase de WhoRecognitionAppLCD y sobrescribir el callback detect_result_cb. El resultado de detección llega en el parámetro result_t result, y el método det_res.empty() indica si se encontró algún rostro:

Código
class WhoRecognitionAppLCDWithCallback : public WhoRecognitionAppLCD {
public:
    WhoRecognitionAppLCDWithCallback(who::frame_cap::WhoFrameCap *frame_cap)
        : WhoRecognitionAppLCD(frame_cap) {}

protected:
    virtual void detect_result_cb(const who::detect::WhoDetect::result_t &result) override
    {
        if (!result.det_res.empty()) {
            ESP_LOGI("DETECTION", "Face detected!");
        }
        WhoRecognitionAppLCD::detect_result_cb(result);
    }
};

La herencia desde WhoRecognitionAppLCD permite mantener todo el comportamiento existente y agregar el propio. El initializer list : WhoRecognitionAppLCD(frame_cap) llama al constructor padre, que monta el LCD, el pipeline de cámara y los modelos. Las palabras clave virtual y override le indican al compilador que se está reemplazando la implementación del padre, mientras que la llamada final a WhoRecognitionAppLCD::detect_result_cb(result) reenvía el resultado al padre para que el LCD siga dibujando las cajas de detección y actualizando la UI. Sin esa llamada, el display deja de funcionar.

Al compilar y flashear este firmware, el LED verde se enciende cuando hay un rostro presente y se apaga cuando no.

!Detección facial con LED encendido

¿Por qué importa este tutorial para makers en LatAm?

La ESP32-S3-EYE se vende en distribuidores chilenos como Olimex y MakerLab a un precio cercano a los CLP 35.000-45.000, lo que la convierte en una de las pocas plataformas accesibles para correr visión por computador on-device sin depender de la nube. ESP-WHO baja la barrera de entrada porque entrega los modelos pre-entrenados y los BSP de las placas oficiales: el desarrollador solo escribe la lógica de aplicación.

El stack es totalmente abierto, ESP-IDF + ESP-DL están bajo licencia Apache 2.0 en GitHub, y se puede adaptar a otras placas custom con el mismo chip ESP32-S3 modificando el BSP. Es la combinación de hardware barato, framework abierto y tutorial oficial completo lo que abre la puerta a integrar detección facial en proyectos pequeños sin costo de licencia.