文章目录
-
- 一、YOLO算法简介
-
- [1.1 YOLO的基本原理](#1.1 YOLO的基本原理)
- [1.2 目标检测方法的分类](#1.2 目标检测方法的分类)
- [1.3 性能评估指标](#1.3 性能评估指标)
- 二、评估指标详解:精确率、召回率与mAP
-
- [2.1 精确率和召回率](#2.1 精确率和召回率)
- [2.2 mAP指标详解](#2.2 mAP指标详解)
- [三、YOLO V1:开山之作](#三、YOLO V1:开山之作)
-
- [3.1 网络架构](#3.1 网络架构)
- [3.2 输出解析](#3.2 输出解析)
- [3.3 损失函数](#3.3 损失函数)
- [3.4 V1的优缺点](#3.4 V1的优缺点)
- [四、YOLO V2:全面改进](#四、YOLO V2:全面改进)
-
- [4.1 主要改进点](#4.1 主要改进点)
-
- [4.1.1 BatchNorm](#4.1.1 BatchNorm)
- [4.1.2 高分辨率分类器](#4.1.2 高分辨率分类器)
- [4.1.3 锚框(Anchor Boxes)](#4.1.3 锚框(Anchor Boxes))
- [4.1.4 直接位置预测(Directed Location Prediction)](#4.1.4 直接位置预测(Directed Location Prediction))
- [4.1.5 多尺度训练](#4.1.5 多尺度训练)
- [五、YOLO V3:集大成者](#五、YOLO V3:集大成者)
-
- [5.1 网络架构改进](#5.1 网络架构改进)
- [5.2 多尺度检测](#5.2 多尺度检测)
- [5.3 先验框聚类](#5.3 先验框聚类)
- [5.4 分类器改进](#5.4 分类器改进)
- [六、YOLO V4:技术融合](#六、YOLO V4:技术融合)
-
- [6.1 Bag of Freebies(免费技巧)](#6.1 Bag of Freebies(免费技巧))
-
- [6.1.1 马赛克数据增强](#6.1.1 马赛克数据增强)
- [6.1.2 DropBlock正则化](#6.1.2 DropBlock正则化)
- [6.1.3 标签平滑](#6.1.3 标签平滑)
- [6.2 损失函数改进](#6.2 损失函数改进)
- [6.3 非极大值抑制改进](#6.3 非极大值抑制改进)
- [6.4 网络结构改进](#6.4 网络结构改进)
-
- [6.4.1 SPP-Net(空间金字塔池化)](#6.4.1 SPP-Net(空间金字塔池化))
- [6.4.2 CSP-Net(跨阶段部分网络)](#6.4.2 CSP-Net(跨阶段部分网络))
- [6.4.3 注意力机制](#6.4.3 注意力机制)
- [6.4.4 PAN(路径聚合网络)](#6.4.4 PAN(路径聚合网络))
- [七、YOLO V5:工程化实现](#七、YOLO V5:工程化实现)
-
- [7.1 主要特点](#7.1 主要特点)
- [7.2 实际应用流程](#7.2 实际应用流程)
-
- [7.2.1 数据标注](#7.2.1 数据标注)
- [7.2.2 数据准备](#7.2.2 数据准备)
一、YOLO算法简介
YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,由Joseph Redmon等人于2016年首次提出。它的核心思想是将目标检测问题转化为一个回归问题,通过一个神经网络直接预测目标的类别和位置。
1.1 YOLO的基本原理
YOLO算法将输入图像分成S×S个网格(grid cell),每个网格负责预测该网格内是否存在目标以及目标的类别和位置信息。如果一个物体的中心落在一个网格中,那么这个网格就负责预测这个物体。
1.2 目标检测方法的分类
目标检测方法主要分为两大类:
| 类型 | 代表算法 | 特点 |
|---|---|---|
| one-stage | YOLO系列 | 识别速度快,适合实时检测,但正确率相对较低 |
| two-stage | Faster-RCNN、Mask-RCNN系列 | 正确率高,识别效果理想,但速度较慢(通常5FPS左右) |
1.3 性能评估指标
在了解YOLO系列之前,我们需要先掌握几个重要的性能指标:
- FLOPs:模型进行一次前向传播(处理一张图像)所需要的浮点运算次数,衡量算法效率的关键指标
- FPS:每秒可以处理的图像数量,反映模型的推断速度
- mAP(Mean Average Precision):平均精度均值,是目标检测中最重要的评估指标
二、评估指标详解:精确率、召回率与mAP
2.1 精确率和召回率
在目标检测任务中,我们不能简单地使用精确率和召回率,需要设定阈值来判断检测是否正确。
计算公式:
- 精确率(Precision)= TP / (TP + FP) ------ 预测的结果中有多少是正确的
- 召回率(Recall)= TP / (TP + FN) ------ 真实的结果中有多少被预测正确
其中:
- TP:正确检测到的目标
- FP:错误检测到的目标(误检)
- FN:未被检测到的目标(漏检)
2.2 mAP指标详解
根据不同的置信度阈值,我们可以绘制出召回率和精确率的曲线,曲线以下的面积就是AP值。mAP则是所有类别AP的平均值。
mAP50:当IoU阈值为0.5时模型的平均精度。只考虑预测框与真实框的重叠部分达到50%及以上的情况。
mAP50-95:衡量模型在IoU阈值从0.5到0.95范围内(步长0.05)的平均精度。这是一个更严格的评估指标,能更全面地评估模型性能。
三、YOLO V1:开山之作
3.1 网络架构
YOLO V1的网络结构借鉴了GoogLeNet,包含24个卷积层和2个全连接层。它用1×1 reduction layers紧跟3×3 convolutional layers取代了GoogLeNet的inception modules。
3.2 输出解析
最终输出为7×7×30的张量:
- 7×7:表示将图像划分为7×7个网格
- 30:每个网格包含的信息维度
- 2个预测框,每个框包含5个信息(x, y, w, h, c)
- 20个类别概率(针对VOC数据集)
其中:
- x, y:相对于网格单元格边界的框中心坐标,归一化到0-1之间
- w, h:用图像的width和height归一化到0-1之间
- c:置信度(confidence)= 类概率 × IoU
3.3 损失函数
YOLO V1的损失函数包含三部分:位置误差、confidence误差和分类误差。
损失函数的设计考虑了不同部分的权重平衡:
- 对位置误差中的宽高(w, h)使用开根号处理,使小框的误差对小偏差更敏感
- 对不含目标的框的confidence损失赋予较小的权重
3.4 V1的优缺点
优点:速度快,结构简单
缺点:
- 每个cell只能预测一个类别,无法处理重叠物体
- 小物体检测效果一般
- 长宽比可选但单一
四、YOLO V2:全面改进
4.1 主要改进点
4.1.1 BatchNorm
引入批量归一化,加速收敛,提高模型稳定性。
4.1.2 高分辨率分类器
使用更高分辨率的图像进行训练,提升检测精度。
4.1.3 锚框(Anchor Boxes)
通过K-means聚类方法,在训练前从数据集中聚类出5个先验框(V2中为5个),代替人工设计的锚框。
4.1.4 直接位置预测(Directed Location Prediction)
预测相对于网格的偏移量,限制偏移范围,防止训练发散。
预测的偏移量为tx、ty、tw、th,调整后的预测值bx、by、bw、bh通过计算得到。
4.1.5 多尺度训练
由于网络不含全连接层,输入图片大小可以任意,只需能被32整除。训练时在320×320到608×608之间随机选择图像尺寸,增强模型的尺度适应性。
五、YOLO V3:集大成者
5.1 网络架构改进
V3采用了更深的网络结构,结合了残差网络的思想,使用多个卷积块和残差块构建特征提取网络。
5.2 多尺度检测
YOLO V3最重要的改进是引入了多尺度检测,在三个不同尺度的特征图上进行预测:
| 特征图尺寸 | 感受野 | 先验框尺寸 | 检测目标 |
|---|---|---|---|
| 13×13 | 最大 | (116×90), (156×198), (373×326) | 大物体 |
| 26×26 | 中等 | (30×61), (62×45), (59×119) | 中等物体 |
| 52×52 | 最小 | (10×13), (16×30), (33×23) | 小物体 |
5.3 先验框聚类
YOLO V3延续了K-means聚类方法,在COCO数据集上聚类出9种尺寸的先验框:
(10×13), (16×30), (33×23), (30×61), (62×45), (59×119), (116×90), (156×198), (373×326)
5.4 分类器改进
YOLOv3用多个独立的Logistic分类器替代了Softmax分类器。
Softmax要求每个样本只属于一个类别,而在复杂场景中,一个物体可能同时属于多个类别(如"人"和"行人")。Logistic分类器为每个类别独立计算概率,使用Sigmoid函数将输出映射到(0,1)区间:
S i g m o i d ( z ) = 1 1 + e − z Sigmoid(z) = \frac{1}{1 + e^{-z}} Sigmoid(z)=1+e−z1
设定阈值(如0.5),概率大于阈值的类别都会被标记,支持多标签分类。
六、YOLO V4:技术融合
YOLO V4更换了作者,但整体思想延续,并吸收了当时主流的先进技术。
6.1 Bag of Freebies(免费技巧)
这些方法不增加模型复杂度和推理计算量,通过改进模型和数据预处理来提高准确度:
6.1.1 马赛克数据增强
将4张训练图像组合成一张,增加数据的多样性,提高模型对不同场景的适应能力。
6.1.2 DropBlock正则化
不同于传统Dropout随机屏蔽单个特征,DropBlock随机屏蔽连续区域的特征图,更有效地减少冗余连接,提高模型泛化能力。
6.1.3 标签平滑
防止模型过于自信,提高泛化能力。
6.2 损失函数改进
V4引入了多种IoU损失的变体:
- GIOU(Generalized IoU):解决当预测框和真实框不重叠时IoU为0的问题
- DIOU(Distance IoU):考虑两框中心点之间的距离
- CIOU(Complete IoU):同时考虑重叠面积、中心点距离和长宽比
6.3 非极大值抑制改进
DIOU-NMS不仅考虑IoU的值,还考虑两个框中心点之间的距离:
s i = s i ⋅ e − R D I o U ( M , B i ) 2 δ , if IoU ( M , B i ) ≥ ϵ s_i = s_i \cdot e^{-\frac{R_{DIoU}(M, B_i)^2}{\delta}}, \quad \text{if IoU}(M, B_i) \geq \epsilon si=si⋅e−δRDIoU(M,Bi)2,if IoU(M,Bi)≥ϵ
其中M是置信度最高的候选框,Bi是其他候选框,RDIoU是两个框中心点之间的距离。这种方法解决了传统NMS在物体重叠时可能误删正确检测框的问题。
6.4 网络结构改进
6.4.1 SPP-Net(空间金字塔池化)
SPP-Net在最后一个卷积层后接入金字塔池化层,使网络可以接受任意尺寸的输入图像,输出固定长度的特征向量。
6.4.2 CSP-Net(跨阶段部分网络)
将每个block按通道维度拆分为两部分,一部分执行残差网络,另一部分直接拼接输出。这种方法:
- 增强CNN的学习能力
- 降低内存成本
- 减少计算瓶颈
6.4.3 注意力机制
CBAM(Convolutional Block Attention Module)结合通道注意力和空间注意力,可以嵌入任何CNN网络,在少量增加计算量的情况下提升模型性能。
6.4.4 PAN(路径聚合网络)
对FPN(特征金字塔网络)进行改进,通过自顶向下和自底向上的路径增强特征信息传递。
七、YOLO V5:工程化实现
YOLO V5更偏向工程实践,代码结构清晰,易于使用和二次开发。
7.1 主要特点
- 代码易用性:提供了完整的训练、测试和部署脚本
- 模型压缩:支持模型剪枝和量化
- 丰富的预训练模型:提供不同大小的模型版本(s/m/l/x)
- 自动锚框计算:自动根据数据集计算合适的锚框尺寸
7.2 实际应用流程
7.2.1 数据标注
使用Labelme等工具进行数据标注:
bash
pip install labelme pyqt5 pillow
labelme
标注工具推荐:
- LabelImg:支持2D矩形框标注
- Labelme:支持多边形分割、语义分割、2D框等
- CVAT:支持视频标注和多种格式导出
7.2.2 数据准备
- 将标注好的JSON文件转换为YOLO格式的txt文件
- 在classes.names中定义类别名称
- 准备train.txt和val.txt,包含训练和验证图片的路径