YOLOv5笔记-未完成
0x01输入端
Masaic增强
实现
将图像拼接成一个新的图像,每个子图像的目标框的位置需要重新计算,以适应拼接后图像的新坐标系
作用和效果
- 使目标物体出现在多样化的背景下,有助于提高模型的鲁棒性。
- 通过在同一张图像中放置多个对象,提升了模型对小目标的检测能力。
- 增加了训练样本的多样性,使模型更能应对不同场景和变化。
自适应锚框计算
前版本的不足:
- 用coco、voc等数据集生成的锚框 在自己的数据集上不好
使用欧式距离 不适用于目标检测
为什么?
大框和小框如果在绝对数值上差了 10 个像素,大框可能觉得无所谓,但小框就觉得差了十万八千里。用直线距离会导致大框产生更大的误差。
改进
- 使用自适应锚框计算
- 使用IOU来当距离度量,更符合目标检测的物理直觉
具体过程
- 统计数据集中的目标框:通过遍历数据集,收集所有目标框的宽高比信息。
- 聚类分析:使用k-means聚类或改进的k-means算法,基于宽高比对目标框进行聚类,得到多个锚框。
- 距离度量:通常采用IoU作为距离指标,以更好地反映锚框与目标框的匹配程度。
- 确定最佳锚框:聚类完成后,选择与数据集目标特征匹配度最高的锚框集合,作为模型训练的默认锚框。
- 自动调整:YOLOv5在训练时会自动计算和推荐适合数据集的锚框配置,以帮助用户更快地开始训练,并获得更好的检测效果。
改进的k-means算法
随机找几个“倒霉蛋”当代表(初始化): 假设你要 9 个锚框(K=9),系统就先从你的数据集里随机抽 9 个框,暂时把它们的宽和高当成这 9 个群组的“中心代表”。
大家开始站队(分配): 把数据集里剩下的所有框,挨个拿出来,看看自己和这 9 个代表里谁最像。谁最像,就站到谁的队伍里。最后全场分成了 9 个大组。
重新推选带头大哥(更新中心): 现在 9 个组分好了,机器会计算每个组里所有框的“平均宽”和“平均高”,用这个平均值生成一个新的框,作为这个组新的“中心代表”。
循环往复,直到稳定: 有了新代表,大家再重新比对、重新站队、再选新代表。就这么一直循环,直到某一次大家发现:“诶?队伍不再变了,代表也不用换了”。这时候,最后稳定下来的那 9 个代表,就是为你数据集量身定制的自适应锚框。
自适应图片缩放
训练阶段
1 等比缩放 ,将长边缩放到416
2 pad = ( 416 - 短边) / 2
推理阶段
1 等比缩放 ,将长边缩放到32的倍数
2 找到大于短边的第一个32的倍数,填充
为什么?
兼顾“训练的稳定性”和“推理的极致速度”
训练的时候为了让 GPU 满载狂飙,训练时我们必须把多张图片(比如 16 张)打包成一个矩阵(Batch)一起送进网络。要打包成一个矩阵,这 16 张图片的宽高必须一模一样
在保证图像不失真的情况下,可以显著减少计算量,加快推理速度。
激活函数
SiLU激活函数(Swish激活函数)
$$ f(x) = x \cdot \sigma(x) $$
$$ f(x) = \frac{x}{1 + e^{-x}} $$

特性
绝对平滑(Smoothness):
ReLU 或者 LeakyReLU在 $x=0$ 的地方都有一个尖锐的折角(不可导或者导数突变)。但是 SiLU 是一条极其丝滑的曲线,没有任何折角。在反向传播算梯度时,越平滑的曲线,梯度的流转就越顺畅,模型训练起来就不容易崩,极其稳定。
自带“微弱回弹”(Non-monotonicity):
传统的 ReLU 遇到负数直接变 0(死神降临),LeakyReLU 遇到负数是一条直直的下坡路。
而 SiLU 在遇到负数时,会先往下凹一点点(大约在 $x \approx -1.28$ 时达到谷底的 $-0.278$),然后随着 $x$ 变得更小,它才慢慢向 $0$ 靠拢。这个“微小的负数洼地”让神经网络有能力保留一些极其微弱的负面特征,这在复杂的视觉任务中,泛化能力奇高。
YOLOv5模型整体结构
v3 v4 v5大体都这样
backbone+neck+head(3个)
V3 CNL
V4 CBM
V5 CBS


