手势识别模型

2. 模型选择与设计

查阅信息

1. 几个手势识别模型

以下是几种常见的手势识别模型:

  1. 传统方法
  • HOG + SVM:Histogram of Oriented Gradients (HOG) 特征提取方法与支持向量机(SVM)分类器结合。
  • Haar-like 特征 + AdaBoost:使用 Haar-like 特征进行特征提取,然后通过 AdaBoost 算法进行分类。
  1. 深度学习方法
  • 卷积神经网络 (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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def __init__(self,learning_rate=0.001):
super(HandGestureCNN,self).__init__()
self.model1=Sequential(
Conv2d(1,32,5),
ReLU(),
MaxPool2d(2),
Dropout(0.2),
Conv2d(32,64,3),
ReLU(),
MaxPool2d(2),
Dropout(0.2),
Conv2d(64,64,3),
ReLU(),
MaxPool2d(2),
Flatten(),
Linear(64*10*10, 128),
ReLU(),
Linear(128,10),
Softmax(dim=1)
)
self.loss_fn=CrossEntropyLoss()
self.optimizer=torch.optim.Adam(self.parameters(),lr=learning_rate)

def forward(self, x):
x = self.model1(x)
return x
  • [] 保存,加载模型检查点(可选)

刚开始进行模型训练,想法是每次训练较少轮数,训练结束后保存模型检查点(包括当前epoch数、模型状态字典以及优化器状态字典),下一次训练加载模型的检查点,如果文件存在,则恢复模型和优化器的状态,并返回上次保存的epoch数加1;否则返回0。
这样就可以在前一次训练的基础上继续训练
但是 使用早停机制更为方便,并且可以防止过拟合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def save_checkpoint(self, epoch, path='checkpoint.pth'):
torch.save({
'epoch': epoch,
'model_state_dict': self.state_dict(),
'optimizer_state_dict': self.optimizer.state_dict()
}, path)

def load_checkpoint(self, path='checkpoint.pth'):
if os.path.exists(path):
checkpoint = torch.load(path)
self.load_state_dict(checkpoint['model_state_dict'])
self.optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
return checkpoint['epoch'] + 1
return 0

EarlyStopping 类

实现早停机制

  • [] 初始化早停机制参数
1
2
3
4
5
6
def __init__(self, patience=5, delta=0):
self.patience = patience
self.delta = delta
self.best_score = None
self.counter = 0
self.early_stop = False
  • [] 比较当前的验证损失
    val_loss 和历史最佳损失,如果当前损失优于历史最佳损失,则更新 best_score 并重置计数器 counter,同时保存当前模型状态;如果当前损失没有改进,则增加计数器 counter。如果计数器达到 patience,则设置 early_stop 标志为真,表示应该停止训练。
1
2
3
4
5
6
7
8
9
10
11
12
def __call__(self, val_loss, model):
if self.best_score is None:
self.best_score = val_loss
elif val_loss < self.best_score - self.delta:
self.best_score = val_loss
self.counter = 0

torch.save(model.state_dict(), 'best_model.pth')
else:
self.counter += 1
if self.counter >= self.patience:
self.early_stop = True

yolov8n

yolov8n和yolov5n进行了尝试,但是在部署阶段,由于模型较为复杂,很多网络层espdl不支持
可能需要重新定义模型
但是模型部署前的训练都已完成,并且识别准确率很高
这部分的文档后续补充,代码已经上传。。期待后面的更新。。。
也期待您提出建议!!

数据标注

  1. YOLO的标签文件需要每一行包含如下信息:
    <class_id> <x_center> <y_center>
  • <class_id>:类别ID,从0开始。
  • <x_center>:目标边界框中心点的x坐标,相对于图片宽度的比例。
  • <y_center>:目标边界框中心点的y坐标,相对于图片高度的比例。
  • :目标边界框的宽度,相对于图片宽度的比例。
  • :目标边界框的高度,相对于图片高度的比例。
  1. 数据集图片已经分类到不同的文件夹中,并且你有一个类名到ID的映射(例如:01_palm -> 0, 10_down -> 9),需要编写一个脚本来生成YOLO格式的标签文件。
  2. github上下载模型,安装依赖

yolov5n

1
2
cd D:/Projects/HandRecog/yolov5
python train.py --img 320 --epochs 1 --data ../dataset/data.yaml --weights yolov5n.pt --batch-size 4 --patience 5 --hyp D:/Projects/HandRecog/yolov5/data/hyps/hyp.scratch-low.yaml --project D:/Projects/HandRecog --name runs