一、ESP-WHO 示例部署1、ESP-WHO概述ESP-WHO 是乐鑫官方开源、面向ESP系列芯片的边缘机器视觉AI开发框架主打低门槛快速实现人脸、物体、手势等视觉AI任务完全基于ESP-IDF构建底层依赖乐鑫自研深度学习库ESP-DL做模型推理加速。核心定位给资源有限的ESP32/ESP32-S3/ESP32-P4等MCU提供开箱即用的视觉流水线不用从零搭建图像采集、预处理、AI推理、结果渲染整套代码。版本适配关系ESP-IDF v5.x → 新版ESP-WHO主分支主推S3、P4ESP-IDF v4.4 → 对应esp-who/idfv4.4分支老ESP32芯片ESP-WHO 提供了人脸检测、人脸识别、行人检测、二维码识别等示例。您可以基于这些示例衍生出丰富的实际应用。ESP-WHO 基于ESP-DL开发配合各种外设可以实现许多有趣的应用。ESP-WHO 支持的开发版ESP32-P4 Function EV Board、ESP32-S3-EYE、ESP32-S3-Korvo-2有的缺货有的成本较高。ESP32-S3-EYE 开发板2、 编译运行 ESP-WHO 示例ESP-WHO 的所有示例都存放在 examples 中进入对应的文件夹执行下面的步骤。添加环境变量export IDF_EXTRA_ACTIONS_PATH/path_to_esp-who/tools/ echo $IDF_EXTRA_ACTIONS_PATH设定目标 SOC 和默认 sdkconfig 配置文件idf.py -DSDKCONFIG_DEFAULTSsdkconfig.bsp.bsp_name set-target esp32xx配置 sdkconfig 选项idf.py menuconfig编译烧录并监视idf.py flash monitor [-p port]ESP32_S3_EYE 配置与编译基于esp32_s3_eye 开发板完整配置与编译步骤下述开发前提环境Ubuntu22.04 IDF5.5。cd /home/tony/esp git clone gitgitee.com:EspressifSystems/esp-who.git export IDF_EXTRA_ACTIONS_PATH/home/tony/esp/esp-who/tools/ cd esp-who/examples/human_face_recognition/ idf.py set-target esp32s3 idf.py -D SDKCONFIG_DEFAULTSsdkconfig.bsp.esp32_s3_eye set-target esp32s3 idf.py menuconfig idf.py update-dependencies idf.py build idf.py flash idf.py monitor二、自定义硬件说明第三方 ESP32-S3-WROOM N16R8 带 DVP 开发板 外接 OV36601. 关键硬件差异跟ESP32_S3_EYE 区别核心模组一致ESP32-S3-WROOM-1 N16R816MB Flash 8MB Octal PSRAMNNA 硬件加速完全相同DVP 摄像头引脚定义完全对齐 ESP32-S3-EYE 官方标准DVP 总线 GPIO 一一对应都支持 OV2640/OV3660 DVP 摄像头ESP-WHO 相机底层驱动通用硬件模块ESP32-S3-EYE乐鑫原厂第三方 S3-WROOM N16R8 DVP 开发板摄像头板载 OV2640自带独立相机 LDO 电源软件自动上电外接 OV3660无专用相机电源电路需外部 3.3V 供电LCD 屏幕板载 ST7789 SPI 小屏BSP 内置 LCD 引脚、背光控制无自带 LCDSPI 屏需要额外接线引脚自定义麦克风内置 PDM 数字麦ESP-ADF 语音开箱即用无板载麦克风SD 卡槽自带 TF 卡槽人脸库可存 SD 卡无板载 SD 卡人脸模板只能存在 Flash 分区按键 / LED板载功能按键、状态 LEDBSP 封装按键录入人脸逻辑仅有通用 IO录入人脸需要外接按键或串口指令触发BSP 原生适配ESP-WHO 内置esp32_s3_eye/esp32_s3_eye_noglib官方配置无专属官方 BSP 配置文件只能两种方案1. 复用 S3-EYE 相机配置关闭 LCD / 麦 / SD2. 自建自定义 bsp 配置电源噪声相机独立供电图像横纹、噪点极少共用主板 3.3V布线差容易图像干扰2. 关键移植内容LCD (ST7789) 引脚#define BSP_LCD_SPI_MOSI (GPIO_NUM_20) #define BSP_LCD_SPI_CLK (GPIO_NUM_19) #define BSP_LCD_SPI_CS (GPIO_NUM_45) #define BSP_LCD_DC (GPIO_NUM_47) #define BSP_LCD_RST (GPIO_NUM_NC) #define BSP_LCD_BACKLIGHT (GPIO_NUM_48)关键驱动修改SPI 模式改为spi_mode 0背光反向关闭.flags.output_invert false背光避开 SD 卡冲突GPIO38 → GPIO48三、完整移植步骤因为第三方 ESP32-S3-WROOM 开发板与ESP32-S3-EYE开发板核心与摄像头接口一致项目移植时可借用sdkconfig.bsp.esp32_s3_eye 配置文件增加修订 LCD ST7789 的配置项目基础功能就可以编译运行起来。1、硬件引脚固化修改managed_components/espressif__esp32_s3_eye/include/esp32_s3_eye.h① LCD ST7789 引脚// Display #define BSP_LCD_SPI_MOSI (GPIO_NUM_20) #define BSP_LCD_SPI_CLK (GPIO_NUM_19) #define BSP_LCD_SPI_CS (GPIO_NUM_45) #define BSP_LCD_DC (GPIO_NUM_47) #define BSP_LCD_RST (GPIO_NUM_NC) #define BSP_LCD_BACKLIGHT (GPIO_NUM_48) // Camera OV3660原厂引脚和当前硬件完全匹配无需改动 #define BSP_CAMERA_XCLK (GPIO_NUM_15) #define BSP_CAMERA_PCLK (GPIO_NUM_13) #define BSP_CAMERA_VSYNC (GPIO_NUM_6) #define BSP_CAMERA_HSYNC (GPIO_NUM_7) #define BSP_CAMERA_D0 (GPIO_NUM_11) #define BSP_CAMERA_D1 (GPIO_NUM_9) #define BSP_CAMERA_D2 (GPIO_NUM_8) #define BSP_CAMERA_D3 (GPIO_NUM_10) #define BSP_CAMERA_D4 (GPIO_NUM_12) #define BSP_CAMERA_D5 (GPIO_NUM_18) #define BSP_CAMERA_D6 (GPIO_NUM_17) #define BSP_CAMERA_D7 (GPIO_NUM_16)② 修改esp32_s3_eye.c两处驱动参数SPI 模式修正esp_lcd_panel_io_spi_config_t io_config { .dc_gpio_num BSP_LCD_DC, .cs_gpio_num BSP_LCD_SPI_CS, .pclk_hz BSP_LCD_PIXEL_CLOCK_HZ, .lcd_cmd_bits LCD_CMD_BITS, .lcd_param_bits LCD_PARAM_BITS, .spi_mode 0, // 原厂2改为0适配外置ST7789 .trans_queue_depth 10, };背光 PWM 关闭反向输出const ledc_channel_config_t LCD_backlight_channel { .gpio_num BSP_LCD_BACKLIGHT, .speed_mode LEDC_LOW_SPEED_MODE, .channel LCD_LEDC_CH, .intr_type LEDC_INTR_DISABLE, .timer_sel 1, .duty 0, .hpoint 0, .flags.output_invert false // 原厂true改为false高电平点亮背光 };2、idf.py menuconfig 必须修改的配置项进入配置界面命令idf.py set-target esp32s3 idf.py -D SDKCONFIG_DEFAULTSsdkconfig.bsp.esp32_s3_eye set-target esp32s3 idf.py menuconfig① 芯片与基础硬件Serial flasher configFlash size16MB硬件 16MB flashPSRAM modeOctal PSRAMPSRAM clock80MHzComponent config → ESP PSRAM✅ Support external SPI RAM✅ Map rodata to PSRAM日志里提示复制模型到 PSRAM必须开启✅ Map instruction to PSRAM可选释放内部 RAM② BSP 板卡选择关键Component config → ESP BSP → Board selection选中ESP32-S3-EYE不要选其他板子否则引脚宏全部错乱③ 摄像头 Camera 配置OV3660 专属Component config → ESP CameraCamera sensor typeOV3660Pixel formatRGB565匹配 LCD 显示格式Frame size推荐 QVGA (320×240) / 480×360人脸识别不要开太高分辨率XCLK frequency20MHz和硬件 XCLK 15 脚输出匹配DVP GPIO override关闭我们已经在 BSP 头文件写死引脚这里不要覆盖SCCB I2C portI2C0SDA4,SCL5 固定④ LCD LVGL 配置Component config → ESP BSP → Display✅ Enable display support必须开启禁用则无屏幕Backlight LEDC channel1代码里 timer1保持一致LVGL 配置✅ Enable LVGL GUI libraryLVGL buffer placementPSRAM画面帧缓存放外部内存Tick period ms10默认即可⑤ ESP-WHO 人脸识别框架配置Component config → ESP-WHOModel storage locationPSRAM模型大必须放 PSRAMFace recognition database存储介质SPIFFS / FATFS Flash二选一默认 SPIFFS 够用Max registered faces可改成 30支持最多 30 张人脸录入Inference optimization✅ Use PSRAM for model tensor bufferQuantization typeint8S3 最优速度⑥ 串口调试Component config → ESP System SettingsConsole UARTUART0TX43 RX44原厂默认不要改否则串口无法打印⑦ 内存与编译优化防内存溢出Component config → Compiler optionsStack size of main task≥8192Enable extra heap tracing调试内存泄漏可选3、app_main.cpp 最小标准代码#include frame_cap_pipeline.hpp #include who_recognition_app_lcd.hpp #include who_spiflash_fatfs.hpp using namespace who::frame_cap; using namespace who::app; extern C void app_main(void) { vTaskPrioritySet(xTaskGetCurrentTaskHandle(), 5); #if CONFIG_DB_FATFS_FLASH ESP_ERROR_CHECK(fatfs_flash_mount()); #elif CONFIG_DB_SPIFFS ESP_ERROR_CHECK(bsp_spiffs_mount()); #endif auto frame_cap get_dvp_frame_cap_pipeline(); auto recognition_app new WhoRecognitionAppLCD(frame_cap); recognition_app-run(); }4、编译烧录流程# 清理旧编译缓存 idf.py clean # 编译 idf.py build # 烧录串口监视 idf.py flash monitor