mAP
Mean Average Precision,即平均精度均值。它是评估目标检测模型性能(准确度)最核心、最重要的指标。
1. 基础概念:精确率与召回率
- Precision(精确率):在模型预测出来的所有目标中,有多少是真正预测对的?(即:找出来的准不准)。
- Recall(召回率):在图片中真实存在的所有目标中,模型成功找出来了多少?(即:找得全不全)。
2. AP(Average Precision,平均精度)
精确率和召回率通常是互相制约的(想要找得全,可能就会把错的也框进来导致不准;想要找得准,可能就会漏掉一些目标)。
AP 是针对某一个具体的类别(比如只看“汽车”这个类别)来综合考量这两个指标的。在数学上,它是精确率-召回率曲线(P-R曲线)下方的面积。AP 的值越接近 1(或 100%),说明模型对这个类别的检测效果越好。
3. mAP(Mean Average Precision,平均精度均值)
一个目标检测任务通常需要识别多个类别(比如同时检测猫、狗、人、汽车等)。我们算出数据集中所有类别的 AP 值之后,再把它们求一个平均数,得到的结果就是 mAP。它代表了模型在所有类别上的综合检测能力。

SPPF(Spatial Pyramid Pooling - Fast,快速空间金字塔池化)
在 YOLOv5 中,SPPF 通常被放在主干网络(Backbone)的最后一层,用来承上启下。为什么要用它?主要有以下两个核心原因:
1. 核心目的:扩大感受野,融合多尺度特征
在目标检测中,有的物体大(占据大半个屏幕),有的物体小(只有几个像素)。为了让网络既能“看清”小物体,又能“看全”大物体,我们需要网络具备不同大小的感受野(即网络能看到原图多大范围的信息)。
- 扩大感受野: SPPF 通过连续进行多次最大池化(Max Pooling)操作,可以迅速扩大特征图的感受野,让网络不仅能捕捉局部的细节特征,还能获取全局的上下文信息(比如,知道这只“狗”是站在“草地”上,有助于更准确认出它是狗)。
- 多尺度融合: 它将不同池化程度的结果拼接(Concat)在一起,相当于把不同尺度的特征结合了起来,极大地丰富了特征的表达能力。
2. 为什么是 SPPF,而不是 SPP?(那个 "F" 才是灵魂)
其实在早期的 YOLO 版本(比如 YOLOv3-SPP、YOLOv4)中,使用的是 SPP 模块。YOLOv5 的作者 Glenn Jocher 对其进行了改造,变成了 SPPF,这里的 F 代表 Fast(快)。
这是 SPPF 最巧妙的地方,我们可以对比一下两者的工作原理:
传统的 SPP(并联结构):
它把输入的数据分成几份,分别并行地通过几个不同大小的池化核(比如 5×5、9×9、13×13)进行最大池化,最后再把结果拼接起来。使用 9×9 和 13×13 这种大尺寸的池化核,计算量其实不小。
现在的 SPPF(串联结构):
作者发现了一个数学上的等效规律:
- 连续经过 2个 5×5 的池化层,它的感受野效果等同于 1个 9×9 的池化层。
- 连续经过 3个 5×5 的池化层,效果等同于 1个 13×13 的池化层。
基于这个原理,SPPF 将原本并行的结构改成了串联:输入数据先经过一个 5×5 池化,结果再经过第二个 5×5,然后再经过第三个 5×5。最后把每次输出的结果拼接起来。
总结
之所以要用 SPPF,是因为它在保持与原版 SPP 完全相同的感受野和特征提取能力的前提下,通过“串联小池化核代替并联大池化核”的巧妙设计,大大降低了计算量,显著提升了前向推理速度。

NEAK

评论已关闭