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 时,我遇到了两个典型错误:

  1. pycocotools安装失败 :需要先安装Visual C++ Build Tools
  2. 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 高效标注技巧

  1. 安装labelImg的快捷方式:
pip install labelImg
labelImg  # 直接启动
  1. 标注时使用快捷键:
    • 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()

常见摄像头问题排查:

  1. 如果报错 Unable to open camera ,尝试:

    • 更换USB接口
    • 在设备管理器中检查驱动状态
    • 改用DShow后端: cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
  2. 提高FPS的方法:

    • 降低检测分辨率: model.conf = 0.5
    • 使用半精度推理: model = model.half()

在最终实现中,我将手势识别与PPT控制结合,通过检测到的不同手势发送虚拟按键信号。例如握拳对应空格键(翻页),掌心对应ESC键(退出演示)。这个项目让我深刻体会到,即使没有专业背景,通过坚持和正确的工具,普通人也能实现酷炫的AI应用。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