当前位置: 首页 > news >正文

yolov5学习及手势识别实战

目录

一、YOLOv5核心原理

1. 单阶段检测范式

2. 关键技术特性

二、YOLOv5网络架构组成

1. Backbone:CSPDarknet53

2. Neck:PANet(Path Aggregation Network)

3. Head:检测头

三、YOLOv5网络架构细节

1. 整体架构图

2. 关键模块参数

四、YOLOv5的创新优化

1. 自适应训练机制

2. 损失函数设计

3. 轻量化改进(YOLOv5s与YOLOv5x对比)

五、YOLOv5应用场景

总结

手势识别实战


一、YOLOv5核心原理

1. 单阶段检测范式
  • 回归式检测:将目标检测转化为单次前向传播回归问题,直接预测边界框坐标和类别概率

  • 网格划分策略:输入图像被划分为S×S网格,每个网格单元负责预测中心点落在该区域的目标。

  • 多尺度预测:通过不同层级的特征图预测不同尺寸的目标(大目标用深层特征,小目标用浅层特征)。

2. 关键技术特性
技术要点作用描述
自适应锚框根据训练数据自动计算最佳锚框尺寸(K-means++改进算法)
动态损失平衡通过调整分类、置信度、坐标回归的损失权重(如CIoU Loss优化)
数据增强策略Mosaic增强、MixUp、HSV随机调整等提升模型泛化能力
自适应分辨率支持动态调整输入图像尺寸(如640×640或自定义尺寸)

二、YOLOv5网络架构组成

YOLOv5网络由Backbone(主干网络)Neck(特征融合层)和Head(检测头)三部分组成:

1. Backbone:CSPDarknet53
  • CSP结构(Cross Stage Partial Network)

  • 优势:通过分割-处理-合并策略,减少计算量约20%并增强梯度多样性。

# CSP结构示例(YOLOv5中的BottleneckCSP模块)
class BottleneckCSP(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        super().__init__()
        c_ = int(c2 * e)  # 中间通道数
        self.cv1 = Conv(c1, c_, 1, 1)  # 1x1卷积降维
        self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)
        self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)
        self.cv4 = Conv(2 * c_, c2, 1, 1)
        self.bn = nn.BatchNorm2d(2 * c_)
        self.act = nn.SiLU()
        self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)])

    def forward(self, x):
        y1 = self.cv3(self.m(self.cv1(x)))  # 分支1:卷积→Bottleneck堆叠
        y2 = self.cv2(x)                    # 分支2:直连
        return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))
  • Focus模块(输入切片处理)
  • 作用:将输入图像相邻像素切片重组,替代传统卷积下采样,保留更多细节信息。
class Focus(nn.Module):
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):
        super().__init__()
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)  # 通道数扩展4倍

    def forward(self, x):
        # 切片操作:将空间维度信息转为通道维度
        return self.conv(torch.cat([x[..., ::2, ::2], 
                                   x[..., 1::2, ::2], 
                                   x[..., ::2, 1::2], 
                                   x[..., 1::2, 1::2]], 1))
2. Neck:PANet(Path Aggregation Network)
  • 特征金字塔结构

    • FPN(自顶向下):深层特征上采样并与浅层特征融合,增强语义信息。

    • PAN(自底向上):浅层特征下采样并与深层特征融合,补充定位细节。

# YOLOv5中的PANet实现(包含Concat和C3模块)
class PANet(nn.Module):
    def __init__(self, c1, c2):
        super().__init__()
        self.up = nn.Upsample(scale_factor=2, mode='nearest')
        self.c3_1 = C3(c1*2, c2, n=3, shortcut=False)
        self.c3_2 = C3(c2*2, c2, n=3, shortcut=False)

    def forward(self, x1, x2, x3):
        # 自顶向下(FPN)
        p3 = x3
        p3_up = self.up(p3)
        p2 = torch.cat([p3_up, x2], 1)
        p2 = self.c3_1(p2)

        # 自底向上(PAN)
        p2_up = self.up(p2)
        p1 = torch.cat([p2_up, x1], 1)
        p1 = self.c3_2(p1)
        return p1, p2, p3
