YOLO目标检测算法
YOLOV1
- YOLOV1 论文地址:【https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf?spm=5176.28103460.0.0.359a5d27d0cimU&file=Redmon_You_Only_Look_CVPR_2016_paper.pdf】
- YOLOV1 论文中文翻译地址:【https://blog.csdn.net/muye_IT/article/details/124612829】
YOLOV2
- YOLOv2 论文地址:【https://arxiv.org/pdf/1612.08242#page=4.24】
- YOLOv2 论文中文对照地址:【https://blog.csdn.net/qq_42755230/article/details/125820723】
YOLOV3
- YOLOV3 论文地址::【https://arxiv.org/pdf/1804.02767】
- YOLOV3 论文中文翻译地址::【https://blog.csdn.net/yegeli/article/details/109751358】
YOLOV4
- YOLOv4 论文地址::【https://arxiv.org/pdf/2004.10934】
- YOLOv4 论文中文翻译地址:【https://blog.csdn.net/muye_IT/article/details/125294973】
1. 目标检测基础概念
1.1 什么是目标检测?
目标检测是计算机视觉中的一个重要任务,它不仅要识别图像中有什么物体,还要确定这些物体在图像中的具体位置(用边界框表示)
简单类比:就像人类看一张照片时,不仅能认出"这是一只猫",还能指出"猫在图片的左上角区域"
技术定义:给定一张图像,目标检测需要:
- 定位:找到目标的位置(边界框坐标)
- 分类:识别目标的类别
- 置信度:给出检测结果的可信程度
1.2 目标检测的挑战
- 实时性要求:很多应用场景需要实时检测(如自动驾驶、视频监控)
- 多尺度问题:同一张图片中物体大小差异很大(如远处的小人和近处的大车)
- 精度与速度平衡:既要准确又要快速
- 类别不平衡:某些类别样本少,检测效果差
- 遮挡问题:目标被部分遮挡时的检测
- 光照变化:不同光照条件下的鲁棒性
1.3 传统方法的局限性
在YOLO出现之前,主流的目标检测方法(如R-CNN系列)存在以下问题:
(1)R-CNN系列的问题
R-CNN(2014):
- 需要2000个候选区域
- 每个区域单独通过CNN
- 速度极慢:处理一张图需要40-50秒
Fast R-CNN(2015):
- 共享卷积特征
- 速度提升但仍需区域提议
- 无法实现真正的实时检测
Faster R-CNN(2016):
- 引入RPN网络
- 端到端训练
- 但仍是两阶段方法
(2)根本问题
- 速度慢:需要多次前向传播
- 复杂:需要区域提议、分类、回归等多个步骤
- 实时性差:无法满足实时应用需求
- 计算冗余:重复计算特征
1.4 YOLO的革命性突破
YOLO的出现彻底改变了目标检测的范式:
核心创新:
- 端到端:单一网络,一次前向传播
- 实时性:45 FPS,远超当时其他方法
- 全局信息:能看到整张图片的上下文
- 简单高效:训练和推理都相对简单
2. YOLOv1:开创性的实时检测
2.1 核心思想:一次看全图
2016年,Joseph Redmon、Santosh Divvala、Ross Girshick 等人提出了一种单阶段的目标检测网络。它的检测速度非常快,以 45 帧/秒的速度实时处理图像。由于其速度之快和其使用的特殊方法,作者将其取名为:You Only Look Once
YOLOv1提出了一个革命性的想法:将目标检测问题转化为回归问题,利用整张图作为网络的输入,仅仅经过一个神经网络,一次性预测所有边界框的位置及其所属的类别,整个过程图示如下:
- Resize image:将输入图像调整满足神经网络的尺寸(448 x 448)
- Run convolutional network:在图像上运行单个卷积网络
- Non-max suppression:根据模型设置的置信度阈值对检测得到的边界框进行 NMS 处理
2.2 网络结构详解
(1)整体架构
YOLOv1基于GoogLeNet设计(GoogLeNet-like)
- 结构:24 个卷积层、4 个池化层、2 个全连接层
- 根据论文中的网络结构(上图),复原网络结构参数
layer | output size | module |
---|---|---|
448x448x3 | ||
1 | 224x224x64 | Conv 7x7x64, s-2, p-3 |
112x112x64 | Maxpool 2x2, s-2, p-0 | |
2 | 112x112x192 | Conv 3x3x192, s-1, p-1 |
56x56x192 | Maxpool 2x2, s-2, p-0 | |
3 | 56x56x128 | Conv 1x1x128, s-1, p-0 |
4 | 56x56x256 | Conv 3x3x256, s-1, p-1 |
5 | 56x56x256 | Conv 1x1x256, s-1, p-0 |
6 | 56x56x512 | Conv 3x3x512, s-1, p-1 |
28x28x512 | Maxpool 2x2, s-2, p-0 | |
7,9,11,13 | 28x28x256 | Conv 1x1x256, s-1, p-0 |
8,10,12,14 | 28x28x512 | Conv 3x3x512, s-1, p-1 |
15 | 28x28x512 | Conv 1x1x512, s-1, p-0 |
16 | 28x28x1024 | Conv 3x3x1024, s-1, p-1 |
14x14x1024 | Maxpool 2x2, s-2, p-0 | |
17,19 | 14x14x512 | Conv 1x1x512, s-1, p-0 |
18,20 | 14x14x1024 | Conv 3x3x1024, s-1, p-1 |
21 | 14x14x1024 | Conv 3x3x1024, s-1, p-1 |
22 | 7x7x1024 | Conv 3x3x1024, s-2, p-1 |
23 | 7x7x1024 | Conv 3x3x1024, s-1, p-1 |
24 | 7x7x1024 | Conv 3x3x1024, s-1, p-1 |
25 | 4096x1 | FC1 |
26 | 1470x1 | FC2 |
7x7x30 | reshape |
(2)预测输出详解
每个网格预测:
- 2个边界框:每个框包含(x, y, w, h, confidence)
- 20个类别概率:VOC数据集的20个类别
参数归一化:
- (x,y)(x, y)(x,y):边界框中心点相对于该网格左上角的偏移量(归一化到[0,1])
- (w,h)(w, h)(w,h):边界框的宽和高,相对于整张图像的宽高进行归一化
- confidenceconfidenceconfidence:该边界框的置信度,表示框中存在目标的可能性
置信度计算:
confidence=Pr(Object)×IoUconfidence = Pr(Object) \times IoUconfidence=Pr(Object)×IoU
其中:
- Pr(Object)Pr(Object)Pr(Object):该网格包含目标的概率
- IoUIoUIoU:预测框与真实框的交并比
输出维度计算:
7 × 7 × (2×5 + 20) = 7 × 7 × 30 = 1470个参数
总体而言,S x S 个网格,每个网格要预测 B 个边框,还要预测 C 个类。输出的维度是 S x S x (5 x B + C),对于 VOC 数据集来说,最后输出就是 7 x 7 x (5 x 2 + 20),即 7 x 7 x 30
2.3 损失函数设计
(1)公式
YOLOv1的损失函数包含5个部分,精心设计以平衡不同损失项:
坐标损失,尺寸损失,有目标置信度损失,无目标置信度损失,分类损失
L=λcoord∑i=0S2∑j=0B1ijobj[(xi−x^i)2+(yi−y^i)2]【注解:边框中心点误差】+λcoord∑i=0S2∑j=0B1ijobj[(wi−w^i)2+(hi−h^i)2]【注解:边框宽高误差】+∑i=0S2∑j=0B1ijobj(Ci−C^i)2【注解:有物体时置信度误差】+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−C^i)2【注解:无物体时置信度误差】+∑i=0S21iobj∑c∈classes(pi(c)−p^i(c))2【注解:网格内有物体时的分类误差】 \begin{aligned} L &= \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} [(x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2] 【注解:边框中心点误差】\\ &+ \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} [(\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2] 【注解:边框宽高误差】\\ &+ \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{obj} (C_i - \hat{C}_i)^2 【注解:有物体时置信度误差】\\ &+ \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{noobj} (C_i - \hat{C}_i)^2 【注解:无物体时置信度误差】\\ &+ \sum_{i=0}^{S^2} \mathbb{1}_i^{obj} \sum_{c \in classes} (p_i(c) - \hat{p}_i(c))^2【注解:网格内有物体时的分类误差】 \end{aligned} L=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]【注解:边框中心点误差】+λcoordi=0∑S2j=0∑B1ijobj[(wi−w^i)2+(hi−h^i)2]【注解:边框宽高误差】+i=0∑S2j=0∑B1ijobj(Ci−C^i)2【注解:有物体时置信度误差】+λnoobji=0∑S2j=0∑B1ijnoobj(Ci−C^i)2【注解:无物体时置信度误差】+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2【注解:网格内有物体时的分类误差】
(2)公式图示
(3)公式解释
- λcoord\lambda_{coord}λcoord是一个权重系数,用于平衡坐标损失与其他损失项,论文中设置的值为 5
- S2S^2S2表示有多少个 grid,
- B 表示框的个数,在 YOLOv1 中是 2 种,即 B 为 2
- obj 表示有物体时的情况
- noobj 表示没有物体时的情况
- iji jij 表示第 i 个 的第 j 个框
- 1ijobj1_{ij}^{obj}1ijobj是一个指示函数,当某个边界框负责某个对象时为 1,否则为 0
- xi和yix_i和y_ixi和yi表示实际的坐标,xi^和yi^\hat{x_i}和\hat{y_i}xi^和yi^表示预测的坐标
- wi和hiw_i和h_iwi和hi表示实际的宽高,wi^和hi^\hat{w_i}和\hat{h_i}wi^和hi^表示预测的宽高
- CiC_iCi表示实际的置信度分数(Ci=Pr(obj)∗IoUC_i=Pr(obj)*IoUCi=Pr(obj)∗IoU),Ci^\hat{C_i}Ci^表示预测的置信度分数
- λnoobj\lambda_{noobj}λnoobj一个较小的权重系数,用来减少无对象区域的置信度损失的影响,论文中设置的值为 0.5
- 1ijnoobj1_{ij}^{noobj}1ijnoobj是一个指示函数,当某个边界框负责某个对象时为 0,否则为 1
- pi(c)p_i(c)pi(c)是第 i 个网格单元格中对象的真实类别分布,pi^(c)\hat{p_i}(c)pi^(c)是预测的类别概率分布
(4)损失函数各部分含义
坐标损失:预测框中心点坐标的误差
- 使用MSE计算坐标误差
- 只对有目标的框计算
尺寸损失:预测框宽高的误差
- 使用平方根缓解尺度不均衡问题
- 使得小目标和大目标在损失中权重更均衡
有目标置信度损失:包含目标的框的置信度误差
- 目标值为预测框与真实框的IoU
无目标置信度损失:不包含目标的框的置信度误差
- 目标值为0
- 权重系数λnoobj=0.5\lambda_{noobj}=0.5λnoobj=0.5,减少无目标区域的影响
分类损失:类别预测的误差
- 只对有目标的网格计算
- 使用MSE计算类别概率误差
(5)公式部分非常规操作详解
- 关于开根号:如果直接对 w 和 h 做 MSE,大框的误差会远大于小框,导致模型更关注大目标,使用平方根可以缓解这种尺度不均衡问题,使得小目标和大目标在损失中权重更均衡
λcoord∑i=0S2∑j=0B1ijobj[(wi−w^i)2+(hi−h^i)2] \begin{gathered} \lambda_{\mathbf{coord}}\sum_{i=0}^{S^{2}}\sum_{j=0}^{B}\mathbb{1}_{ij}^{\mathrm{obj}}\left[\left(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}}\right)^{2}+\left(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}}\right)^{2}\right] \end{gathered} λcoordi=0∑S2j=0∑B1ijobj[(wi−w^i)2+(hi−h^i)2]
- 关于 S 的平方以及 i 和 j
+∑i=0S2∑j=0BIijobj(Ci−C^i)2+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−C^i)2这里的i和j表示第i个Grid的第j个框,训练时只有一个匹配S2则表示共有7∗7共49个GridCell \begin{gathered} +\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{I}_{ij}^{\mathrm{obj}}\left(C_i-\hat{C}_i\right)^2 \\ +\lambda_\text{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^\text{noobj}\left(C_i-\hat{C}_i\right)^2 \\ \\ 这里的i和j表示第i个Grid的第j个框,训练时只有一个匹配\\ {S^2}则表示共有7 * 7 共49个Grid Cell \end{gathered} +i=0∑S2j=0∑BIijobj(Ci−C^i)2+λnoobji=0∑S2j=0∑B1ijnoobj(Ci−C^i)2这里的i和j表示第i个Grid的第j个框,训练时只有一个匹配S2则表示共有7∗7共49个GridCell
- 关于权重系数
λcoordλcoord表示调高位置(坐标和宽高都加入了该系数)误差的权重,毕竟这玩意很重要,设置为5 \begin{gathered} \lambda_{\mathbf{coord}} \\ \\ \lambda_{\mathbf{coord}} 表示调高位置(坐标和宽高都加入了该系数)误差的权重,毕竟这玩意很重要,设置为5 \end{gathered} λcoordλcoord表示调高位置(坐标和宽高都加入了该系数)误差的权重,毕竟这玩意很重要,设置为5
- 关于 noobj
λnoobj∑i=0S2∑j=0B1ijnoobj(Ci−C^i)2noobj表示没有物体时的情况λnoobj=0.5用于调整没有目标时的权重系数 \begin{gathered} \lambda_\text{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^B\mathbb{1}_{ij}^\text{noobj}\left(C_i-\hat{C}_i\right)^2 \\ \\ \text{noobj}表示没有物体时的情况 \\ \lambda_\text{noobj}=0.5用于调整没有目标时的权重系数 \end{gathered} λnoobji=0∑S2j=0∑B1ijnoobj(Ci−C^i)2noobj表示没有物体时的情况λnoobj=0.5用于调整没有目标时的权重系数
2.4 训练策略
(1)预训练策略
YOLOv1采用两阶段训练:
分类预训练:
- 在ImageNet上预训练分类网络
- 使用224×224输入
- 训练20个epoch
检测微调:
- 将分类网络转换为检测网络
- 使用448×448输入
- 在VOC数据集上微调
(2)数据增强
YOLOv1使用基础的数据增强技术:
- 随机裁剪
- 随机翻转
- 颜色抖动
- 噪声添加
2.5 YOLOv1的优势与局限
(1)优势
- 实时性:45 FPS,远超当时其他方法
- 端到端:单一网络,训练简单
- 全局信息:能看到整张图片的上下文
- 避免背景错误:不容易出现错误背景信息
(2)局限
- 定位精度不高:相比R-CNN系列精度较低
- 小目标检测差:7×7网格对小目标不够精细
- 长宽比适应性差:固定的网格划分限制了检测灵活性
- 召回率低:会错过一些实际存在的目标
2.6 性能对比分析
(1)错误类型分析
YOLOv1与Fast R-CNN的错误类型对比:
错误类型 | Fast R-CNN | YOLOv1 | 说明 |
---|---|---|---|
Correct | 71.6% | 65.5% | 正确检测 |
Loc | 8.6% | 19.0% | 定位错误 |
Sim | 4.3% | 6.75% | 相似类别误分类 |
Other | 1.9% | 4.0% | 其他错误 |
Background | 13.6% | 4.75% | 背景误检 |
分析:
- YOLOv1在定位精度上明显不如Fast R-CNN
- 但YOLOv1的背景误检率更低,说明全局信息利用更充分
(2)速度对比
方法 | mAP | 速度(FPS) | 特点 |
---|---|---|---|
Fast R-CNN | 71.6% | 慢 | 精度高但速度慢 |
YOLOv1 | 65.5% | 45 | 速度快但精度略低 |
小结:YOLOv1开创了实时目标检测的新时代,虽然精度还有提升空间,但其"一次看全图"的思想为后续发展奠定了基础。
3. YOLOv2:更好的检测性能
YOLOv2 主要是在 COCO 和 ImageNet 数据集上进行训练,由于 YOLOv2 能够检测 9000 个类别,所以 YOLOv2 也被称之为 YOLO9000:Better、Faster、Stronger
3.1 改进策略总览
YOLOv2通过一系列精心设计的改进,将mAP从63.4%提升到78.6%,实现了显著的性能提升:
简单说,这张图用控制变量法,验证了 YOLOv2 优化策略的有效性,也让 “mAP 提升” 从抽象指标,变成了可拆解的技术组合,是理解 YOLO 系列演进的核心参考
改进策略 | mAP提升 | 作用机制 |
---|---|---|
Batch Normalization(批量归一化) | +2% | 加速训练,缓解梯度消失,提升稳定性 |
hi-res classifier(高分辨率分类器预训练) | +4% | 适应高分辨率输入,提升对细节的识别能力 |
convolutional(卷积化) | +1% | 移除全连接层,提升效率 |
anchor boxes(引入锚框) | +5% | 预定义不同尺寸锚框,辅助预测目标边界框,提升检测精度和召回率 |
new network(是否更换 骨干网络) | +1% | DarkNet-19更高效 |
dimension priors(维度聚类) | +1% | 优化锚框尺寸分布,提升召回率 |
location prediction(位置预测) | +1% | 改进边界框预测方式,改进定位精度 |
passthrough(加入Passthrough层) | +1% | 特征融合提升小目标检测 |
multi-scale(多尺度训练) | +1% | 让模型适应不同尺寸输入,提升模型鲁棒性 |
hi-res detector(高分辨率探测器) | +1% | 训练后期切换到高分辨率,强化细节检测 |
3.2 网络结构优化
(1)DarkNet-19骨干网络
YOLOv2采用全新的DarkNet-19作为骨干网络,相比YOLOv1的GoogLeNet-like网络有显著改进:
优势分析:
- 轻量高效:相比GoogLeNet参数量更少
- BatchNorm加速:所有卷积层后都加入BN层
- 无全连接层:减少参数量,提升效率
- 全局平均池化:替代全连接层,减少过拟合
总共有 19 个卷积层(conv 层) + 5 个 max pooling 层,不包含全连接层(FC)
(2)输入端优化
1.多尺度训练策略:
YOLOv2引入多尺度训练,让模型适应不同尺寸的输入:
技术细节:
- 输入尺寸必须是32的倍数(因为网络下采样32倍)
- 最小尺寸:320×320
- 最大尺寸:608×608
- 每10个batch随机选择新尺寸
2.高分辨率分类器预训练:
YOLOv2采用三阶段训练策略:
基础分类训练:
- 使用224×224在ImageNet上训练
- 训练160个epoch
- 学习率:0.1,多项式衰减
高分辨率微调:
- 使用448×448继续训练
- 训练10个epoch
- 学习率:0.001
- 目标:让网络适应高分辨率输入
检测任务微调:
- 在目标检测数据集上微调
- 使用416×416输入
- 目标:学习检测任务
3.3 检测头优化
(1)检测训练
- 去掉最后一个卷积层,增加三个3×3卷积层
- 每个卷积层有1024个过滤器
- 最后增加1×1卷积层,输出检测所需的参数
- 对于VOC数据集:预测5个框的5个坐标,每个框20个类别,共125个过滤器
- 从最后的3×3×512层向第二个卷积层添加直通层,使用细粒度特征
(2)锚框(Anchor Boxes)机制
锚框概念:
- YOLOv1中每个网格预测两个检测框,YOLOv2中每个网格指定5个锚框,训练时只有最接近ground truth的检测框进行损失计算,引入锚框后,mAP由69.5下降至69.2,但召回率大幅上升
类别预测机制:
- 引入锚框后,我们将类别预测机制与空间位置分开处理,单独预测每个锚框的类和目标。和原来的YOLO一样,目标预测仍然预测先验框和真实框的IOU,而类别预测则预测在有目标存在下,该类别的条件概率
(3)Dimension Clusters(维度聚类)
- YOLOv2 使用了 Dimension Clusters 操作初始化锚框的尺寸
- 在标准的 K-means 聚类算法中,通常使用欧几里得距离作为距离度量。然而,对于边界框的聚类,YOLOv2 采用了IoU距离,IoU度量了两个边界框之间的重叠程度
d(box,centroids)=1−IoU(box,centroids)注解:centroids为聚类中心边框,box是gt的边框 d(box,centroids)=1-IoU(box,centroids) \\注解:centroids为聚类中心边框,box是gt的边框 d(box,centroids)=1−IoU(box,centroids)注解:centroids为聚类中心边框,box是gt的边框
- 计算步骤:
- 数据准备:从训练数据集中提取所有目标的真实边界框,这些边界框通常以坐标(x, y, w, h)的形式表示,其中(x, y)是边界框中心的坐标,w 和 h 是边界框的宽度和高度
- 初始化:随机选择k个边界框作为初始的聚类中心(centroids),YOLOv2 选择的是 5
- 分配簇:对于每个训练样本中的边界框,计算它与所有聚类中心的IoU,并根据1 - IoU的值将其分配到最近的簇中(即IoU最大的那个簇)
- 更新聚类中心:对于每个簇,重新计算其聚类中心(centroid),通常是取簇内所有边界框的平均值或中位数
- 迭代优化:重复步骤2和3,直到聚类中心不再显著变化或达到预定的最大迭代次数
- K 取值很关键:太小特征差距大,太大特征差距太小,随着聚类先验框个数的增加,平均 IOU 也在逐渐增加,可以明显看到当个数大于 5 之后增加逐渐缓慢,所以选择 5 个已经可以满足基本需求了
- 在没有锚框的情况下,我们的中间模型mAP为69.5,召回率为81%。有了锚框,我们的模型 mAP 为 69.2,召回率为 88%。即使mAP 下降了,平均召回率的增加意味着我们的模型有更大的改进空间
(4)直接位置预测
YOLOv2 不是直接预测边界框的位置,而是预测相对于 Anchor Boxes 的偏移量。这意味着每个 Anchor Box 会预测一个小的偏移量,用以调整 Anchor Box 的位置和大小,使之更接近真实的目标框
其中:
- tx、tyt_x、t_ytx、ty:网络预测的中心坐标偏移量
- cx、cyc_x、c_ycx、cy:单元格与图像左上角的偏移量
- σ\sigmaσ:Sigmoid函数,将tx和tyt_x和t_ytx和ty映射到[0,1]区间
- bx、byb_x、b_ybx、by:最终预测的边界框中心坐标
- bw和bhb_w和b_hbw和bh:最终预测边界框的大小
- pw和php_w和p_hpw和ph:锚框的宽度和高度
- tw和tht_w和t_htw和th:宽度、高度的相对偏移量
置信度计算:
confidence=Pr(object)∗IOU(b,object)confidence = Pr(object)∗IOU(b,object)confidence=Pr(object)∗IOU(b,object)
其中:
- Pr(object)Pr(object)Pr(object):当前边界框中是否包含目标对象的概率
- IOU(b,truth)IOU(b,truth)IOU(b,truth):预测框b与真实框之间的交并比
坐标转换:
所有计算基于归一化坐标,实际应用中需要转换为像素单位:
- 实际x坐标:X=bx×WX=b_x×WX=bx×W
- 实际y坐标:Y=by×HY=b_y×HY=by×H
- 实际宽度:Width=bw×WWidth=b_w×WWidth=bw×W
- 实际高度:Height=bh×HHeight=b_h×HHeight=bh×H
案例:
- 假设有一个网络单元格(cx,cy)=(2,3)(c_x,c_y)=(2,3)(cx,cy)=(2,3),预测的中心坐标偏移量为(tx,ty)=(0.6,0.4)(t_x,t_y)=(0.6,0.4)(tx,ty)=(0.6,0.4),对应的 Anchor Box 大小为(pw,ph)=(2.0,3.0)(p_w,p_h)=(2.0,3.0)(pw,ph)=(2.0,3.0),宽度和高度的偏移量为(tw,th)=(−0.5,0.2)(t_w,t_h)=(-0.5,0.2)(tw,th)=(−0.5,0.2)
- 最终预测的特征图中心坐标和大小为:
bx=σ(0.6)+2≈2.88by=σ(0.4)+3≈3.5bw=2.0∗e−0.5≈1.213bh=3.0∗e0.2≈3.6642 \begin{aligned} &b_x=\sigma(0.6)+2\approx{2.88}\\ &b_y=\sigma(0.4)+3\approx{3.5}\\ &b_w=2.0*e^{-0.5}\approx{1.213}\\ &b_h=3.0*e^{0.2}\approx{3.6642} \end{aligned} bx=σ(0.6)+2≈2.88by=σ(0.4)+3≈3.5bw=2.0∗e−0.5≈1.213bh=3.0∗e0.2≈3.6642
真实坐标
- 在YOLOv2中,输入图像调整为416×416像素,划分为13×13个网格,每个网格大小为32×32像素
- 上述案例中,结果 * 32 才能得到原位置,这是因为每个网格单元格的大小为 32x32 像素
bx=2.88∗32=92.16by=3.5∗32=112bw=1.213∗32=38.816bh=3.6642∗32=117.2544 \begin{aligned} &b_x=2.88*32=92.16\\ &b_y=3.5*32=112\\ &b_w=1.213*32=38.816\\ &b_h=3.6642*32=117.2544 \end{aligned} bx=2.88∗32=92.16by=3.5∗32=112bw=1.213∗32=38.816bh=3.6642∗32=117.2544
3.4 特征融合:Passthrough层
(1)设计动机
- 在不断执行卷积的过程中,感受野会越来越大
- 最后一层感受野太大,小目标可能会丢失
- 需要融合之前的特征来解决小目标检测问题
(2)实现机制
特征融合过程:
通过直通层( passthrough ),将相邻特征堆叠到不同通道上
将高分辨率特征和低分辨率特征串联起来
将输出的13×13特征图融合中间的26×26特征图
如图:可以把前面的特征图拆分成和后面特征图大小相同然后和后面的特征相加,这个相加指的是沿通道维度进行拼接(concatenation),形成一个H2×W2×(4C+N)\frac{H}{2}×\frac{W}{2}×(4C+N)2H×2W×(4C+N)的特征图
- 26×26×512特征图分别按行和列隔点采样,得到4个13×13×512特征
- 把这4张特征按channel串联起来,形成最终的13×13×1024特征图
技术优势:
- 保留细节信息:浅层特征包含更多细节
- 提升小目标检测:高分辨率特征有助于检测小目标
- 计算效率:相比上采样,隔点采样计算量更小
3.5 输出特征维度
(1)YOLOv1输出维度
- 7×7个网格,每个网格输出两个边界框
- 每个边界框:4个位置参数+1个置信度
- 每个网格:20个类别的条件类别概率
- 总输出:7×7×(2×5+20) = 7×7×30 = 1,470个参数
(2)YOLOv2输出维度
- 13×13个网格,每个网格产生5个锚框
- 每个锚框:4个定位参数+1个置信度+20个类别条件概率
- 每个锚框产生25个数,总共输出5×25=125个数
- 总输出:13×13×125 = 21,125个参数
输出维度公式:
S×S×B×(4+1+C)S \times S \times B \times (4 + 1 + C)S×S×B×(4+1+C)
- S:图像划分的网格数(如13×13)
- B:每个网格的锚框数量(5个)
- C:类别数量(VOC数据集20类、COCO数据集80类)
3.6 性能对比
YOLOv2相比YOLOv1在多个指标上都有显著提升:
技术亮点:
- 锚框机制:引入预定义边界框,提升检测精度
- 维度聚类:数据驱动的锚框设计
- 多尺度训练:提升模型鲁棒性
- 特征融合:解决小目标检测问题
- 直接位置预测:改进边界框回归
小结:YOLOv2通过锚框机制、多尺度训练、特征融合等改进,在保持实时性的同时显著提升了检测精度,为后续版本奠定了坚实基础。
4. YOLOv3:多尺度检测的突破
4.1 核心改进:多尺度预测
- 核心创新:引入多尺度预测,在 3 个不同尺度上执行目标检测,每个尺度配备 3 个锚框,共 9 个锚框,可精准检测不同规模目标
- 性能优势:在实时性与精确性上表现优异,因此在工业界得到广泛应用
- 关键改进:优化网络结构以提升小目标检测能力;改进 softmax 函数,支持多标签任务预测
4.2 网络结构详解
(1)整体结构
核心组件
- CBL:最小组件,由卷积层(Convolutional Layer)、批量归一化层(Batch Normalization Layer)和 Leaky ReLU 激活函数组成
- resunit(残差单元):含多个 CBL,输入经两个 CBL 处理后与原输入执行 add 操作,可提取深层特征并避免梯度消失 / 爆炸
- 梯度消失:反向传播中梯度极小,权重更新停滞
- 梯度爆炸:反向传播中梯度极大,导致模型训练不稳定或发散
- resn:大型组件,含 1 个 padding、1 个 CBL 和 N 个残差单元(n 为残差单元数量)
- concat:实现多尺度特征融合,将 Darknet-53 中间层与后续上采样层张量拼接,会扩充张量维度(如两个104×104×128 拼接后为 104×104×256)
- add:张量直接相加,不改变维度(如两个104×104×128 相加后仍为 104×104×128)
- 上采样:放大低分辨率特征图至与高分辨率特征图匹配,助力融合细节信息,提升不同尺度目标检测能力(尤其小目标)
输出说明
- 输出维度 255 的计算:3 个锚框 ×(4 个坐标参数 + 1 个置信度 + 80 个类别概率)
- 最终输出三种尺度的特征图,对应不同目标检测需求
(2)主干网络(Darknet-53)
无池化和全连接层,通过 Stride 实现尺寸变换,包含 5 组残差块
以 256×256 输入为例的流程:
- 经 3×3×32 卷积层,输出 256×256×32
- 经 3×3×64(stride=2)卷积层,输出 128×128×64,后接 1 个残差块,保持 128×128×64
- 经 3×3×128(stride=2)卷积层,输出 64×64×128,后接 2 个残差块,保持 64×64×128
- 经 3×3×256(stride=2)卷积层,输出 32×32×256,后接 8 个残差块,保持 32×32×256
- 经 3×3×512(stride=2)卷积层,输出 16×16×512,后接 8 个残差块,保持 16×16×512
- 经 3×3×1024(stride=2)卷积层,输出 8×8×1024,后接 4 个残差块,保持 8×8×1024
- 最终经池化、全连接层及 softmax 输出
(3)特征输出
不同尺寸特征图适配不同大小目标,基于感受野差异:
- 52×52:感受野小,适合检测小型目标
- 26×26:感受野中等,适合检测中小型目标
- 13×13:感受野大,适合检测大型目标
4.3 特征金字塔网络(FPN)
(1)FPN 思想
核心背景:目标检测中,不同尺度目标对特征需求不同
- 大目标依赖高层语义信息(类别、整体形状)
- 小目标依赖低层细节信息(边缘、纹理)
传统问题:单尺度特征提取网络(如 YOLOv2)仅用最后一层特征图预测,小目标检测效果差
FPN 目标:通过融合多尺度特征,让每个尺度特征图兼具丰富语义信息,提升不同尺度目标(尤其是小目标)的检测能力
核心流程:
- 特征提取:用骨干网络(如 ResNet、Darknet-53)提取不同分辨率特征图(如 13x13、26x26、52x52)
- 自顶向下路径:从高层特征图逐层上采样,将高层语义信息传递至低层,增强低层语义表达
- 横向连接:将自顶向下路径的特征图与同尺度骨干网络输出特征图通道拼接,融合低层细节与高层语义,提升多尺度检测能力
- 特征融合:横向连接后用 CBL 模块(Conv + BN + Leaky ReLU)或 3×3 卷积处理,增强特征表达并减少信息冗余
方案对比:
- 图 a(特征化图像金字塔):需对不同尺度图像分别预测,效率低
- 图 b(单特征映射):单特征图预测,特征丢失,小目标效果差
- 图 c(金字塔特征层次结构):骨干网络传播中独立预测,特征未充分利用
- 图 d(特征金字塔网络):融合不同特征图后预测,性能更优
(2)FPN 融合
- YOLOv3 的 FPN 应用:重用主干网络的 8 倍、16 倍、32 倍下采样特征图,基于 FPN 思想融合 16 倍、32 倍及上采样结果
- 改进点:用通道拼接(Concatenate),替代传统 FPN 的加法(Add)融合:
- 增加特征图通道数,捕捉更多信息
- 避免加法可能导致的重要信息掩盖,保留全部原始信息
- 预处理操作:
- 1×1 卷积实现通道数一致性
- 2× 上采样实现尺寸一致性
(3)上采样融合
- 核心作用:通过特征融合架构,提升对各种尺寸物体的检测能力
4.4 多尺度预测机制
在 YOLOv3 中,针对 416×416×3 的输入图像,会生成 3 个不同尺度的特征图,分别为 13×13、26×26、52×52,对应不同数量的网格。每个网格配备 3 个锚框,因此最终的预测框总数为(13×13 + 26×26 + 52×52)×3 = 10647 个。后续会通过阈值过滤掉置信度较低的预选框,每个网格最终仅保留置信度最大的预测结果。
在 COCO 数据集上,YOLOv3 采用 9 种不同形状的锚框,并将其分配到上述三个尺度的特征图中,每个尺度对应 3 个锚框,以匹配不同大小的目标:
- 13×13 特征图:感受野大,适合预测较大目标,能捕捉全局信息
- 26×26 特征图:适用于预测中等大小的目标
- 52×52 特征图:分辨率高,可捕捉更多细节,适合预测较小目标
每个网格对应一个 85 维度的张量,其中:
- 5 个维度为:目标中心点坐标(x、y)、宽(w)、高(h)以及置信度
- 另外 80 个维度为 COCO 数据集 80 个类别的类别概率
4.5 类别预测改进
在现实场景中,一个目标可能同时属于多个类别(如 “女性” 和 “人”),而传统 softmax 函数假设类别之间相互排斥,这与实际情况并不相符。多标签分类方式更符合真实数据分布,能够更好地处理类别共存的场景。
为此,YOLOv3 放弃了 softmax,转而采用独立的逻辑回归分类器进行类别预测:
- 为每个类别配备独立的二元分类器
- 使用 sigmoid 激活函数处理每个类别
- 支持同时预测多个类别
这种设计的优势在于:
- 能够实现多标签预测,适应目标类别重叠的现实场景
- 避免了 softmax 的类别互斥假设
- 提升了模型对复杂分类任务的适应能力
4.6 损失函数优化
YOLOv3 的损失函数由三个核心部分组成:
- 定位损失:采用均方误差(MSE)计算,仅针对与真实框匹配的锚框,衡量其在位置(x,y)和尺寸(w,h)上的预测误差
- 置信度损失:使用二元交叉交叉熵(BCE),分为两部分:对负责预测目标的锚框,目标值为预测框与真实框的 IOU;对不负责预测的锚框,目标值为 0,帮助模型区分含目标与不含目标的边界框
- 分类损失:基于独立的二元分类器,对每个类别使用二元交叉熵(BCE),支持多标签分类,允许一个边界框同时属于多个类别
这种损失函数设计兼顾了定位精度、目标识别和复杂类别关系的建模需求
4.7 性能对比
(1)定量分析
- AP50:IoU 阈值为 0.5 时的 AP 测量值
- AP75:IoU 阈值为 0.75 时的 AP 测量值
- APs:对于小目标的 AP 值
- APm:对于中等目标的 AP 值
- APL:对于大目标的 AP 值
(2)改进效果分析
小目标检测突破:
- APs提升16.1%,是最大的改进
- 多尺度预测机制显著改善小目标检测
- 52×52特征图专门负责小目标检测
中等目标检测:
- APm提升7.2%,效果明显
- 26×26特征图适合中等目标
- 特征融合增强中等目标检测能力
大目标检测:
- APL提升4.7%,保持稳定
- 13×13特征图感受野大,适合大目标
- 语义信息丰富,检测精度高
(3)技术优势总结
多尺度检测优势:
- 适应性更强:不同尺度特征图专门检测不同大小目标
- 精度提升:每个尺度都能获得最佳检测效果
- 鲁棒性好:对目标大小变化更敏感
特征融合优势:
- 信息互补:高层语义信息与低层细节信息结合
- 梯度传播:残差连接改善梯度传播
- 计算效率:相比重复计算,特征复用更高效
特别关注:小目标检测(APs)提升显著,从35.0%提升到51.1%,这是YOLOv3最重要的贡献。
小结:YOLOv3通过多尺度预测和特征融合,显著提升了小目标检测能力,为后续版本奠定了坚实基础。
5. YOLOv4:最优速度与精度
5.1 改进点和贡献
YOLOv4 是一种高效且准确的目标检测模型,它在 YOLOv3 的基础上引入了多项改进,旨在提高模型的检测速度和精度
核心改进策略:
- 输入端:CutMix、Mosaic数据增强
- 骨干网络:CSPDarknet53(为backbone、SPP 额外添加模块)
- 颈部网络:SPP、PANet
- 检测头:YOLOv3检测头
- 损失函数:CIoU损失
- 激活函数:Mish激活
- 样本匹配:增加了匹配样本的数量
贡献:
- 算力要求低,单 GPU 就能训练好
- 从数据层面(数据增强等)和网络设计层面(网络结构)来进行改善
- 融合各种神经网络论文的先进思想
5.2 数据增强策略
(1)Bag of freebies
- 指仅优化训练策略或增加训练成本,不提高测试成本的方法,核心目标是提升模型精度。目标检测中典型应用为数据增强,通过增加输入图像多样性,增强模型对不同环境图片的鲁棒性
- 典型使用场景:Mosaic 数据增强、标签平滑、自对抗训练、CIOU 损失函数、CmBN
(2)Bag of specials
- 指仅增加少量推理成本的插入模块或后处理方法,可显著提升检测准确性。插入模块用于增强模型属性(如扩大感受野、引入注意力机制等),后处理用于筛选预测结果
- 典型使用场景:Mish 激活函数、CSP 结构
(3)CutMix 数据增强
通过混合不同图像的局部特征实现增强,核心优势包括:
增强局部特征学习能力,让模型获取更多局部信息
增加高价值训练信息,提升训练效率与算法性能
引入多样本,减少过拟合,提高泛化能力
以填充形式混合图像,避免不自然场景,稳定分类表现
(4)Mosaic 数据增强
Mosaic数据增强的具体步骤:
首先随机取 4 张图片
分别对 4 张图片进行基本的数据增强操作(翻转、缩放以及色域变化(明亮度、饱和度、色调)等操作),并分别粘贴至与最终输出图像大小相等掩模的对应位置
进行图片的组合和框的组合
- 优点:
- 丰富数据多样性,增加训练样本场景复杂度
- 提升模型对不同场景的鲁棒性
- 减少过拟合,增强泛化能力
- 支持小 Batch Size 训练,降低单 GPU 训练算力需求
(5)DropBlock 正则化
针对卷积神经网络的正则化技术,通过训练时随机丢弃特征图中的连续区域(块) 防止过拟合。与传统 Dropout 随机丢弃独立神经元不同,其通过移除连续语义区域,增强正则化效果
图(b) 表示 Dropout 、图(c)表示 DropBlock
(6)Class label smoothing(标签平滑)
标签平滑是一种用于减少模型过拟合、提升泛化能力的正则化技术。其核心思想是通过对训练标签进行平滑处理,降低模型对单一类别的过度自信,增强模型鲁棒性
独热编码是分类任务中常用的标签格式,对于含 K 个类别的任务,每个类别被映射为长度为 K 的二进制向量,仅对应类别索引位置为 1,其余为 0(例如三分类标签可为 [1,0,0],[0,1,0],[0,0,1])
工作原理
将传统的 “硬标签”(one-hot 编码的 0/1 取值)转换为 “软标签”,使每个类别概率介于 0 和 1 之间
公式:
- ytruey_{true}ytrue是原始的 one-hot 编码标签
- ysmoothedy_{smoothed}ysmoothed是平滑后的标签
- ϵ\epsilonϵ是平滑系数,通常是一个较小的正数(例如 0.1)
- K 是类别的总数
ysmoothed=(1−ϵ)⋅ytrue+ϵK y_{smoothed}=(1-\epsilon)·y_{true}+\frac{\epsilon}{K} ysmoothed=(1−ϵ)⋅ytrue+Kϵ
案例
假设我们有一个三分类任务,原始的 one-hot 编码标签是 [1, 0, 0],平滑系数 𝜖=0.1,类别总数 𝐾=3。那么平滑后的标签计算如下:
y1=(1−0.1)∗[1,0,0]+0.13=[0.9,0,0]+0.0333=[0.9333,0.0333,0.0333] \begin{aligned} &y_{1}=(1-0.1)*[1,0,0]+\frac{0.1}{3}=[0.9,0,0]+0.0333=[0.9333,0.0333,0.0333] \\ \end{aligned} y1=(1−0.1)∗[1,0,0]+30.1=[0.9,0,0]+0.0333=[0.9333,0.0333,0.0333]
(7)CmBN(交叉小批量归一化)
CBN 的改进版,通过跨多个小批量积累计算均值和方差,形成全局统计量,提升统计稳定性,减少训练震荡
与其他归一化方法对比:
方法 | 均值 / 方差计算方式 | 跨 batch | 引入条件信息 | 适用场景 | 优势 |
---|---|---|---|---|---|
BN | 当前 batch 内 | 否 | 否 | 通用 | 简单高效 |
CBN | 当前 batch + 条件信息 | 否 | 是 | 多任务、生成模型 | 控制特征分布 |
CmBN | 当前 batch + 历史 batch(滑动平均) | 是 | 否 | 小 batch size | 提升统计稳定性 |
(8)Mish 激活函数
- 与 ReLU 等非平滑激活函数相比,Mish 具有更好的平滑性,平滑的激活函数能够让模型获得更好的非线性,从而得到更好的准确性和泛化
- Mish 激活函数的数学表达式为:
Mish(x)=x∗tanh(ln(1+ex)) Mish(x)=x*tanh(ln(1+e^x)) Mish(x)=x∗tanh(ln(1+ex))
- Mish 函数和 ReLU 一样都是无正向边界的,可以避免梯度饱和
- 使用了Mish激活函数的 TOP-1 和 TOP-5 的精度比没有使用时都略高一些:
5.3 网络结构优化
(1)整体网络结构
YOLOv4 的整体架构由三部分核心组件构成:
- 骨干网络:采用 CSPDarknet-53,基于 Darknet-53 改进,通过 CSP 模块增强特征表示能力
- 颈部网络:包含 SPP 附加模块与 PANet 路径聚合结构
- 检测头:沿用 YOLOv3 的检测头设计
(2)CSPNet(跨阶段局部网络)
CSPNet 核心目标是解决推理中计算量过高的问题,其核心机制源于对 “梯度信息重复导致冗余计算” 的优化:
核心设计:将基础层特征按通道划分为两部分,一部分直接传递至下一阶段,另一部分经卷积处理后再传递,最终通过跨阶段结构合并,在减少了计算量的同时可以保证准确率
Bottleneck 层结构:由 3 个卷积层组成,依次为 1×1 卷积(降维减计算)、3×3 卷积(特征提取)、1×1 卷积(恢复通道维度)
优点:在轻量化模型的同时保持准确率,降低计算成本与内存成本,增强 CNN 学习能力
(3)YOLOv4 的 CSP 实现
CSPNet 通过通道划分与跨阶段融合机制,有效减少了冗余计算,提升了模型的学习能力与推理效率,是现代高性能目标检测模型(如 YOLOv4 及其后续版本)中广泛采用的主干网络设计思想
YOLOv4 中 CSP 模块通过 “通道划分 - 特征处理 - 跨阶段融合” 三步机制优化特征提取:
通道划分(Split):输入特征通道按 1:1 分为两部分,Part A 直接跳过当前模块传至拼接层,Part B 进入特征处理环节
特征处理(Transform):Part B 经多个 Darknet Bottleneck 模块处理(含 1×1 降维、3×3 特征提取及可选残差连接)
跨阶段融合(Merge):将 Part A 与 Part B 输出在通道维度拼接,再通过 1×1 卷积融合特征后输出至下一阶段
(4)SPPNet(空间金字塔池化网络)
SPPNet 核心作用是解决输入图像尺寸不一的问题,在 YOLOv4 中用于增强多尺度目标感知:
原理:通过多尺度池化将不同大小输入映射为固定长度输出,提升模型灵活性与泛化能力
YOLOv4 中的应用:集成于主干网络后,对特征图进行 4 次不同尺度池化(含原特征图),沿通道拼接为 13×13×1024 特征图(保持空间分辨率,增加通道数)
效果:扩大网络感受野,融合多尺度信息,提升不同大小目标的检测性能
(5)FPN+PAN 特征融合
PANet(Path Aggregation Network)是一种用于特征金字塔网络(Feature Pyramid Network, FPN)的改进版本,通过双向路径增强跨尺度特征融合,提升多尺度目标检测精度:
- 核心组成:
- 自顶向下路径(FPN):从高层(强语义、弱空间)到低层(弱语义、强空间)上采样,融合后增强低层语义表达,助力大目标检测
- 自底向上路径(PAN):从低层到高层下采样,融合后增强高层定位能力,助力小目标检测
- YOLOv4 改进:特征层融合时采用通道维度拼接(Concat)替代原始 PANet 的加法(addition),增强融合效果
5.4 损失函数优化
MSE Loss 存在导数变化不稳定问题(早期损失大时导数大,后期导数小导致训练变慢)。为此学者提出 IOU 系列损失函数,演变过程为:IoU → GIoU → DIOU → CIOU,每一代均在上一代基础上优化。
(1)IoU Loss
定义:LIoU=1−∣B∩Bgt∣∣B∪Bgt∣\mathcal{L}_{IoU}=1-\frac{|B\cap B^{gt}|}{|B\cup B^{gt}|}LIoU=1−∣B∪Bgt∣∣B∩Bgt∣,交集越大则损失越小
缺陷:
- 情况 1 ,当预测框与目标框不相交时,IoU=0,损失函数不可导,无法反映距离远近
- 情况 2 和情况 3,当两预测框大小相同且 IoU 相等时,无法区分位置差异
(2)GIoU Loss
- 改进:在 IoU 基础上引入最大外接矩形 C 及差集 A(红)(C - 并集),公式为LGIoU=1−∣IoU∣+∣A∣∣C∣\mathcal{L}_{GIoU}=1-|IoU|+\frac{|A|}{|C|}LGIoU=1−∣IoU∣+∣C∣∣A∣
优点:也会关注非重合区域,添加了惩罚因子,缓解 IoU Loss 不可导问题,更能反映重合度
缺陷:当差集相等时,退化为 IoU Loss,无法区分相对位置关系
(3)DIoU Loss
DIoU 作者认为好的目标框回归函数应该考虑 3 个重要几何因素:重叠面积、中心点距离,长宽比
核心思路:考虑重叠面积和中心点距离,优化目标框回归效率
公式:
LDIoU=1−|DIoU|=1−|IoU|+ρ2(B,Bgt)lc2ρ(B,Bgt)表示检测框中心点和真实框中点之间的欧式距离,lc表示最小外接矩形的对角线距离 \begin{aligned} &\mathcal{L}_{DIoU}=1-\text{|DIoU|}=1-\text{|IoU|}+\frac{\rho^2(B,B^{gt})}{l_c^2} \\ &\rho(B,B^{gt})\text{表示检测框中心点和真实框中点之间的欧式距离,}l_c\text{表示最小外接矩形的对角}\\&\text{线距离}\end{aligned} LDIoU=1−|DIoU|=1−|IoU|+lc2ρ2(B,Bgt)ρ(B,Bgt)表示检测框中心点和真实框中点之间的欧式距离,lc表示最小外接矩形的对角线距离
图示:效果图:
优点:目标框包裹预测框时直接计算距离,收敛更快
缺陷:未考虑长宽比因素,当中心点距离相同时退化为 IoU Loss
(4)CIoU Loss
改进:在 DIoU 基础上增加长宽比相似性约束(利用惩罚因子进行约束),纳入重叠面积、中心点距离、长宽比三大几何因素
应用:YOLOv4 采用其作为回归损失函数,分类与目标损失用交叉熵损失
数学表达式:
LCIoU=1−∣CloU∣=1−∣IoU∣+ρ2(B,Bgt)lc2+αvv=4π2(arctanwgthgt−arctanwphp)2ρ2(B,Bgt),lc2分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,w和h表示预测框的宽高v是衡量长宽比一致性的参数,wgt,hgt为真实框的宽高,wp,hp为检测框的宽高α是平衡因子,计算公式为v(1−IoU)+v \begin{aligned} &\mathcal{L}_{CIoU}=1-|CloU|=1-|IoU|+\frac{\rho^2(B,B^{gt})}{l_c^2}+\alpha{v} \\ &v=\frac4{\pi^2}\left(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w^p}{h^p}\right)^2 \\ &\rho^2(B,B^{gt}),l_c^2 分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,w和h表示预测框的宽高 \\ &v\text{是衡量长宽比一致性的参数,}w^{gt},h^{gt}\text{为真实框的宽高,}w^p,h^p\text{为检测框的宽高}\\ &\alpha是平衡因子,计算公式为\frac{v}{(1-IoU)+v} \end{aligned} LCIoU=1−∣CloU∣=1−∣IoU∣+lc2ρ2(B,Bgt)+αvv=π24(arctanhgtwgt−arctanhpwp)2ρ2(B,Bgt),lc2分别表示预测结果与标注结果中心点的欧氏距离和框的对角线距离,w和h表示预测框的宽高v是衡量长宽比一致性的参数,wgt,hgt为真实框的宽高,wp,hp为检测框的宽高α是平衡因子,计算公式为(1−IoU)+vv
(5)损失函数对比
损失函数 | 重叠面积 | 中心距离 | 长宽比 | 收敛速度 | 精度 |
---|---|---|---|---|---|
IoU | ✅ | ❌ | ❌ | 慢 | 低 |
GIoU | ✅ | ❌ | ❌ | 中等 | 中等 |
DIoU | ✅ | ✅ | ❌ | 快 | 高 |
CIoU | ✅ | ✅ | ✅ | 最快 | 最高 |
5.5 激活函数改进
(1)Mish激活函数
公式:
Mish(x)=x⋅tanh(ln(1+ex)) Mish(x) = x \cdot \tanh(\ln(1 + e^x)) Mish(x)=x⋅tanh(ln(1+ex))
Mish函数特点:
- 平滑性:与ReLU等非平滑激活函数相比,Mish具有更好的平滑性
- 无界性:无正向边界,可以避免梯度饱和
- 非线性:能够提供足够的非线性表达能力
- 梯度友好:在反向传播时梯度更稳定
(2)激活函数对比
Mish vs ReLU:
特性 | ReLU | Mish |
---|---|---|
平滑性 | 非平滑 | 平滑 |
梯度饱和 | 容易饱和 | 不易饱和 |
计算复杂度 | 简单 | 复杂 |
精度提升 | 基础 | 显著 |
5.6 性能对比
(1)数据增强效果
数据增强策略 | 作用机制 |
---|---|
CutMix | 增强局部特征学习,提高训练效率 |
Mosaic | 增加数据多样性,提升模型鲁棒性 |
Label Smoothing | 防止过拟合,提高泛化能力 |
Mish激活 | 提升非线性表达能力,改善梯度传播 |
DropBlock | 防止过拟合,提升正则化效果 |
CmBN | 提升统计稳定性,减少训练震荡 |
(2)网络结构效果
组件 | 作用机制 |
---|---|
CSPDarknet53 | 提升特征提取能力,减少计算量 |
SPP模块 | 扩大感受野,融合多尺度信息 |
PANet | 改善特征融合,增强信息传递 |
CIoU损失 | 改进边界框回归,提升定位精度 |
(3)最终性能对比
模型 | mAP | 速度(FPS) | 特点 | 主要改进 |
---|---|---|---|---|
YOLOv3 | 57.9% | 20 | 基础版本 | 多尺度检测 |
YOLOv4 | 65.7% | 62 | 最优速度精度 | 数据增强+网络优化 |
(4)技术贡献总结
数据层面贡献:
- CutMix:通过混合不同图像的局部区域增强数据
- Mosaic:通过拼接多张图像增加数据多样性
- 标签平滑:通过软化标签提高模型泛化能力
网络层面贡献:
- CSP模块:通过通道分割减少计算量,提升效率
- SPP模块:通过多尺度池化扩大感受野
- PANet:通过双向特征融合增强信息传递
损失函数贡献:
- CIoU损失:综合考虑重叠面积、中心距离和长宽比
- Mish激活:提供更好的非线性表达能力
小结:YOLOv4通过精心设计的数据增强、网络结构和损失函数,在保持实时性的同时达到了当时最优的检测精度,为工业应用提供了强有力的工具。
6. 总结与展望
6.1 YOLO系列发展脉络
版本 | 核心创新 | mAP | 速度(FPS) | 主要贡献 |
---|---|---|---|---|
YOLOv1 | 端到端检测 | 65.5% | 45 | 开创实时检测 |
YOLOv2 | 锚框机制 | 78.6% | 67 | 提升检测精度 |
YOLOv3 | 多尺度预测 | 81.2% | 20 | 改善小目标检测 |
YOLOv4 | 最优设计 | 65.7% | 62 | 平衡速度精度 |
6.2 关键技术演进
(1)网络结构演进
- YOLOv1: GoogLeNet-like → 简单但有效
- YOLOv2: DarkNet-19 → 更轻量高效
- YOLOv3: DarkNet-53 → 更深层特征
- YOLOv4: CSPDarknet53 → 最优设计
演进特点:
- 深度增加:从24层到53层,再到CSP模块
- 效率提升:参数量优化,计算效率提升
- 特征增强:从简单卷积到残差连接,再到CSP模块
(2)检测策略演进
- YOLOv1: 7×7网格 → 简单直接
- YOLOv2: 锚框机制 → 提升精度
- YOLOv3: 多尺度预测 → 改善小目标
- YOLOv4: 最优组合 → 平衡性能
演进特点:
- 网格划分:从7×7到13×13,再到多尺度
- 预测方式:从直接预测到锚框回归
- 特征融合:从单一特征到多尺度融合
(3)损失函数演进
- YOLOv1: MSE损失 → 基础回归
- YOLOv2: 改进MSE → 更好收敛
- YOLOv3: 分类损失改进 → 多标签支持
- YOLOv4: CIoU损失 → 最优回归
演进特点:
- 回归损失:从MSE到CIoU,考虑更多几何因素
- 分类损失:从softmax到多标签分类
- 置信度损失:从简单MSE到BCE,更符合任务特点
6.3 核心思想总结
(1)设计理念
- 端到端学习:从输入图像直接预测目标位置和类别
- 实时性优先:在保证精度的前提下追求速度
- 全局信息利用:一次性处理整张图像
- 多尺度检测:适应不同大小的目标
(2)技术特点
- 网格划分:将图像划分为网格,每个网格负责预测
- 锚框机制:使用预定义的边界框模板
- 特征融合:融合不同尺度的特征信息
- 损失函数优化:精心设计的损失函数组合
(3)技术优势
相比传统方法的优势:
- 速度优势:一次前向传播完成所有预测
- 精度优势:全局信息利用,减少背景误检
- 效率优势:端到端训练,无需复杂的后处理
- 实用性优势:适合实时应用场景
技术突破点:
- 端到端设计:将目标检测转化为回归问题
- 多尺度融合:同时检测不同大小的目标
- 实时性保证:在精度和速度间找到平衡
- 工业应用:为实际应用提供可靠解决方案
(4)模型选择指南
- 实时应用:YOLOv4(自动驾驶、视频监控)
- 高精度需求:YOLOv3(医疗影像、精密检测)
- 平衡需求:YOLOv2(一般应用场景)
- 资源受限:YOLOv1(嵌入式设备)