0x01输入端

Masaic增强

实现

将图像拼接成一个新的图像,每个子图像的目标框的位置需要重新计算,以适应拼接后图像的新坐标系

作用和效果

  1. 使目标物体出现在多样化的背景下,有助于提高模型的鲁棒性。
  2. 通过在同一张图像中放置多个对象,提升了模型对小目标的检测能力。
  3. 增加了训练样本的多样性,使模型更能应对不同场景和变化。

自适应锚框计算

前版本的不足:

  • 用coco、voc等数据集生成的锚框 在自己的数据集上不好
  • 使用欧式距离 不适用于目标检测

    为什么?

    大框和小框如果在绝对数值上差了 10 个像素,大框可能觉得无所谓,但小框就觉得差了十万八千里。用直线距离会导致大框产生更大的误差。

改进

  • 使用自适应锚框计算
  • 使用IOU来当距离度量,更符合目标检测的物理直觉

具体过程

  1. 统计数据集中的目标框:通过遍历数据集,收集所有目标框的宽高比信息。
  2. 聚类分析:使用k-means聚类或改进的k-means算法,基于宽高比对目标框进行聚类,得到多个锚框。
  3. 距离度量:通常采用IoU作为距离指标,以更好地反映锚框与目标框的匹配程度。
  4. 确定最佳锚框:聚类完成后,选择与数据集目标特征匹配度最高的锚框集合,作为模型训练的默认锚框。
  5. 自动调整: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}} $$

image-20260526141525435

特性

  1. 绝对平滑(Smoothness)

    ReLU 或者 LeakyReLU在 $x=0$ 的地方都有一个尖锐的折角(不可导或者导数突变)。但是 SiLU 是一条极其丝滑的曲线,没有任何折角。在反向传播算梯度时,越平滑的曲线,梯度的流转就越顺畅,模型训练起来就不容易崩,极其稳定。

  2. 自带“微弱回弹”(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

image-20260526200955485

image-20260526201939834

mAP

Mean Average Precision,即平均精度均值。它是评估目标检测模型性能(准确度)最核心、最重要的指标。

1. 基础概念:精确率与召回率
  • Precision(精确率):在模型预测出来的所有目标中,有多少是真正预测对的?(即:找出来的准不准)。
  • Recall(召回率):在图片中真实存在的所有目标中,模型成功找出来了多少?(即:找得全不全)。
2. AP(Average Precision,平均精度)

精确率和召回率通常是互相制约的(想要找得全,可能就会把错的也框进来导致不准;想要找得准,可能就会漏掉一些目标)。

AP 是针对某一个具体的类别(比如只看“汽车”这个类别)来综合考量这两个指标的。在数学上,它是精确率-召回率曲线(P-R曲线)下方的面积。AP 的值越接近 1(或 100%),说明模型对这个类别的检测效果越好。

3. mAP(Mean Average Precision,平均精度均值)

一个目标检测任务通常需要识别多个类别(比如同时检测猫、狗、人、汽车等)。我们算出数据集中所有类别的 AP 值之后,再把它们求一个平均数,得到的结果就是 mAP。它代表了模型在所有类别上的综合检测能力。

image-20260526202926412

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 完全相同的感受野和特征提取能力的前提下,通过“串联小池化核代替并联大池化核”的巧妙设计,大大降低了计算量,显著提升了前向推理速度

image-20260526224921409

NEAK

image-20260526225713036

标签: none

评论已关闭