1 项目需求
基于XIAO ESP32 S3开发板的宠物猫视觉识别检测项目旨在利用深度学习技术和嵌入式系统,实现对宠物猫行为和特征的实时监测和分析。该项目的需求包括硬件设备、软件算法、功能模块和性能指标等多个方面。
硬件设备方面,项目需要XIAO ESP32 S3开发板作为主控制器,搭载摄像头模块用于采集宠物猫的图像数据。摄像头模块需要具备高清晰度和广角视野,以保证对宠物猫的全方位观测。通过摄像头模块采集的视频流,实时检测宠物猫的行为和特征,对监测到的数据进行分析和统计。
软件算法方面,项目需要基于深度学习技术,建立宠物猫的视觉识别模型。识别算法还需要具备一定的鲁棒性,能够在不同光照条件下、不同背景下准确识别宠物猫的行为。利用预训练的深度学习模型对猫咪进行识别,从而实现对家中是否有猫的即时监测。
2 完成的功能及达到的性能
使用XIAO ESP32 S3开发板,通过对OV2640摄像头的控制,利用预训练的深度学习模型对猫咪进行识别,从而实现对家中是否有猫的即时监测,在检测到猫时发出光信号,LED闪烁。
性能如下:
1、实时性:系统需要实时处理摄像头采集的视频流,保证对宠物猫行为的及时监测和反馈。
2、准确性:视觉识别算法需要具备高准确性,能够准确地识别宠物猫特征。
3、稳定性:系统需要稳定运行,长时间连续监测宠物猫,不出现崩溃或异常情况。
4、可扩展性:系统需要具备一定的可扩展性,方便后续对功能和性能进行升级和扩展。
3 实现思路
1、通过Arduino IDE软件,使用图像采集程序,拍摄猫的照片用于后续制作成数据集。
2、使用Robo flow平台,上传猫的照片进行图片数据标注的标签分类,下载数据文件,导出预处理完成的数据。
3、借助AI Studio平台的ModelAssistant项目,进行模型的训练。
4、上传自定义模型至Sense Craft平台,连接开发板,开始进行猫的目标检测识别。
4 实现过程
1、流程图
2、组装XIAO ESP32 S3
3、在Arduino IDE上运行图像采集程序
初始化开发板之后
if(camera_sign && sd_sign){
String command;
// Read incoming commands from serial monitor
while (Serial.available()) {
char c = Serial.read();
if ((c != '\n') && (c != '\r')) {
command.concat(c);
}
else if (c == '\n') {
commandRecv = true;
command.toLowerCase();
}
}
//If command = "capture", take a picture and save it to the SD card
if (commandRecv && command == "capture") {
commandRecv = false;
Serial.println("\nPicture Capture Command is sent");
char filename[32];
sprintf(filename, "/image%d.jpg", imageCount);
photo_save(filename);
Serial.printf("Saved picture:%s\n", filename);
Serial.println("");
imageCount++;
}
}
将 camera_sign 和 sd_sign 用作条件来确定相机和SD卡是否已经初始化成功。接下来,读取串口以接收命令,并在接收到 “capture” 命令时拍摄并保存照片到SD卡中。
接下来将图片保存在SD卡当中。
// 保存图片到SD卡
void photo_save(const char * 文件名) {
// 拍摄照片
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("获取相机帧缓冲区失败");
return;
}
// 保存照片到文件
writeFile(SD, 文件名, fb->buf, fb->len);
// 释放图像缓冲区
esp_camera_fb_return(fb);
Serial.println("照片已保存到文件");
}
其中使用到的writeFile()函数如下
// SD card write file
void writeFile(fs::FS &fs, const char * path, uint8_t * data, size_t len){
Serial.printf("Writing file: %s\n", path);
File file = fs.open(path, FILE_WRITE);
if(!file){
Serial.println("Failed to open file for writing");
return;
}
if(file.write(data, len) == len){
Serial.println("File written");
} else {
Serial.println("Write failed");
}
file.close();
}
4、将采集到的猫的照片上传到Robo Flow平台。
5、将总共1000张猫的照片进行数据标注。
6、将最终的预处理的数据集转化为COCO格式导出。
7、使用AI Studio平台训练模型,引入ModelAssistant项目。
!git clone https://github.com/Seeed-Studio/ModelAssistant.git
%cd ModelAssistant
8、导入需要训练的数据集。
%env DATA_ROOT="https://universe.roboflow.com/ds/aliqVGka4t?key=JibV8Iog4S"
%env NUM_CLASSES=1
9、训练Swift-YOLO Tiny Model。
!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
10、上传模型至SenseCraft平台
5 遇到的主要难题
1、第一次训练的模型识别率正确率较低
第一次训练模型的时候,所使用的数据集太小,仅有两百张图片,训练出来的模型容易将人或者其他物体给识别成猫咪,重新训练模型的时候,使用了更大的数据集,训练了更长的时间,最终训练出来的模型识别准确率才提升上来。
2、无法控制引脚,在使用SenseCraft运行模型的时候,只能进行一个点亮LED灯的操作,无法加入其他代码或者进行其他引脚的操控。
3、在运行过程中,芯片发烫严重。
4、摄像头帧率较低,仅有十几帧,无法保持高帧率的识别。
6 未来的计划建议
该项目已经成功实现了猫的目标识别检测功能,并且能够发出光信号报警,初步达到了预期目标,然而通过添加更多外设
,来实现功能上的拓展和延申:
1、使用的OV2640摄像头分辨率有限,添加更高像素的摄像头可以使识别更加清晰。
2、通过添加一些外设,驱动一些电机,可以实现智能家居上的应用。
3、更换更高主频的芯片,可以提升帧率。
不更换硬件可以提升的地方:
1、采用更大的数据集来训练模型,训练的照片越多,最终模型的识别效果就越好。
2、可以添加更多标签,识别更多种类的宠物。
3、联网后与一些app进行互联,远程控制。
4、使用蓝牙与一些设备互联。