3. Head:检测头
  • 多尺度预测:输出三个尺度的特征图(如80×80、40×40、20×20),分别对应小、中、大目标。

  • 预测张量结构

# 输出shape:[batch_size, anchors_per_scale, grid_h, grid_w, 5 + num_classes]
# 5 = tx, ty, tw, th, confidence
  • 解码过程
def decode_box(pred, anchors, strides):
    # pred: [..., 4] 对应tx, ty, tw, th
    grid_x = torch.arange(pred.shape[2]).repeat(pred.shape[3], 1).view(1, 1, pred.shape[2], pred.shape[3])
    grid_y = grid_x.permute(0, 1, 3, 2)
    pred[..., 0] = (torch.sigmoid(pred[..., 0]) * 2 - 0.5 + grid_x) * strides  # cx
    pred[..., 1] = (torch.sigmoid(pred[..., 1]) * 2 - 0.5 + grid_y) * strides  # cy
    pred[..., 2:4] = (torch.sigmoid(pred[..., 2:4]) * 2) ** 2 * anchors  # w, h
    return pred

三、YOLOv5网络架构细节

1. 整体架构图
Input (640x640x3)
│
├── Focus [3→32]       # 切片下采样
├── Conv [32→64]
├── C3 [64→64]
├── Conv [64→128]
├── C3 [128→128] ×3
├── Conv [128→256]
├── C3 [256→256] ×3
├── Conv [256→512]
├── SPP [512→512]      # 空间金字塔池化
├── C3 [512→512] ×3
│
├── PANet开始
│   ├── UpSample → Concat → C3 [512→256]
│   ├── UpSample → Concat → C3 [256→128]
│   ├── DownSample → Concat → C3 [128→256]
│   └── DownSample → Concat → C3 [256→512]
│
└── Detect Head [3个尺度输出]
2. 关键模块参数
模块类型参数配置示例作用说明
Convkernel=6x6, stride=2, pad=2下采样(替代池化)
C3包含3个Bottleneck跨阶段特征融合
SPP池化核[5,9,13]多尺度感受野融合
Upsamplescale_factor=2特征图放大(最近邻插值)

四、YOLOv5的创新优化

1. 自适应训练机制
  • 自适应锚框计算:训练初期自动计算最优锚框尺寸(--autoanchor参数)。

  • 自适应图像缩放:保持原始图像宽高比进行填充,减少无效计算(letterbox)。

2. 损失函数设计
  • CIoU Loss:综合中心点距离、宽高比、重叠率的损失计算:

3. 轻量化改进(YOLOv5s与YOLOv5x对比)
模型版本参数量(M)GFLOPs适用场景
YOLOv5s7.216.5移动端/嵌入式设备
YOLOv5m21.249.0平衡速度与精度
YOLOv5l46.5109.1服务器端高性能检测
YOLOv5x86.7205.7极致精度需求场景

五、YOLOv5应用场景

  1. 工业质检:快速检测产品缺陷(PCB板、零部件)。

  2. 自动驾驶:实时车辆、行人、交通标志识别。

  3. 安防监控:人体姿态、异常行为检测。

  4. 遥感图像:大尺度场景下的目标识别(建筑物、农田)。


总结

YOLOv5通过CSPDarknet主干网络PANet特征融合多尺度检测头,在保持实时性的同时提升了检测精度。其核心创新在于:

  • 工程优化:自适应锚框、动态损失平衡、高效数据增强。

  • 架构改进:Focus模块减少计算量,C3结构增强特征复用。

  • 灵活性:提供多种模型尺寸(s/m/l/x)适应不同硬件需求。

