目录
一、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 = x3p3_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, thgrid_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 # cxpred[..., 1] = (torch.sigmoid(pred[..., 1]) * 2 - 0.5 + grid_y) * strides # cypred[..., 2:4] = (torch.sigmoid(pred[..., 2:4]) * 2) ** 2 * anchors # w, hreturn 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. 关键模块参数
模块类型 | 参数配置示例 | 作用说明 |
---|---|---|
Conv | kernel=6x6, stride=2, pad=2 | 下采样(替代池化) |
C3 | 包含3个Bottleneck | 跨阶段特征融合 |
SPP | 池化核[5,9,13] | 多尺度感受野融合 |
Upsample | scale_factor=2 | 特征图放大(最近邻插值) |
四、YOLOv5的创新优化
1. 自适应训练机制
-
自适应锚框计算:训练初期自动计算最优锚框尺寸(
--autoanchor
参数)。 -
自适应图像缩放:保持原始图像宽高比进行填充,减少无效计算(
letterbox
)。
2. 损失函数设计
-
CIoU Loss:综合中心点距离、宽高比、重叠率的损失计算:
-
3. 轻量化改进(YOLOv5s与YOLOv5x对比)
模型版本 | 参数量(M) | GFLOPs | 适用场景 |
---|---|---|---|
YOLOv5s | 7.2 | 16.5 | 移动端/嵌入式设备 |
YOLOv5m | 21.2 | 49.0 | 平衡速度与精度 |
YOLOv5l | 46.5 | 109.1 | 服务器端高性能检测 |
YOLOv5x | 86.7 | 205.7 | 极致精度需求场景 |
五、YOLOv5应用场景
-
工业质检:快速检测产品缺陷(PCB板、零部件)。
-
自动驾驶:实时车辆、行人、交通标志识别。
-
安防监控:人体姿态、异常行为检测。
-
遥感图像:大尺度场景下的目标识别(建筑物、农田)。
总结
YOLOv5通过CSPDarknet主干网络、PANet特征融合和多尺度检测头,在保持实时性的同时提升了检测精度。其核心创新在于:
-
工程优化:自适应锚框、动态损失平衡、高效数据增强。
-
架构改进:Focus模块减少计算量,C3结构增强特征复用。
-
灵活性:提供多种模型尺寸(s/m/l/x)适应不同硬件需求。
手势识别实战
- 用git把yolov5从GitHub上下载到本地
- 把数据集划分为train1598:test457:val228=7:2:1,并放在dataset文件夹里
- 划分参考
- val没有参与狭义的模型训练过程(权重更新),但是它参与了模型评测,以此来选择(不同超参数、不同epoch)最好的模型,就相当于参与了广义的模型训练了。
- 数据集结构为
-
datasettrainimageslabelstestval
- 把data/coco.yaml复制并改为gesture.yaml
- 把内容改为
-
# 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-one1: 001-five2: 002-fist3: 003-ok4: 004-heartSingle5: 005-yearh6: 006-three7: 007-four8: 008-six9: 009-Iloveyou10: 010-gun11: 011-thumbUp12: 012-nine13: 013-pink
- 把models/yolov5s.yaml里面的80换成14:nc: 14 # number of classes
- 把train.py里面找到下图代码并改为下图,其他的先不用动
- 把整个文件压缩
- 登录autodl账号,开个小小的GPU,点进去后再建立一个文件夹yolov5
- 上传你的zip
- 解压缩,打开终端,
- cd autodl-temp
- cd yolov5
- unzip yasuobao(不用加后缀.zip)
- 配环境pip install -r requirments.txt
- 终端输入python train.py就可以了
训练完后报错AttributeError: module 'PIL.Image' has no attribute 'ANTIALIAS'
解决方法
训练了100轮
在目标检测任务中,损失函数是评估模型预测准确性的关键指标。Box Loss、Cls 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,然后再运行