概览
- 时间与性质:2022.09 – 2023.04,广州大学机器人工程专业本科毕业设计,独立完成
- 要解决的问题:用普通单目摄像头识别手势,把手势翻译成移动小车的运动指令,同时提高识别精度和「识别—控制」的协同效果
- 结果:静态手势检测 mAP 81.3%;动态手势识别最高准确率 83.3%;用静态手势实时控制小车完成 10 种运动
我做了什么
- 自建静态手势数据集:用笔记本单目摄像头采集中国数字手势 0–5,5 名测试者,共 4488 张(训练 3740 / 验证 748);专门加入人脸与手势同框、旋转 45° 和镜像样本,贴近真实使用场景
- 改进 YOLOv5s 做静态手势检测:分别引入 CA、CBAM 注意力机制和 CoordConv 坐标卷积做对照实验,选定 CBAM-YOLOv5s——mAP@0.5:0.95 从 80.2% 提升到 81.3%,计算量反而从 16.0 降到 15.8 GFLOPs,并缓解了基线把背景误检为数字 4、5 的问题
- 改进 C3D 做动态手势识别:原始 C3D 在 DSL-46 数据集的 5 类手势上准确率只有 19.2%,损失为 NaN。把视频转成二值视频、将数据扩充到 1260 段,在卷积层后加入 BN 层,学习率从 0.001 降到 0.0001,最高准确率提升到 83.3%,高于同条件下的 R3D(55%)和 R(2+1)D(54%)
- 搭建手势控制小车:树莓派 4B 小车,TB6612FNG 双 H 桥驱动,GPIO 输出 PWM 调速;上位机识别手势后经 WiFi 用 TCP/IP 下发指令,实现停止、前进、后退、左右自旋、加速,以及双手组合的左右转弯和左右后倒车,共 10 种运动
技术细节
静态手势:三种改进的对照
同一数据集、同一训练设置(100 轮,batch 8):
| 模型 | 改动位置 | mAP@0.5:0.95 | 计算量(GFLOPs) |
|---|---|---|---|
| YOLOv5s(基线) | — | 80.2% | 16.0 |
| CA-YOLOv5s | 骨干第 2、3、4 个 C3 模块后加入 Coordinate Attention | 80.6% | 16.0 |
| CBAM-YOLOv5s(选用) | 骨干 C3 模块中加入 CBAM(通道注意力 + 空间注意力) | 81.3% | 15.8 |
| CoordConv-YOLOv5s | Head 中用坐标卷积替换 1×1 卷积,并加在检测头前 | 80.8% | 21.7 |
同一数据集上还对照了更新的 YOLOv7(79.7%)和 YOLOv8s(82.3%)。在 YOLOv5 的三种改进里,CBAM 版本精度最高、计算量也最低。
动态手势:从 19.2% 到 83.3%
- 数据:从公开数据集 DSL-46 中选 5 类常用手势(come、don’t want、fine、go、hello),每类 120 段视频,先拆帧再训练
- 基线:原始 C3D(8 个 3×3×3 卷积层、3 个全连接层)训练 20 轮,损失不下降
- 改动:数据侧加入二值视频,扩充到 1260 段(训练 804 / 验证 204 / 测试 252);模型侧在卷积层后加入 BN(动量 0.9),学习率降到 0.0001,训练 100 轮
| 网络 | 最高准确率 |
|---|---|
| BN-C3D | 83.3% |
| R3D | 55% |
| R(2+1)D | 54% |
从识别结果到小车运动
- 链路:上位机摄像头 → CBAM-YOLOv5s 实时检测 → 手势映射为指令 → WiFi(TCP/IP)→ 树莓派 4B → TB6612FNG → 直流电机
- 硬件:铝合金车架、差速轮、金属齿轮直流电机,两块 7.4 V 锂电池供电;上位机为 i7-12650H + RTX 4060 Laptop
- 软件:Python 3.8、PyTorch 1.13、OpenCV 4.7;通过 VNC 远程登录树莓派部署运动程序
- 指令:单手 0 停止 · 1 前进 · 2 后退 · 3 左自旋 · 4 右自旋 · 5 加速前进;双手组合 1+3 左转弯 · 1+4 右转弯 · 2+3 左后倒车 · 2+4 右后倒车
局限与复盘
- 动态手势没有接进控制:BN-C3D 在验证集上波动大,对自己拍的视频识别很差,实时动态识别达不到控制要求,所以小车只用静态手势控制。原因一是每类只有 120 段视频,二是普通单目摄像头没有深度信息
- 提升幅度有限:手势检测比通用目标检测简单,基线已经有 80.2%,改进只多出约 1 个百分点;YOLOv8s 在同一数据集上达到 82.3%(损失函数不同,不能直接横比)
- 后来的延续:到了 KIT 的 KAL 项目,远处的锥桶同样是小目标问题,我再次用上了注意力机制(Coordinate Attention),并加上了深度相机