Windows 10下用YOLOv5搞个手势识别,从装Anaconda到调用摄像头,保姆级避坑记录
Windows 10下从零实现YOLOv5手势识别:一位自学者的实战笔记
去年夏天,当我第一次看到有人用手势控制PPT翻页时,这个看似魔法的交互方式立刻吸引了我。作为一个非计算机专业的普通用户,我决定挑战自己,用YOLOv5实现这个功能。经过三周的摸索和无数次的失败,我终于在Windows 10上成功搭建了完整的手势识别系统。本文将分享这段从Anaconda安装到摄像头调用的完整历程,特别是那些官方文档没提到的"坑"和解决方案。
1. 开发环境搭建:避开版本冲突陷阱
在开始前,我花了整整两天时间研究版本兼容性问题。YOLOv5官方推荐Python≥3.7和PyTorch≥1.6,但实际配置时发现远不止这么简单。
1.1 Anaconda安装与虚拟环境
从Anaconda官网下载2022.10版本的Windows安装包(Python 3.9),安装时务必勾选"Add to PATH"选项。安装完成后,我创建了专用虚拟环境:
conda create -n yolov5 python=3.8 # 特意选择3.8而非最新版
conda activate yolov5
提示:Python 3.9+可能导致后续pycocotools安装失败,3.8版本最稳定
1.2 PyTorch与CUDA的版本搭配
我的NVIDIA显卡支持CUDA 11.3,但经过多次测试发现,PyTorch 1.8.0+cu111组合最稳定。使用conda安装命令:
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
验证安装成功的技巧:
- 运行
python -c "import torch; print(torch.cuda.is_available())"应返回True nvidia-smi显示的CUDA版本可能与实际使用版本不同,以torch.version.cuda为准
2. YOLOv5项目部署:那些官方没告诉你的细节
直接从GitHub克隆ultralytics/yolov5仓库后,还需要完成以下关键步骤:
2.1 依赖项安装的常见问题
在项目根目录执行 pip install -r requirements.txt 时,我遇到了两个典型错误:
- pycocotools安装失败 :需要先安装Visual C++ Build Tools
- OpenCV版本冲突 :手动指定版本
pip install opencv-python==4.5.5.64
解决方案表格:
| 错误类型 | 解决方案 | 备用方案 |
|---|---|---|
| pycocotools失败 | 安装VS Build Tools | 使用清华源: pip install pycocotools -i https://pypi.tuna.tsinghua.edu.cn/simple |
| NVIDIA报错 | 升级驱动到最新版 | 添加 --no-cache-dir 参数 |
| 内存不足 | 添加 --no-deps 参数 |
逐项手动安装 |
2.2 预训练模型选择策略
YOLOv5提供四种尺寸的模型,我的GTX 1660显卡测试结果:
| 模型类型 | 大小(MB) | 推理速度(FPS) | mAP@0.5 |
|---|---|---|---|
| yolov5s | 14.4 | 156 | 0.674 |
| yolov5m | 40.5 | 98 | 0.724 |
| yolov5l | 88.1 | 52 | 0.742 |
| yolov5x | 166.4 | 32 | 0.756 |
对于手势识别这种简单场景,yolov5s已经足够,且能实现实时检测。
3. 自制手势数据集:标注到训练的完整流程
收集了2000张包含5种手势(掌心、握拳、点赞、OK、比耶)的图片后,我使用labelImg进行标注。
3.1 高效标注技巧
- 安装labelImg的快捷方式:
pip install labelImg
labelImg # 直接启动
- 标注时使用快捷键:
W:创建矩形框Ctrl+S:保存当前标注D:下一张图片A:上一张图片
3.2 数据集目录结构
正确的文件夹组织对训练至关重要:
mydata/
├── images/ # 存放所有图片
├── labels/ # 存放YOLO格式的txt标注
├── Annotations/ # 存放XML格式标注
└── ImageSets/
└── Main/ # 存放train.txt, val.txt等
生成数据集划分的Python脚本核心逻辑:
import os
import random
def split_dataset(image_dir, output_dir, train_ratio=0.8):
all_files = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]
random.shuffle(all_files)
split_idx = int(len(all_files) * train_ratio)
train_files = all_files[:split_idx]
val_files = all_files[split_idx:]
with open(os.path.join(output_dir, 'train.txt'), 'w') as f:
f.write('\n'.join(train_files))
with open(os.path.join(output_dir, 'val.txt'), 'w') as f:
f.write('\n'.join(val_files))
4. 模型训练与摄像头集成:从理论到实践
4.1 训练参数调优心得
修改data/hand.yaml文件配置数据集路径后,关键训练参数设置:
# hand.yaml
train: ../mydata/ImageSets/Main/train.txt
val: ../mydata/ImageSets/Main/val.txt
nc: 5 # 手势类别数
names: ['palm', 'fist', 'thumb', 'ok', 'victory']
启动训练的命令行参数示例:
python train.py --img 640 --batch 16 --epochs 100 --data hand.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name hand_gesture
注意:batch大小根据显存调整,16G显存可设为32,8G显存建议设为8-16
4.2 实时摄像头调用技巧
最终的摄像头集成代码(保存在detect.py同目录):
import cv2
import torch
model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/hand_gesture/weights/best.pt')
cap = cv2.VideoCapture(0) # 0表示默认摄像头
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
cv2.imshow('Hand Gesture', np.squeeze(results.render()))
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
常见摄像头问题排查:
-
如果报错
Unable to open camera,尝试:- 更换USB接口
- 在设备管理器中检查驱动状态
- 改用DShow后端:
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
-
提高FPS的方法:
- 降低检测分辨率:
model.conf = 0.5 - 使用半精度推理:
model = model.half()
- 降低检测分辨率:
在最终实现中,我将手势识别与PPT控制结合,通过检测到的不同手势发送虚拟按键信号。例如握拳对应空格键(翻页),掌心对应ESC键(退出演示)。这个项目让我深刻体会到,即使没有专业背景,通过坚持和正确的工具,普通人也能实现酷炫的AI应用。
更多推荐

所有评论(0)