手势识别实战

  1. 用git把yolov5从GitHub上下载到本地
  2. 把数据集划分为train1598:test457:val228=7:2:1,并放在dataset文件夹里
  3. 划分参考
  4. val没有参与狭义的模型训练过程(权重更新),但是它参与了模型评测,以此来选择(不同超参数、不同epoch)最好的模型,就相当于参与了广义的模型训练了。
  5. 数据集结构为
  6. dataset
        train
            images
            labels
        test
        val
  7. 把data/coco.yaml复制并改为gesture.yaml
  8. 把内容改为
  9. 
    
    # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
     # dataset root dir
    train: ../dataset_split/train/images  # train images (relative to 'path') 128 images
    val: ../dataset_split/val/images  # val images (relative to 'path') 128 images
    test: ../dataset_split/test/images # test images (optional)
    
    # Classes
    names:
      0: 000-one
      1: 001-five
      2: 002-fist
      3: 003-ok
      4: 004-heartSingle
      5: 005-yearh
      6: 006-three
      7: 007-four
      8: 008-six
      9: 009-Iloveyou
      10: 010-gun
      11: 011-thumbUp
      12: 012-nine
      13: 013-pink
    
  10. 把models/yolov5s.yaml里面的80换成14:nc: 14 # number of classes
  11. 把train.py里面找到下图代码并改为下图,其他的先不用动
  12. 把整个文件压缩
  13. 登录autodl账号,开个小小的GPU,点进去后再建立一个文件夹yolov5
  14. 上传你的zip
  15. 解压缩,打开终端,
  16. cd autodl-temp
  17. cd yolov5
  18. unzip yasuobao(不用加后缀.zip)
  19. 配环境pip install -r requirments.txt
  20. 终端输入python train.py就可以了

训练完后报错AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'

解决方法

训练了100轮

在目标检测任务中,损失函数是评估模型预测准确性的关键指标。Box LossCls Loss 和 DFL Loss 是三种常用的损失函数,它们分别针对不同的预测误差进行优化。

Box Loss(边界框损失)主要用于计算预测边界框与真实边界框之间的差异。常见的计算方法包括 Mean Squared Error(均方误差)和 Smooth L1 Loss(平滑L1损失)。这种损失函数通过最小化预测框与真实框之间的差异,帮助模型更准确地定位目标。

Cls Loss(分类损失) 用于计算预测类别与真实类别之间的差异。这通常通过 交叉熵损失(Cross-Entropy Loss)来实现。分类损失的优化有助于提高模型对目标类别的识别准确性。

DFL Loss(自由形变损失)或称为 Distribution Focal Loss,是一种用于处理类别不平衡问题的损失函数。它类似于 Focal Loss,但引入了类别分布信息,从而更有效地处理不同类别样本数量差异较大的情况。

当这三个损失函数的值上升而不下降时,可能表明模型出现了过拟合。

obj_loss(目标置信度损失)是衡量模型预测边界框覆盖对象程度的一个重要指标。衡量目标检测对图像中是否存在目标进行判断的准确程度。当obj_loss较低时,表示模型能够正确识别出图像中的目标。

val.py就是用来测试的,原来在train.py里面默认是输入val,所以得出来的也是val_loss

但是现在要测试,所以要把里面参数部分默认的val改为test,然后再运行

相关文章:

  • 让 Google Play 成为助力 PC 游戏增长的最佳平台
  • K8S学习之基础三十七:prometheus监控node资源
  • idea底部图标不小心关了,怎么重新打开?
  • PyTorch使用(3)-张量类型转换
  • 在Oracle Linux 7上安装Oracle 11gr2数据库
  • DevEco Studio的使用
  • 虚幻基础:ue自定义类
  • Qwen2.5-VL 开源视觉大模型,模型体验、下载、推理、微调、部署实战
  • 力扣 Hot 100 刷题记录 - 将有序数组转换为二叉搜索树
  • C#命令行参数用法
  • Python程序常用的配置文件格式及例子(上)
  • Linux搭建conda虚拟环境流程
  • C++ vcpkg下载rttr等类库
  • 【3D模型】【游戏开发】【Blender】Blender模型分享-狮头木雕附导入方法
  • Redis 安装详细教程(小白版)
  • 网络流基本概念及实现算法
  • uni-app——网络API
  • Java 中 Vector 的底层数据结构及相关分析
  • 创建Vue3工程
  • 【Axure高保真原型】增删改饼图
  • 门户网站和新闻网站的区别/策划营销推广方案
  • 怎样做游戏网站/兰州网站seo优化
  • 爱唐山做贡献月评十佳投票网站/百度seo和谷歌seo有什么区别
  • 为耐克做品牌推广的网站/互联网广告代理可靠吗
  • 网站开发服务合同属于什么合同/自助建站系统哪个好用
  • 云桥在线客服/吉安seo网站快速排名