很多人在使用ESP32时,通常会停留在点灯、拍照或连接Wi-Fi的基础阶段。那么,如果我们尝试再向前迈进一步,让ESP32能够自主“看懂”宠物的表情,并判断它处于生气、开心还是难过的状态,这将会带来怎样的可能性?
本项目正是基于 XIAO ESP32S3 Sense 开发板,完整地实践了从数据集构建、AI辅助标注、模型训练到端侧部署推理的 TinyML 图像目标检测 全流程。这并非简单地调用云端API或运行演示程序,而是真正将训练好的模型部署在开发板上,实现对宠物情绪的实时判断。
1. 项目功能介绍
本项目实现了基于目标检测的宠物表情识别功能。我们使用了超过一千张图片进行训练,并通过融合更大的预训练模型来提升推理效果。
系统利用摄像头获取图像,由ESP32S3开发板执行图像识别与推理,从而实时监控宠物的表情状态。当检测到“悲伤”、“快乐”或“生气”等特定表情时,系统会将信息上传至上位机,及时向用户发出提醒。
根据平台活动要求,本项目已同步上传至Hackster平台,链接为: https://www.hackster.io/inkglede/pet-expression-recognition-system-with-seeed-xiao-esp32s3-df317d
2. 设计思路
随着科技的发展,智能家居已不再是遥不可及的梦想。我们期望创造一个不仅能提升家人舒适、安全与便捷的生活环境,也能让宠物伙伴享受到同等科技关怀的家居系统。
Seeed XIAO ESP32S3 Sense 开发板集成了摄像头模组,同时其搭载的ESP32-S3芯片能够很好地适配诸如Edge Impulse和SenseCraft AI这类嵌入式TinyML AI工具,初步具备了部署图像识别模型的能力。
矽递科技(Seeed Studio)提供的ModelAssistant训练框架,其训练完成的模型可与SenseCraft AI工具链无缝对接。而在线协作数据标注平台Roboflow则能帮助我们快速完成数据标注,生成适用于ModelAssistant框架的数据集。
综上所述,结合电子森林与矽递科技提供的系列工具,我们可以围绕一组宠物表情数据集,系统地开展数据标注、预处理、模型训练、微调及部署工作,最终实现基于目标检测的宠物表情识别功能。
3. 硬件框图
XIAO ESP32S3 Sense 开发板正面功能指示图:

XIAO ESP32S3 Sense 开发板背面引脚图:

XIAO ESP32S3 Sense 开发板引脚功能列表:


4. 软件流程图

5. 项目关联文件获取
本项目使用的宠物情绪数据集已按标签分类。配合下文介绍的自动标注流程,可以快速导出一千多张图片作为训练集。
硬件介绍
1. 特性
Seeed Studio XIAO 系列是小型化开发板,共享相似的硬件架构,其尺寸仅拇指大小。“XIAO”一词既代表了其“小”的尺寸特征,也寓意其功能“骁”勇强大。XIAO ESP32S3 Sense 集成了摄像头传感器、数字麦克风并支持SD卡。结合其嵌入式机器学习计算能力与影像采集能力,这款开发板是开始探索智能语音与视觉AI应用的绝佳工具。
| 处理器 |
ESP32-S3R8 Xtensa® LX7 双核32位处理器,主频高达240 MHz |
接口 |
1x UART, 1x IIC, 1x IIS, 1x SPI, 11x GPIO (PWM), 9x ADC, 1x 用户LED, 1x 充电LED, 1x B2B连接器(附带2个额外GPIO) 1x 复位按钮, 1x 启动按钮 |
| 无线 |
完整的2.4GHz Wi-Fi子系统 BLE:蓝牙5.0,蓝牙Mesh |
尺寸 |
21 x 17.5 x 15mm(包含扩展板) |
| 内置传感器 |
OV2640摄像头传感器(支持1600*1200分辨率)、数字麦克风 |
输入电压 |
5V(Type-C接口)、4.2V(电池接口) |
| 存储器 |
片上8MB PSRAM 和 8MB Flash 板载SD卡插槽,支持32GB FAT格式 |
工作温度 |
-40°C ~ 65°C |
- 强大的MCU:采用ESP32-S3 32位双核Xtensa处理器,主频高达240 MHz,提供多种开发端口,支持Arduino/MicroPython开发环境。
- 高级功能:配备可拆卸的OV2640摄像头传感器(分辨率1600*1200,兼容OV5640),并内置数字麦克风。
- 精心设计的电源管理:支持锂电池充电管理,提供4种功耗模式,深度睡眠模式下功耗可低至14μA。
- 充裕的存储空间:提供8MB PSRAM和8MB Flash,并支持通过SD卡插槽扩展外部存储(最大32GB FAT)。
- 出色的射频性能:支持2.4GHz Wi-Fi和BLE双模无线通信,连接U.FL天线时可实现100米以上的远程通信。
- 紧凑型设计:尺寸为21x17.5mm,采用XIAO经典外形,非常适合可穿戴设备等空间受限的项目。
- 便捷的AI部署:可直接使用来自SenseCraft AI的预训练模型,实现无需编写代码的快速模型部署。
实现的功能及图片展示
1. 愤怒度识别
此部分功能专注于检测与“愤怒”相关的目标,并根据宠物表情评估其生气程度:



