手势识别模型部署在esp32s3(三)
手势识别模型
2. 模型选择与设计
查阅信息
1. 几个手势识别模型
以下是几种常见的手势识别模型:
- 传统方法
- HOG + SVM:Histogram of Oriented Gradients (HOG) 特征提取方法与支持向量机(SVM)分类器结合。
- Haar-like 特征 + AdaBoost:使用 Haar-like 特征进行特征提取,然后通过 AdaBoost 算法进行分类。
- 深度学习方法
- 卷积神经网络 (CNN):例如LeNet, AlexNet, VGG, ResNet等,用于特征提取和分类。
- 区域卷积神经网络 (R-CNN):如 Faster R-CNN、Mask R-CNN,用于目标检测。
- YOLO (You Only Look Once):YOLOv3, YOLOv4, YOLOv5, YOLOv8等,用于实时目标检测和识别。
- SSD (Single Shot MultiBox Detector):用于实时目标检测。
- MobileNet:轻量级卷积神经网络,适用于移动设备。
- OpenPose:用于人体关键点检测的深度学习模型。
2. 适合部署在硬件上的模型
在硬件上部署模型时,需要考虑模型的计算复杂度、内存需求以及推理速度。以下是几种适合部署在硬件上的轻量级模型:
- MobileNet:特别设计用于移动和嵌入式设备,计算效率高。
- YOLOv5/YOLOv8:其中的轻量级版本(如YOLOv5s/YOLOv8s)在嵌入式设备上表现良好。
- Tiny-YOLO:YOLO的精简版本,适合资源受限的设备。
- SqueezeNet:一种小型化的CNN,减少参数量和计算量。
- EfficientNet-Lite:EfficientNet的轻量级版本,专为移动设备优化。
3. 部署到硬件上的难点
- 计算资源有限:嵌入式设备通常计算能力和内存有限,需要优化模型的大小和计算复杂度。
- 功耗限制:移动设备的电池寿命是一个重要考虑因素,高效的模型设计和计算方法是必要的。
- 实时性要求:手势识别通常需要实时处理,模型需要具备快速推理能力。
- 硬件兼容性:不同的硬件平台(如NVIDIA Jetson, Raspberry Pi, FPGA, DSP等)对模型优化和部署有不同的要求。
- 软件支持:需要合适的软件框架和工具链(如TensorFlow Lite, ONNX Runtime, OpenVINO等)来支持模型部署和推理。
部署优化技巧
- 模型剪枝和量化:减少模型参数和计算量,提升推理速度。
- 硬件加速:利用硬件的加速能力,如GPU, NPU, TPU等。
- 混合精度计算:使用FP16或INT8计算代替FP32,提高计算效率。
- 输入分辨率调整:根据应用场景适当降低输入分辨率,减少计算负荷
cnn模型
HandGestureCNN 类
- [] 构造初始化模型架构和优化器,定义损失函数
1 | def __init__(self,learning_rate=0.001): |
- [] 保存,加载模型检查点(可选)
刚开始进行模型训练,想法是每次训练较少轮数,训练结束后保存模型检查点(包括当前epoch数、模型状态字典以及优化器状态字典),下一次训练加载模型的检查点,如果文件存在,则恢复模型和优化器的状态,并返回上次保存的epoch数加1;否则返回0。
这样就可以在前一次训练的基础上继续训练
但是 使用早停机制更为方便,并且可以防止过拟合
1 | def save_checkpoint(self, epoch, path='checkpoint.pth'): |
EarlyStopping 类
实现早停机制
- [] 初始化早停机制参数
1 | def __init__(self, patience=5, delta=0): |
- [] 比较当前的验证损失
val_loss 和历史最佳损失,如果当前损失优于历史最佳损失,则更新 best_score 并重置计数器 counter,同时保存当前模型状态;如果当前损失没有改进,则增加计数器 counter。如果计数器达到 patience,则设置 early_stop 标志为真,表示应该停止训练。
1 | def __call__(self, val_loss, model): |
yolov8n
yolov8n和yolov5n进行了尝试,但是在部署阶段,由于模型较为复杂,很多网络层espdl不支持
可能需要重新定义模型
但是模型部署前的训练都已完成,并且识别准确率很高
这部分的文档后续补充,代码已经上传。。期待后面的更新。。。
也期待您提出建议!!
数据标注
- YOLO的标签文件需要每一行包含如下信息:
<class_id> <x_center> <y_center>
- <class_id>:类别ID,从0开始。
- <x_center>:目标边界框中心点的x坐标,相对于图片宽度的比例。
- <y_center>:目标边界框中心点的y坐标,相对于图片高度的比例。
:目标边界框的宽度,相对于图片宽度的比例。 :目标边界框的高度,相对于图片高度的比例。
- 数据集图片已经分类到不同的文件夹中,并且你有一个类名到ID的映射(例如:01_palm -> 0, 10_down -> 9),需要编写一个脚本来生成YOLO格式的标签文件。
- github上下载模型,安装依赖
yolov5n
1 | cd D:/Projects/HandRecog/yolov5 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hatty~de 秘密基地!
评论