第1章 项目介绍
1.1 项目功能介绍
本项目实现了基于目标检测的宠物表情识别的功能,训练图片超过一千张,并以这些图片融合了更大的预训练模型提升推理效果。
利用相机获取图像,ESP32S3开发板实现图像识别推理,实时监控宠物表情,如果出现表情“悲伤”“快乐”“生气”等,将上传给上位机,及时向用户提供信息。
本项目依托于2024年寒假练活动平台7:https://www.eetree.cn/task/412 。
根据平台活动要求,本项目已经同步上传至Hackster平台,链接:https://www.hackster.io/inkglede/pet-expression-recognition-system-with-seeed-xiao-esp32s3-df317d
1.2 设计思路
随着科技的日益发展,智能家居已经不是遥不可及的梦想。我们渴望创造一个不仅能让家人更舒适、安全和便捷的家居环境,同时也能让我们的宠物伙伴享受到同等的来自科技的关爱与舒适。
Seeed XIAO ESP32S3 Sense开发板具备摄像头,同时ESP32S3芯片适配嵌入式TinyML AI工具如Edge Impulse和SenseCraft AI,初步具备部署图像识别模型的能力。
矽递科技提供了ModelAssistant这一训练框架,训练完成的模型可以与SenseCraft AI适配。
在线合作数据标注网站roboflow可以快速标注,生成适用于ModelAssistant的数据集。
综上,电子森林与矽递科技提供的若干工具,可以围绕一组动物表情数据集,开展数据标注、数据预处理、模型训练、模型微调、模型部署,最终实现基于目标检测的宠物表情识别的功能。
1.3 硬件框图
XIAO ESP32S3/SIAO ESP32S3感应前端指示图
XIAO ESP32S3/SIAO ESP32S3感应返回指示图
XIAO ESP32S3/SIAO ESP32S3感应引脚列表
1.4 软件流程图
1.5 项目关联文件获取
宠物情绪数据集-分标签,该数据集分好各个标签,配合下文自动标注,可以迅速导出一千多张图片作为训练集。
网盘链接:
链接:https://pan.quark.cn/s/91d5bb453dd8
提取码:HH3G
网站上传内容,ArduinoESP32S3_image.zip:
包含了“拍照代码调试”对应的相机代码,以及部署AI模型所用到的代码“esp32_camera_test_pe.ino”,
还有官方给出的预训练框架的教程,“分类Google-Colab-PFLD-Grove-Example.ipynb”和“目标检测Google-Colab-SWFIT-YOLO-A1101-Example.ipynb”。
还提供了“1epoch_5_int8.tflite”,可以直接部署于SenseCraft AI的“愤怒程度检测模型”,以及“4epoch_5_int8.tflite”宠物表情检测模型。
第2章 硬件介绍
2.1 特性
Seeed Studio XIAO系列是小型开发板,共享类似的硬件结构,尺寸实际上是拇指大小。这里的“XIAO”代表它的尺寸特征“小“,另一层意思是指它的功能强大“骁”。 Seeed Studio XIAO ESP32S3 Sense集成了摄像头传感器、数字麦克风和SD卡支持。结合嵌入式ML计算能力和摄影能力,这款开发板可以成为您开始使用智能语音和视觉AI的绝佳工具。
处理器 | ESP32-S3R8 Xtensa LX7双核32位处理器,工作频率高达240 MHz | 接口 | 1x UART, 1x IIC, 1x IIS, 1x SPI, 11x GPIOs (PWM), 9x ADC, 1x User LED, 1x Charge LED, 1x B2B Connector (with 2 additional GPIOs) 1x Reset button, 1x Boot button |
无线 | 完整的2.4GHz Wi-Fi子系统 BLE:蓝牙5.0,蓝牙网状 | 尺寸 | 21 x 17.5 x 15mm(带扩展板) |
内置传感器 | 适用于1600*1200的OV2640摄像头传感器、数字麦克风 | 输入电压 | 5V(Type-C)、4.2V(BAT) |
存储器 | 片上8M PSRAM和8MB闪存 板载SD卡插槽,支持32GB FAT | 工作温度 | -40°C ~ 65°C |
强大的MCU板:采用ESP32S3 32位双核Xtensa处理器芯片,运行频率高达240 MHz,安装多个开发端口,支持Arduino/MicroPython
高级功能:可拆卸的OV2640相机传感器,分辨率为1600*1200,与OV5640相机传感器兼容,内置额外的数字麦克风
精心设计的电源:锂电池充电管理功能,提供4种功耗模式,可实现低至14μA的深度睡眠模式
拥有更多可能性的美好记忆:提供8MB PSRAM和8MB FLASH,支持用于外部32GB FAT内存的SD卡插槽
出色的射频性能:支持2.4GHz Wi-Fi和BLE双无线通信,连接U.FL天线时支持100m+远程通信
紧凑型设计:21x17.5mm,采用XIAO的经典外形,适用于可穿戴设备等空间有限的项目
来自 SenseCraft Al 的预训练 Al 模型,无需代码即可部署
2.2 参考链接
· [Wiki] 开始使用Seeed Studio XIAO ESP32S3 (Sense)
· 硬件基础教学(Sense版本)
·
o 摄像头使用
o 麦克风使用
· 基于 Seeed Studio XIAO 的教程和项目合集
· 在 XIAO ESP32S3(Sense)上使用 TinyML 教程
· XIAO ESP32S3 Sense成为 Edge Impulse 支持的社区板卡
· PlatformIO新增对XIAO ESP32S3的支持
· XIAO ESP32S3 with MicroPython
第3章 实现的功能及图片展示
3.1 愤怒度识别
该部分只实现有关愤怒的目标检测,并根据宠物表情评估是否生气:
3.2 宠物表情识别
该部分可以识别四种表情。
第4章 主要代码片段及说明
4.1 Robotflow与SenseCraft AI方案
4.1.1 在线部署方案的实现——AI辅助标注教程
创建一个工程,选择追踪,分类项目百度飞浆的Notebook无法训练。
创建几个标签。
数据集上传,提供的数据集已经分好标签,非常容易借助于系统自动标注。
首先点击“save and continue”,上传后才能使用自动标注
建议选择随机四张看标注结果。
点击edit all。
删除到只剩下一个标签
选中四个图片测试效果,由于每次导入都是一个类的标签,所以降低置信度即可。需要的只是追踪,并且对特定类标签。然后点击Auto label。
标注,使用AI辅助。直接关闭浏览器就可以。
每一轮标注完成后,会发邮件提醒。当前(2024年3月)是 Free Beta阶段,免费使用。
标注完成后收到邮件通知,点击review。
接受,然后加入,
这样数据集才会更新。
上述自动标注的原理,可以查看本链接:https://blog.roboflow.com/yolo-world-prompting-tips/
基于以上方案,可以无限快速拓展数据集。
导入完成,点击rebalance,重新配比例,符合训练框架要求。
改为7:3无测试集。
其他选项直接continue,后续creat。然后导出:
选择coco格式:
得到代码:https://app.roboflow.com/ds/idWpYZYX6e?key=6dUnJDONfV
4.1.2 训练
进入飞浆社区,飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com) 。
参考该文档教程:
https://doc.weixin.qq.com/doc/w3_AeEAVwagAOc4L8kgTHcRAeB09lxvL?scode=AGEAZwfLABEAovuSS1AeEAVwagAOc
公开项目中搜索“ModelAssistant”。由于本项目使用图片超过一千张,因此使用了2算力点每小时的服务器。
逐步运行需要修改这个位置为下载代码。
同时修改分类数,%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
接下来导出训练结果为可部署的文件。导出位置为/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
4.1.3 部署
使用该工具,SenseCraft AI (seeed-studio.github.io)
选择导出的epoch_5_int8.tflite 上传后部署,然后推理即可。
4.2 edge impulse与Arduino IDE方案
首先导入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);
第5章 遇到的主要难题及解决方法
5.1 Robotflow与SenseCraft AI——基于AI辅助的数据标注
数据集预处理阶段,roboflow预处理过于繁琐,要求对每张图片标注,年后该平台上线了AI辅助标注的功能,实现了一千多张图片标注。
5.2 edge impulse与Arduino IDE方案
5.2.1 本部分序言与弃用原因
另外,本部分记录调试edge impulse方案。该部分编译过程可能存在报错,编译后可能存在无法运行的情况,比如摄像机无法连接。即使在通过后,具体识别效果也不够好,因为相当于预训练模型加入少数图像微调,很难通过调参等手段进一步优化。
本文认为,解决以上困难的可行途径为进一步更新、适配 edge impulse 平台,包括ESPNN等进一步适配。对用户,可以通过增加训练集的方案。当然,由于edge impulse采用的是少数训练集微调较大模型方案,因此,一些冷门的图像识别需求,不限于分类和目标检测,无法很好地基于通用图像模型完成识别,此时必须寻求其他TinyML方案。本项目作为一个“宠物表情检测”项目,在过去的竞赛以及开源项目相对冷门,基于以下方案的识别效果并不是很好,因此本文最终展示效果的方案,还是采用了4.1和5.1提到的Robotflow与SenseCraft AI方案。
本项目参考以下教程,形成了较为全面的模型部署技术路线:
https://www.hackster.io/mjrobot/tinyml-made-easy-image-classification-cb42ae
本部分参考如下项目的C代码:
https://github.com/Mjrovai/XIAO-ESP32S3-Sense
edge impulse网站教程:
https://studio.edgeimpulse.com/studio/profile/projects?autoredirect=1
5.2.2 硬件准备
内存卡应该格式化。
5.2.3 数据集预处理
本文基于如下图像数据集:
同时,由于采用网络数据集精度有限,采用以下拍照程序,调用seed xiao拍照后形成数据集效果可能更好。
https://drive.weixin.qq.com/s?k=AGEAZwfLABEauo00pUATkA4QaAAGk
5.2.4 在线训练
前期对分类探索,确定了若干在线训练方案,都不尽人意。
最终使用该网站。
创建项目
点击 add existing data ,上传.
上传后
训练设置
设置图像灰度化
生成结果
使用 MobileNet V1 和 α=0.10 时(约 53.2K RAM 和 101K ROM),在另一个极端情况下将获得更小的占用空间。
当我们首次发布这个在 ESP32-CAM 上运行的项目时,我们采用了较低的可能性,这保证了推理延迟小,但精度不高。在第一次测试中,我们将保留这一模型设计(MobileNet V1 和 α=0.10)。
最终训练设定如下
训练结果
已知ESP32 片上8M PSRAM和8MB闪存,所以可以更换更好的模型
如选用MobileNetV2 96x96 0.35 进行二次训练。
接下来导出模型
5.2.5 烧录完成
项目使用 467553 字节(13%)的程序存储空间。最大值为 3342336 字节。
个全局变量使用 32300 个字节(9%)的动态内存,剩下 295380 个字节用于局部变量。最大值为 327680 字节。
第6章 未来的计划或建议
本文认为ESP开发板优质的物联网特性,以及官方给予的充分配套,可以联动旗下的智能家居,实现更多功能。
以手机为中控,借助于手机的算力,单片机作为端侧传感器,可以实现更多有关AI或图形运算等对配置要求更高的项目需求。
基于大模型API,可以实现基于该芯片的智能表盘,在该表盘实现通用人工智能文字问答、文生图、文生视频等若干AI应用。
最后,ESP32S3对应芯片具备一定的AI推理能力,满足部分边缘计算应用场景,是一款较好的开发板。