2. 宠物表情识别
此部分功能可以识别“愤怒”、“快乐”、“悲伤”和“其他”四种表情类别。



主要代码片段及说明
1. Robotflow与SenseCraft AI方案
1) 在线部署方案的实现——AI辅助标注教程
首先在Roboflow上创建一个项目,选择“Object Detection”类型。请注意,百度飞桨的Notebook不支持训练分类项目。

为项目创建几个对应的标签,例如ANGRY, HAPPY, SAD, OTHER。

上传数据集。本项目提供的数据集已按标签分类,这极大方便了后续的系统自动标注工作。

首先点击“Save and Continue”,完成上传后才能使用自动标注功能。

建议随机选择四张图片预览自动标注的结果。

点击“Edit All”编辑所有类别的设置。

由于每次导入的都是单一类别的标签,可以删除其他标签,只保留我们需要的一个(例如,当前批次是“Happy”),然后降低置信度阈值。

选中四张测试图片查看效果。由于需求是目标检测并对特定类别打标,适当降低置信度阈值后,点击“Auto Label With This Model”。

系统将使用AI模型进行辅助标注。标注作业提交后,关闭浏览器即可,后台会进行处理。在Free Beta阶段(截至2024年3月),该功能可免费使用。

标注完成后,你会收到邮件通知。登录后,进入“Review”环节审核标注结果。

接受满意的标注结果,并将其“Add Images To Dataset”。

这样,数据集才会得到更新。上述自动标注的原理,可以查看Roboflow官方博客关于YOLO-World提示工程的介绍:https://blog.roboflow.com/yolo-world-prompting-tips/ 。基于此方案,可以高效、快速地扩展数据集。
所有类别的图片都导入并标注完成后,点击“Rebalance”重新分配训练集、验证集和测试集的比例,以符合训练框架的要求。

将比例调整为7:3(训练集:验证集),不设独立测试集。

其他选项保持默认,点击“Continue”,然后“Create”新版本。完成后,进入导出界面。

选择“COCO”格式进行导出。

你将获得一个包含数据集下载代码的链接,例如:https://app.roboflow.com/ds/idWpYZYX6e?key=6dUnJDONfV 。利用Roboflow等平台进行AI辅助标注和数据管理,是构建高质量开源实战项目数据集的有效方法。
2) 训练
进入百度飞桨AI Studio星河社区: https://aistudio.baidu.com 。
参考官方文档教程进行项目配置。
在公开项目中搜索“ModelAssistant”。由于本项目使用的图片超过一千张,建议使用提供2算力点/小时的服务器进行训练。
在Notebook中逐步运行代码时,需要修改以下位置,替换为从Roboflow获得的下载代码。

