[YOLO系列③] YOLOv3和YOLOv4优化策略
1.YOLO-V3
1.网络架构改进
提升特征提取能力和训练稳定性
1.残差连接(Residual Connections)
残差连接 是指在神经网络中将输入 x 直接跳跃连接(shortcut)加到输出 F(x) 上的那一条路径。数学形式如下:
$$
y = F(x) + x
$$
- 其中:
- x:输入
- F(x):一系列卷积层后的输出(即“主干路径”)
- x 是“旁路路径”或称“跳跃连接”
- 两者相加形成最终输出 y
这条连接就是 “残差连接”,它是 结构中的一条数据路径。
为什么要加残差连接?
- 解决梯度消失:深层网络容易出现梯度消失,导致前层参数无法有效更新。残差连接可以让梯度直接从后向前传播,缓解这个问题
- 避免退化问题:当网络加深后,理论上精度应该更好,但实际上常常出现“深层网络比浅层表现差”的现象,残差连接能避免这个问题
- 更容易收敛:训练时网络更快收敛,训练更稳定
- 允许更深的网络:有了残差结构,能够训练出 50层、101层甚至1000多层 的深度神经网络
残差结构是指包含残差连接的整个网络子模块(block)。它通常包括:
- 一条主路径:由几层卷积、BN、ReLU 等组成,用来提取特征;
- 一条旁路径:直接跳过主路径,将输入 x 加到输出;
- 一个加法操作:将主路径和旁路径的结果合并。
1 | 输入 x |
总结:残差结构其实就是“包含残差连接的子网络结构”
2.Backbone 升级:Darknet-19 → Darknet-53
YOLOv2 使用的是 Darknet-19,它结构简单、推理速度快,但在复杂场景中容易丢失细节信息,YOLOv3 需要一个更深、更强的特征提取网络来增强对小目标的检测能力,于是作者提出了Darknet-53特点:
- “53” 代表网络共有 53 层具有可学习参数的层(大多是卷积层)
- 引入了 残差结构(Residual Block),类似于 ResNet,使得更深层的网络更容易训练
- 全部使用了 3x3 和 1x1 卷积核,保持运算高效
- 没有使用全连接层,利于保持空间信息
Darknet-53 的网络层次可以分为多个阶段,每个阶段都包含若干个残差块,具体结构如下:
Stage | Output Size | Layers(简写) | 残差块数量 |
---|---|---|---|
1 | 256×256 | Conv1: 3×3, 32 | 0 |
2 | 128×128 | Conv2: 3×3, 64 / stride=2 | 1 |
3 | 64×64 | Conv3: 3×3, 128 / stride=2 | 2 |
4 | 32×32 | Conv4: 3×3, 256 / stride=2 | 8 |
5 | 16×16 | Conv5: 3×3, 512 / stride=2 | 8 |
6 | 8×8 | Conv6: 3×3, 1024 / stride=2 | 4 |
注:每个“残差块”都包含 1 个 1×1 卷积 + 1 个 3×3 卷积,并带有残差连接。
2.检测机制优化
提升多尺度目标检测和定位精度
1.多尺度预测(Feature Pyramid)
在目标检测中,一个主要挑战是:目标大小不一,有的目标很小(比如鸟、行人),有的很大(比如卡车、建筑),为了同时检测这些不同尺寸的物体,YOLOv3 引入了多尺度预测机制,灵感来源于 FPN(Feature Pyramid Network)。
核心思想:
在不同分辨率的特征图上分别进行检测,每个尺度都负责检测特定大小的目标。
YOLOv3 使用 Darknet-53 主干网络来提取特征,并构建多尺度输出。流程如下:
- 从主干网络中间层获取三个特征图(多尺度预测)
- ResBlock8 输出 → 52×52
- ResBlock15 输出 → 26×26
- 最终输出 → 13×13
- 上采样 + 拼接(细粒度特征融合)
- 高层特征通过 上采样(Nearest Neighbour) 放大
- 与来自浅层的特征图进行 拼接(concat)
- 然后再通过卷积层提取融合后的特征
多尺度预测带来的好处:
- 增强小目标检测能力,如行人、人脸、交通标志
- 适应多种目标大小,从小狗到大卡车都能检测
- 信息融合更充分,深层语义 + 浅层细节互补
- 检测性能全面提升,尤其在 COCO 数据集上表现优异
2.细粒度特征融合(Fine-Grained Features)
为什么要融合细粒度特征?
神经网络在不断向下采样、加深层数的过程中:
- 低层特征(浅层):保留了空间位置和纹理细节信息,但语义抽象能力弱
- 高层特征(深层):具有很强的语义理解能力,但空间分辨率低、细节丢失
这种深层特征虽然对“看懂物体”很强,但: - 对小目标的位置、边界感知能力弱;
- 容易出现目标边界模糊、定位不准等问题。
所以,细粒度特征融合的目标就是:结合低层的“清晰细节”与高层的“语义理解”,做到“看清楚 + 看懂了”。
YOLOv3 借助类似 FPN(Feature Pyramid Network) 的思想,把不同层级的特征融合起来,具体策略如下:
- 将高层的语义特征图(分辨率低)进行上采样(Nearest Neighbor)
- 与来自浅层网络的高分辨率特征图进行 拼接(concatenation)
- 拼接后经过卷积进一步提取融合后的信息,得到更丰富的检测特征图
3.Bounding Box 预测方式改进
YOLOv3 在 Bounding Box(边界框)预测方式 上也做了关键改进,这是 YOLOv3 能提升定位准确度、训练更稳定的重要原因之一。
早期 YOLO 系列的 bbox 预测有一些问题:
问题 | 解释 |
---|---|
不够稳定 | 使用直接预测中心点 (x, y) 和宽高 (w, h),对回归不敏感,尤其宽高变化大时梯度不稳定 |
容易偏移 | 预测中心点是绝对位置,对小目标偏移影响更大 |
有负数预测值 | 预测结果可为负数,导致框“跑出图像”或不合理 |
YOLOv3 改进的核心是:用更稳定的相对形式来预测 bbox 参数,并通过激活函数限制其范围。具体改进包括:
- 使用 sigmoid 激活预测中心坐标偏移,始终在当前 grid cell 内,不会跑偏或跳出格子,更好学习“相对位移”,训练稳定、收敛更快
- 宽高采用 anchor box 的缩放系数,YOLOv3 不直接预测宽高,而是基于 anchor box 尺寸进行缩放,这样做的好处是,保证宽高始终为正值,使用指数函数使得模型可以灵活地预测比 anchor 更大/更小的物体
与 YOLOv2 的预测方式对比:
对比项 | YOLOv2 | YOLOv3 |
---|---|---|
中心坐标预测方式 | 未归一化(线性偏移) | Sigmoid 激活后加上网格坐标 |
宽高预测方式 | 线性缩放 | 指数缩放(保证宽高为正) |
激活函数 | 无限制 | Sigmoid + exp 让预测值更合理、更稳定 |
框的位置稳定性 | 容易偏移 | 更准确、学习目标位置更加稳定 |
多标签支持 | softmax 分类(互斥) | sigmoid 多标签(支持多标签分类场景) |
4.先验框优化(Anchor Box Clustering)
先验框优化是 YOLOv3 在预测精度上提升的重要步骤,它直接影响模型预测框的 拟合能力和收敛速度
为什么需要先验框(Anchor Box)优化?
在物体检测中,Anchor Box(先验框) 是预设的一组矩形框,用于引导模型预测目标的位置和尺寸。
YOLOv2 起首次引入 Anchor Box,每个格子默认设定多个尺度和比例的先验框,模型只需预测与 Anchor Box 的“偏移量”,这样可以提高定位精度,尤其是对于尺寸多变的目标。
但这样存在问题:
- 不能很好地拟合训练集中真实目标的尺寸分布
- 对小目标或特殊形状的物体不友好
- 容易出现预测框与实际目标形状差距太大
YOLOv3 使用 K-Means 聚类算法 在训练集上自动学习出合适的 Anchor Box 尺寸,替代人为设置,聚类过程如下:
- 收集训练集中的所有真实 bbox(宽、高)
- 选择一个距离度量方式
- 通常用 IOU 距离(1 - IOU),不是欧氏距离
- 这样更符合 bbox 匹配的实际逻辑
- 用 K-Means 对这些真实框做聚类
- 聚出 K 个“代表性 bbox 尺寸”作为 anchor
- 得到一组尺寸不一但适配度高的 Anchor Boxes
Anchor Box 优化的好处:
优势 | 说明 |
---|---|
更匹配真实目标尺寸分布 | 聚类得出的 anchor 更符合数据分布 |
提升预测框与真实框匹配度 | IOU 更高,正样本分配更准确 |
收敛速度更快 | 不会训练初期大量预测框 mismatch |
提高小目标检测能力 | 某些 anchor 专门服务于小目标 |
泛化性更强 | 在新数据集上重新聚类即可快速适配 |
5.分类方式变化:Softmax → Sigmoid
YOLOv3 抛弃 Softmax,采用 逐类别 Sigmoid 激活,实现了更灵活的 多标签分类能力,使模型可以适应更多复杂、多义、多标签的目标检测任务,是一个设计上的质变提升。
为什么 Softmax 不适合目标检测?
在真实检测任务中,存在以下情况:
情况 | 举例 |
---|---|
多标签物体 | 一只“人骑在马”上,可能属于“人类”和“骑手” |
模糊/不确定类别 | 模糊图像同时可能是“猫”和“狸花猫” |
需要支持多类可能性 | 一些检测任务,如医学影像、遥感图像,多类交叉 |
因此 Softmax 会强行“排他”,不能表达“一个框可能属于多个类”的情况
YOLOv3 抛弃 Softmax,改用 逐类别的 Sigmoid 激活函数:
特点:
- 每个类别都有一个独立的概率
- 类别之间互不干扰,不要求总和为 1
- 可以实现多标签分类(multi-label classification)
3.其它
1.训练策略增强
- 多尺度训练(Multi-Scale Training):在训练时动态调整输入图像尺寸(如 320×320 → 608×608),提升模型尺度鲁棒性
- 数据增强:引入随机裁剪、色彩抖动等,提升泛化性
2.损失函数改进
- 用二元交叉熵(BCE)替代 MSE 计算分类损失,更适应多标签任务
- 对定位损失(IoU)和分类损失分开加权,平衡不同任务优化
3.细粒度特征融合(Fine-Grained Features)
- 在 26×26 和 52×52 特征图中,通过跳跃连接(Concatenation)融合浅层细节信息(如边缘、纹理),提升小目标检测
4.动态阈值与非极大抑制(NMS)优化
- 设置动态置信度阈值过滤低质量预测框
- 改进 NMS 算法,缓解密集场景下的重叠框误删问题
2.YOLO-V4
1.Bag of freebies(BOF)训练优化
1.Mosaic数据增强(Mosaic data augmentation)
Mosaic 数据增强 是由 YOLOv4 首次提出的一种图像增强方法是将4张不同的图像拼接成1张图像,并将目标框同时映射过来。相比传统的数据增强(如翻转、旋转、裁剪等),Mosaic 可以在一次训练样本中同时看到更多目标,显著增加了图像中目标的多样性、数量和尺度变化。
Mosaic实现过程:
- 从数据集中随机选择 4 张图像
- 对每张图像分别进行缩放、裁剪等基本预处理
- 将这 4 张图像以 2×2 网格方式拼接成 1 张图像(可以是中心交汇,也可以是非对称拼接)
- 将原图中的标注框(bounding boxes)根据缩放和平移关系映射到拼接后的图像中
这样每张训练图像可以包含多个原始图像中的目标
Mosaic 的优势:
- 提高小目标检测能力,Mosaic 能让原本分布在不同图像中的小目标集中在一张图中,使模型能更好地学习小目标的特征
- 增强模型鲁棒性,通过随机组合不同图像内容,模型学到更丰富的背景、目标组合,从而提升泛化能力
- 类似于“批内增强”,它相当于将 4 张图片的信息融合进了 1 次前向传播中,某种程度上起到了提升 batch 多样性的作用。
- 无需大batch size,结合了 4 张图像的信息,有效缓解小 batch size 下样本多样性不足的问题
2.自对抗训练(Self-Adversarial Training, SAT)
YOLOv4 中的 自对抗训练(Self-Adversarial Training, SAT) 是一个非常有趣、而且颇具创意的训练技巧。它首次将“对抗攻击”的概念用于数据增强,从而提升模型的鲁棒性和性能。
什么是自对抗训练?SAT 是一种分两步进行的训练方式,先“欺骗”模型,再“教训”模型。
它的核心思路是:
- 利用模型本身生成“对抗性扰动”来修改输入图像,使其对模型变得更难识别
- 然后再用这些被“扰乱”的图像去训练模型,让模型学会“识破”这些对抗干扰
这就像模型自己“打一巴掌,再喂药”,最终变得更强。
实现过程:
SAT 通常发生在每一个 mini-batch 的训练过程中,主要包括两个阶段:
对抗扰动阶段:主要是找出模型当前最不容易处理的样本区域
- 模型接收到一张原始图像
- 对其进行一次前向传播,计算损失
- 然后根据这个损失对输入图像计算梯度(类似 FGSM 方法)
- 利用这个梯度对图像进行微调(添加对抗扰动)
- 得到一张被“攻击过”的图像
常规训练阶段 - 用第一步生成的“被攻击图像”进行正常的训练
- 目标是让模型正确识别这些更具挑战性的样本,从而提升鲁棒性
这样做有什么好处?
- 提升模型鲁棒性:SAT 实际上是让模型暴露在“对抗样本”中,因此它在面对噪声、遮挡、低质量图像时,表现更稳健
- 模拟更复杂的样本分布:相比于普通数据增强,SAT 所生成的对抗图像具有“更真实的混乱”,更接近模型容易犯错的场景
- 不需要额外的数据或模型:自对抗训练完全基于当前模型自身,不需要额外的对抗网络(不像 GAN),训练成本可控
3.DropBlock
YOLOv4 中引入的 DropBlock 是一种比 Dropout 更高级的正则化方法,它专门针对 卷积神经网络(CNN) 中的特征图设计,能有效防止模型过拟合,效果非常实用且高效。
DropBlock 是一种针对 CNN 特征图的正则化方法,它会随机“抹掉”一个区域(Block)而不是单个点(像 Dropout 那样)。想象一下,把特征图中的一小块方形区域设为零,就像是图像上贴了一块“遮挡物”。这样训练时,模型就必须学会依赖更多元的上下文信息,而不是过度依赖某一个区域。
为什么要用 DropBlock(而不是 Dropout)?
在卷积网络中,普通的 Dropout 并不太有效,原因是:
- Dropout 是随机将单个像素设为 0
- 但在 CNN 的特征图中,相邻像素高度相关
- 所以即使“断”了一个点,其周围还会有类似信息,模型没太受影响
而 DropBlock 会将一整块区域同时设为 0,这更像是“局部信息丢失”,迫使模型从别的地方寻找信息,更有效防止过拟合。
DropBlock 的工作机制
核心参数有两个:
- block_size:要遮挡的方块区域的边长,比如 3 就是一个 3×3 的方块
- keep_prob / drop_prob:保留或丢弃的概率,控制正则化强度
实现步骤如下:
- 随机选择特征图上的若干中心点
- 以这些点为中心,生成固定大小的 block 区域
- 将这些 block 区域内的值全部设为 0
- 保持整个特征图的均值不变(可选的 scale 操作)
4.标签平滑(Label Smoothing)
标签平滑是一种防止模型过拟合的方法,核心思想是:不要把标签当作“100% 确定”的真理,而是给它留一点“模糊空间”。
传统分类任务中,标签是独热(one-hot)形式,比如对于 3 类任务中的第 2 类,标签为:
1 | [0, 1, 0] |
而标签平滑之后,就变成了类似:
1 | [0.1, 0.8, 0.1](当 smoothing=0.2 时) |
这样模型在训练时就不会把第二类“当作绝对真理”,而是会保持一些“不确定性”,从而减少过拟合。
为什么要用标签平滑?
在目标检测中,特别是像 YOLO 这样的大规模多类检测中,模型很容易:
- 对于某一类过拟合(预测置信度接近1)
- 对其他类别完全“视而不见”
这会造成模型泛化性差,一旦测试图像稍有偏差,模型就“懵了”。
而标签平滑可以缓解这个问题,让模型在训练过程中更温和地“相信”标签,从而提升稳定性与鲁棒性。
YOLOv4 使用标签平滑主要是用于:
- 类别置信度的预测部分(即 objectness + class probability)
- 搭配 CIoU Loss、Mosaic、SAT 等其他策略,形成一套完整的正则组合拳
- 特别有效于多类、小样本类别,能减少对“极端标签”的依赖
注意事项
- smoothing 不宜过大,一般 $0.05 \sim 0.1$
- 在 label 极其干净且类别之间差异极大时,可能带来微弱负面影响(置信度下降)
- 对于检测模型来说,标签平滑只作用在分类标签上,不影响位置(bbox)回归
5.IoU/GIoU/DIoU/CIoU 损失
在 YOLO 系列(特别是 YOLOv3 之后)中,边界框回归(bounding box regression) 的损失函数经历了从 IoU 到 GIoU、DIoU、CIoU 的逐步演化。这些损失函数的目标是让预测框更准确地贴合真实框。
IoU(Intersection over Union)
$$
IoU = \frac{Area\ of\ Overlap}{Area\ of\ Union}
$$
表示预测框和真实框重合部分与并集的比例,范围在 $[0, 1]$
问题点:
- 如果两个框 没有重叠(IoU=0),就无法提供任何梯度信息,模型无法学习
- 只能衡量“重叠程度”,不能衡量位置差异或形状差异
GIoU(Generalized IoU)
$$
GIoU = IoU - \frac{|C \setminus (A \cup B)|}{|C|}
$$
- $C$ 是预测框和真实框的最小闭包框(包含两者的最小矩形)
- 当 IoU = 0 时,GIoU 仍然能产生梯度
优点: - 即使两个框没有重叠,也能提供优化方向
- 更鲁棒地处理初始预测不准的情况
DIoU(Distance IoU)
$$
DIoU = IoU - \frac{\rho^2(\mathbf{b}, \mathbf{b}^{gt})}{c^2}
$$
- $\rho$:两个框中心点之间的欧几里得距离
- $c$:包含两个框的最小闭包框的对角线长度
优点: - 加入了 “中心点距离”惩罚项,促使预测框中心靠近真实框
- 收敛更快,回归效果更好
- 更适合快速定位目标
CIoU(Complete IoU)
$$
CIoU = IoU - \left( \frac{\rho^2(\mathbf{b}, \mathbf{b}^{gt})}{c^2} + \alpha v \right)
$$
其中:
- $\rho^2$ 是中心点距离;
- $v$ 是宽高比一致性度量项;
- $\alpha$ 是动态权重,依赖于 IoU 和 $v$;
其中:
$$v = \frac{4}{\pi^2} \left( \arctan\frac{w^{gt}}{h^{gt}} - \arctan\frac{w}{h} \right)^2$$
$$ \alpha = \frac{v}{(1 - IoU) + v} $$
优点是同时考虑了,框的重叠程度(IoU)、中心点距离(定位)、 宽高比差异(形状匹配)。是目前目标检测中最全面、收敛最快、表现最优的一种 bbox 回归损失。
2.Bag of specials(BOS)模型结构改进
1.CSPDarknet53(Cross Stage Partial Network)
CSPDarknet53 是 YOLOv4 的主干网络(Backbone),它是对 YOLOv3 中使用的 Darknet-53 的增强版本,引入了 CSPNet(Cross Stage Partial Network) 架构思想,大幅提升了网络的性能和效率。
Darknet-53 是 YOLOv3 使用的主干网络,包含 53 层卷积结构,使用残差连接(Residual),特点是结构简单,速度快,适合实时检测。
但是Darknet-53 在高层容易冗余梯度,特征融合效率一般,在保持轻量的同时很难进一步提升精度。
CSPDarknet是将特征图通道分成两部分:一部分直接跳过残差块,另一部分通过残差块学习,最终在 stage 的末尾进行融合。也就是说,在传统残差块的基础上,把输入一分为二:一半走残差学习路径,一半直接传输;最后再 concat(拼接)。
YOLOv4 中 CSPDarknet53 使用了新的激活函数:Mish,Mish 的特点:平滑且非单调,梯度流通更顺畅,表现优于 ReLU、LeakyReLU(但推理速度略慢)。
CSPDarknet53 = Darknet53 + CSPNet + Mish 激活函数,拥有更高的效率、更强的表示力,是 YOLOv4 实时检测的核心骨干网络。**
2.SPPNet(Spatial Pyramid Pooling)
SPPNet 是一个非常经典的结构,被广泛应用于图像分类、目标检测等任务中。YOLOv4 也集成了它的思想,用来增强特征提取能力。
它的核心思想是:在一张特征图上,进行多尺度的最大池化,然后把这些池化结果拼接起来,从而提取多尺度上下文信息。
为什么要用 SPP?
YOLOv4 中的目标检测有两个难点:
- 目标尺寸不一致 —— 同一张图里,大目标、小目标混杂
- 感受野不够大 —— 上层卷积只能看到局部
而 SPP 的优势是:
- 不改变输入图像尺寸
- 能提取 不同感受野下的特征(即多尺度上下文信息)
- 提升模型对大、小目标的适应能力
SPP 的结构怎么做?
假设某一层输出了一个大小为 n × n 的特征图。
我们在这个特征图上做:
- 1×1 最大池化(全局)
- 5×5 最大池化
- 9×9 最大池化
- 13×13 最大池化
然后对这些池化结果进行拼接(concat)。
通俗理解:就像把一个图像用不同大小的窗口去“扫”,每个窗口提取一个“全局摘要”特征,最后把这些不同尺度的摘要拼在一起,形成更全面的理解。
3.PANet(Path Aggregation Network)
PANet = FPN + Bottom-Up Path + Adaptive Feature Pooling
由 Facebook AI 在 2018 年提出,最初是为了改进实例分割和目标检测中的多尺度融合结构。
在 YOLOv4 中,PANet 被用作 Neck,连接主干网络(如 CSPDarknet53)和检测头(Head),增强信息流的双向传播。
PANet 的核心结构
1 | CSPDarknet53(Backbone) |
这种顺序结构被称为 “SPP + FPN + PANet”,强化了语义 & 位置特征融合,尤其对小目标检测非常有效。
PANet 的优势:
优点 | 说明 |
---|---|
双向融合 | 结合 top-down 和 bottom-up 信息 |
强化定位 | 底层信息可回传,增强空间细节 |
小目标检测提升 | 多尺度增强对小物体识别更敏感 |
与 FPN 兼容 | 在 FPN 基础上增强,无需重构体系 |
PANet = FPN 的双向升级版,它让特征融合从“单向信息流”变成“双向协作”,是 YOLOv4 实现强小目标检测能力的重要模块。
4.CBAM
CBAM(Convolutional Block Attention Module)是一个轻量级的注意力机制模块,可以无缝嵌入到现有的 CNN 网络中,用于增强模型对有用特征的关注能力,提升特征表达效果。CBAM 在图像分类、目标检测、分割等任务中都非常实用。
它是一个模块化的注意力结构,由两个子模块组成:
- Channel Attention Module(通道注意力)
- Spatial Attention Module(空间注意力)
这两个模块串联使用,用来从不同角度提升特征图的质量
通道注意力模块(Channel Attention),关注哪些通道更重要,如边缘通道、纹理通道、颜色通道等。以达到强化重要的通道,抑制冗余信息的目的。
步骤:
- 对输入特征图分别做 Global Avg Pooling 和 Max Pooling,得到两个通道描述向量(1×1×C)
- 将这两个向量送入 共享的 MLP(全连接层)
- 输出经过 sigmoid 激活的权重向量
- 将该权重与原特征图逐通道相乘
空间注意力模块(Spatial Attention),关注“图像上哪些位置更关键”,比如目标所在区域。
步骤:
- 对通道维做 MaxPool 和 AvgPool,得到两个 1×H×W 特征图
- 将它们拼接在通道维上(2×H×W)
- 通过一个 7×7 的卷积核
- 经 sigmoid 激活后生成空间注意力图
- 与输入特征图逐元素相乘
CBAM 的优势:
优点 | 说明 |
---|---|
模块轻量 | 几乎不增加计算量 |
可插拔 | 可用于任何 CNN 模型后续模块 |
语义增强 | 强调关键通道和空间区域,提高准确率 |
对小目标友好 | 提升模型关注小区域信息的能力 |
适合多任务 | 分类、检测、分割任务都适用 |
CBAM 是一个串联的“通道 + 空间”注意力模块,帮助 CNN 更聪明地理解“看哪”和“看什么”,在轻量化和性能之间取得了极佳的平衡。
5.Mish 激活函数
Mish 激活函数是一种新兴的非线性激活函数,在很多模型(包括 YOLOv4)中被应用,用于增强特征表达能力。它是 ReLU 和 Swish 的一种更平滑、性能更优的替代方案。
Mish 与其他激活函数的对比
激活函数 | 数学表达 | 是否平滑 | 是否单调 | 输出范围 | 性能表现 |
---|---|---|---|---|---|
ReLU | max(0, x) | 否 | 是 | [0, ∞) | 基础款 |
LeakyReLU | max(αx, x) | 否 | 是 | (-∞, ∞) | 较好 |
Swish | x * sigmoid(x) | 是 | 否 | (-∞, ∞) | 好 |
Mish | x * tanh(softplus(x)) | 是 | 否 | (-∞, ∞) | 最优(很多场景) |
Mish 继承了 Swish 的非线性优势,输出在负区间更温和,利于梯度流动。
Mish 的优势总结:
优势 | 描述 |
---|---|
更强特征表达 | 曲线光滑,非线性强,有利于建模复杂模式 |
梯度更稳定 | 相比 ReLU、LeakyReLU 梯度不会突变 |
不截断负值 | 在负区间仍有小的输出,有利于保留信息 |
实证有效 | 在 YOLOv4、EfficientNet 等网络上验证有效提升 |
YOLOv4 将 Mish 激活广泛用于主干 CSPDarknet53,替换了传统的 LeakyReLU,配合其他模块(如 CSP、SPP、PANet)进一步提升准确率,对小目标检测尤其明显。
6.Eliminate grid sensitivity
主要用于改善目标检测中因网格划分导致的预测偏差问题,尤其是在小目标或边缘目标的检测上。
什么是 Grid Sensitivity(网格敏感性)?
在 YOLO 系列(尤其是 YOLOv1~v3)中,图像被划分为 S×S 个网格,每个网格预测其“负责”的目标框:
- 每个目标只能被分配给其中心点所在的网格
- 假如目标刚好压在网格边缘,模型必须决定“左边网格负责”还是“右边负责”,这就容易产生波动(不稳定)
- 同样,小目标若跨多个网格,可能会出现预测位置偏差
YOLOv4 对于位置回归的预测做了以下调整,特别是在预测框中心坐标 (x, y) 的计算方式上:
加上一个小常数 ε,以允许预测点略微“跳出”当前网格,突破 sigmoid 限制。
方法一:缩放输出范围
$$\hat{x} = (\sigma(t_x) \cdot s + \epsilon) + c_x$$
- $s \in (0,1.5)$,例如 1.2
- ε 是微小偏移,用于平滑过渡
方法二:用更大的 sigmoid 控制区间
$$ \sigma(2 \cdot t_x) - 0.5 \ $$
- 这样 sigmoid 的范围变成了约 (-0.5, 1.5),可以适度超出网格边界
这种方式就允许中心坐标跨越网格边界,从而缓解边缘预测抖动,提升定位精度
通俗总结一下,网络把图像像井盖一样切成格子,以前每个“井盖”只能管它正中间的东西,现在我们说:井盖的手可以伸出去一点点,不用非得把人圈死在正中心,这样,就能“柔和地”预测落在格子边缘的目标了,不再出现抖动、漏检!
3.后处理优化
1.DIoU-NMS/Soft-NMS
用来改进 YOLO 等目标检测器中 非极大值抑制(NMS) 的优化技术,目的是在去除冗余检测框时,更智能地保留真实目标框,尤其对密集目标检测、小目标检测有帮助。
Soft-NMS 更柔和、精细地处理框之间的重叠;DIoU-NMS 则更智能地结合了 IoU 与中心距离,更适合 YOLO 等实时检测器,对密集目标特别有效。
NMS 是什么?
在目标检测中,模型可能对同一个物体输出多个重叠框,需要做抑制,原始 NMS(Greedy NMS) 策略是:
1. 选择当前得分最高的框
2. 将与其 IoU > 阈值 的其他框全部移除
3. 重复以上步骤直到无框可选
这种做法简单暴力,但存在两个问题:
- 对密集目标不友好(比如人群、果堆)
- 可能误删有效框(只因为 IoU 稍大)
Soft-NMS(Soft Non-Maximum Suppression)
不是直接删掉重叠框,而是“软处理”:随着 IoU 增加,逐渐降低其它框的置信度。
优点是更温和地处理重叠框;可以保留多个相邻目标,适合拥挤场景。
DIoU-NMS(Distance IoU-based NMS)
除了考虑 IoU,还考虑 两个框中心点的距离,优先保留“离得远的”框,避免误删多个相邻目标。
优点是解决 NMS 对密集目标误删问题;对于同类目标密集区域(如行人、人脸)效果明显提升, 速度快,易于替换传统 NMS。
DIoU-NMS vs Soft-NMS 对比
特性 | Soft-NMS | DIoU-NMS |
---|---|---|
保留重叠目标 | 更温和 | 更智能 |
抑制依据 | IoU + 衰减函数 | IoU + 距离 |
对密集目标 | 很有效 | 很有效 |
计算复杂度 | 较高(需要排序) | 类似原始 NMS |
是否去除框 | 不直接去除 | 直接去除(基于距离) |
在 YOLO 中应用 | 默认未启用 | YOLOv4 默认采用 |
3.总结
YOLO-V3 改进
- 网络架构改进
- 残差连接(Residual Connections):解决梯度消失和退化问题,允许训练更深的网络
- Darknet-53 主干网络:引入残差块,提升特征提取能力,支持多尺度检测
- 检测机制优化
- 多尺度预测:通过三个不同尺度的特征图(13×13、26×26、52×52)检测不同大小的目标
- 细粒度特征融合:上采样深层特征并与浅层特征拼接,结合细节与语义信息
- 边界框预测改进:sigmoid处理中心坐标,基于anchor的指数缩放预测宽高,提升稳定性
- 先验框优化:K-means聚类生成更匹配数据分布的anchor尺寸
- 分类方式:用sigmoid替代softmax,支持多标签分类
- 训练策略
- 多尺度训练:动态调整输入尺寸,增强模型鲁棒性
- 数据增强:如随机裁剪、色彩抖动等
- 损失函数:二元交叉熵(分类)与改进的定位损失结合
YOLO-V4 改进
- Bag of Freebies(训练优化)
- Mosaic数据增强:拼接四张图像,增加目标多样性和尺度变化
- 自对抗训练(SAT):生成对抗样本并训练模型,提升鲁棒性
- DropBlock:区域级正则化,防止过拟合
- 标签平滑:缓解分类标签的过拟合
- CIoU损失:综合考虑重叠、中心距离和宽高比,提升定位精度
- Bag of Specials(结构改进)
- CSPDarknet53:引入CSP结构和Mish激活函数,提升特征提取效率
- SPPNet:多尺度池化增强感受野
- PANet:双向特征金字塔,强化多尺度融合
- CBAM注意力机制:通道与空间注意力结合,聚焦关键特征
- Mish激活函数:平滑梯度,增强非线性表达能力
- 消除网格敏感度:允许预测框微调出网格,改善边缘目标检测
- 后处理优化
- DIoU-NMS:结合IoU与中心距离,减少密集目标的误删
对比
改进点 | YOLO-V3 | YOLO-V4 |
---|---|---|
主干网络 | Darknet-53(残差连接) | CSPDarknet53(CSP结构 + Mish激活) |
多尺度检测 | 三尺度特征图 + FPN思想 | SPP + PANet(双向融合) |
数据增强 | 多尺度训练、传统增强 | Mosaic、自对抗训练(SAT) |
正则化 | 残差连接、BatchNorm | DropBlock、标签平滑 |
损失函数 | Sigmoid分类 + 定位损失 | CIoU损失(综合重叠、距离、宽高比) |
注意力机制 | 无 | CBAM(通道与空间注意力) |
后处理 | 传统NMS | DIoU-NMS(结合距离抑制冗余框) |
激活函数 | LeakyReLU | Mish(更平滑的梯度流) |
YOLO-V3:通过残差结构、多尺度预测和细粒度融合,解决了深层网络训练难题,提升小目标检测能力。
YOLO-V4:集成大量训练技巧(Mosaic、SAT)和结构优化(CSP、PANet、CBAM),结合CIoU损失和DIoU-NMS,显著提升精度与鲁棒性,尤其适合复杂场景和密集目标检测。