同时,根据你的分类数量修改环境变量:
%env NUM_CLASSES=4
请注意,每次重启环境后可能需要重新安装部分依赖库。依次运行每个单元格后,训练好的模型可以从以下路径下载:/home/aistudio/ModelAssistant/work_dirs/swift_yolo_tiny_1xb16_300e_coco/epoch_5_int8.tflite。
以下为模型训练的核心命令。num_classes 参数需根据你的分类数进行设置。
!python tools/train.py \
configs/swift_yolo/swift_yolo_tiny_1xb16_300e_coco.py \
--cfg-options \
epochs=10 \
num_classes=${NUM_CLASSES} \
workers=1\
imgsz=192,192 \
data_root=${DATA_ROOT} \
load_from=https://files.seeedstudio.com/sscma/model_zoo/detection/person/person_detection.pth
训练完成后,使用以下命令验证模型性能。
!python tools/inference.py \
configs/swift_yolo/swift_yolo_tiny_1xb16_300e_coco.py \
"$(cat work_dirs/swift_yolo_tiny_1xb16_300e_coco/last_checkpoint)" \
--dump work_dirs/swift_yolo_tiny_1xb16_300e_coco/last_checkpoint.pkl \
--cfg-options \
data_root=${DATA_ROOT} \
num_classes=${NUM_CLASSES} \
workers=1 \
imgsz=192,192
接下来,导出训练结果为可在边缘设备部署的 .tflite 文件。导出文件位于:/home/aistudio/ModelAssistant/work_dirs/swift_yolo_tiny_1xb16_300e_coco/epoch_5_int8.tflite。
!python tools/export.py \
configs/swift_yolo/swift_yolo_tiny_1xb16_300e_coco.py \
$(cat work_dirs/swift_yolo_tiny_1xb16_300e_coco/last_checkpoint) \
--cfg-options \
data_root=${DATA_ROOT} \
num_classes=${NUM_CLASSES} \
imgsz=192,192
3) 部署
使用SenseCraft AI Web Toolkit工具进行部署: https://seeed-studio.github.io/SenseCraft-Web-Toolkit/#/setup/process。
选择上一步导出的 epoch_5_int8.tflite 模型文件上传,按照向导完成部署,之后即可进行实时推理。
2. edge impulse与Arduino IDE方案
首先,在代码中导入Edge Impulse生成的AI模型推理库。
#include <Pet_Expression_inferencing.h>
#include "edge-impulse-sdk/dsp/image/image.hpp"
在程序的主循环中,调用以下函数来运行模型推理并获取结果。
// Run the classifier
ei_impulse_result_t result = { 0 };
EI_IMPULSE_ERROR err = run_classifier(&signal, &result, debug_nn);
if (err != EI_IMPULSE_OK) {
ei_printf("ERR: Failed to run classifier (%d)\n", err);
return;
}
// print the predictions
ei_printf("Predictions (DSP: %d ms., Classification: %d ms., Anomaly: %d ms.): \n",
result.timing.dsp, result.timing.classification, result.timing.anomaly);
遇到的主要难题及解决方法
1. Robotflow与SenseCraft AI——基于AI辅助的数据标注
在数据集预处理阶段,早期Roboflow平台的手动标注流程较为繁琐,要求对每张图片逐一标注。幸运的是,该平台在近期上线了AI辅助标注功能。我们利用此功能,高效地完成了对一千多张图片的标注工作,极大地提升了数据准备的效率。这个过程涉及人工智能中的计算机视觉模型应用,是项目成功的关键步骤。
2. edge impulse与Arduino IDE方案
1) 本部分序言与弃用原因
此部分记录了使用Edge Impulse方案的调试过程。该方案在编译过程中可能遇到报错,编译成功后也可能出现诸如摄像头无法连接等运行问题。即使在成功运行后,其具体识别效果也未能达到预期。因为该方案本质上是利用少量图像在一个较大的通用预训练模型上进行微调,仅通过调参等手段很难获得显著优化。
本文认为,解决上述困难的可行途径包括进一步更新和适配Edge Impulse平台及其模型(如ESPNN)。对于用户而言,增加训练集规模也是一个方向。然而,由于Edge Impulse采用的“小样本微调大模型”方案,对于一些相对冷门的图像识别需求(不限于分类和目标检测),可能无法很好地基于通用图像模型完成识别,此时必须寻求其他TinyML方案。作为一个“宠物表情检测”项目,它在过去的竞赛和开源项目中相对冷门,基于Edge Impulse方案的识别效果并不理想。因此,本文最终用于展示效果的方案,仍采用了上文提到的Roboflow与SenseCraft AI组合方案。
本项目在探索过程中参考了以下教程,形成了较为全面的模型部署技术路线:
2) 硬件准备
在使用SD卡存储数据或模型时,建议先对SD卡进行格式化操作。

3) 数据集预处理
本方案尝试了不同的图像数据集来源。同时,由于网络数据集的精度有限,我们也尝试通过调用Seeed XIAO的拍照程序自行采集图像来构建数据集,以期获得更好的效果。
4) 在线训练
前期探索了多种在线分类训练方案后,最终选定了Edge Impulse平台。
创建新项目。

点击“Add existing data”,上传准备好的数据集。

上传完成后的数据总览。

进入“Impulse design”环节,设计数据处理流水线。

在图像处理块中,可以选择将图像转换为灰度图以减少计算量。

保存配置后,点击“Generate features”生成特征。

选择模型。例如,使用 MobileNet V1 且 α=0.10 时,模型占用空间较小(约53.2KB RAM和101KB ROM),但精度可能不是最高。在首次测试中,我们采用了这一轻量级设计。

最终训练参数设置如下。

训练完成后的结果评估。

考虑到ESP32-S3拥有8MB PSRAM和8MB Flash,可以尝试更换更复杂的模型(如MobileNetV2 96x96 0.35)进行二次训练以提升精度。
训练完成后,进入部署环节,选择“Arduino library”格式导出。

5) 烧录完成
将导出的库添加到Arduino IDE中,编译并烧录程序到开发板。编译信息显示,程序占用了约13%的Flash空间和9%的动态内存,资源使用在合理范围内。


未来的计划或建议
本文认为,ESP32系列开发板优秀的物联网特性,加上官方提供的丰富配套工具链,使其能够与其生态系统内的智能家居设备联动,实现更复杂的应用。例如,以手机作为中控中心,利用其强大的算力,而将ESP32作为端侧传感器节点,可以承担起对配置要求更高的AI或图形运算项目的部分工作。
基于大语言模型(LLM)的API,甚至可以考虑在该芯片上实现智能交互表盘,集成通用AI文字问答、文生图等轻量化AI应用。
最后,ESP32-S3芯片本身具备一定的AI推理能力,能够满足部分边缘计算场景的需求,是一款非常出色且具有潜力的开发平台。希望本文详实的流程记录能为你提供有价值的参考,更多关于嵌入式AI和物联网开发的深度讨论,欢迎访问云栈社区进行交流。