One-Stage算法和Two-Stage算法
在目标检测领域,检测算法通常可以分为One-Stage算法和Two-Stage算法两大类。这两类算法在检测目标的流程和方法上有所不同,各有优缺点。
One-Stage算法
One-Stage算法将目标检测问题视为一个端到端的回归问题,直接从输入图像预测目标的类别和边界框。这类算法通常具有较快的检测速度,适用于实时应用。典型的One-Stage算法包括YOLO(You Only Look Once)系列和SSD(Single Shot MultiBox Detector)。
优点
-
检测速度快:由于One-Stage算法在单次前向传播中完成目标检测,处理速度较快,适用于实时应用场景。
-
模型简单:One-Stage算法通常结构较为简单,训练和推理过程较为高效。
缺点
-
精度较低:One-Stage算法在小目标和密集目标检测方面的精度较低,容易出现漏检和误检。
-
定位不准确:由于直接回归边界框,One-Stage算法的边界框定位精度不如Two-Stage算法。
Two-Stage算法
Two-Stage算法将目标检测分为两个阶段:第一阶段生成候选区域,第二阶段对候选区域进行精细分类和回归。典型的Two-Stage算法包括R-CNN(Regions with Convolutional Neural Networks)、Fast R-CNN和Faster R-CNN。
优点
-
检测精度高:Two-Stage算法通过候选区域生成和精细分类,能够获得较高的检测精度,特别是对小目标和密集目标的检测效果较好。
-
定位准确:Two-Stage算法通过第二阶段的精细回归,能够获得更加准确的边界框定位。
缺点
-
检测速度慢:由于需要进行两次前向传播,Two-Stage算法的检测速度较慢,不适用于实时应用场景。
-
模型复杂:Two-Stage算法结构较为复杂,训练和推理过程较为耗时。
典型算法对比
特性 | One-Stage算法 | Two-Stage算法 |
---|---|---|
代表算法 | YOLO, SSD | R-CNN, Fast R-CNN, Faster R-CNN |
检测速度 | 快 | 慢 |
检测精度 | 较低 | 高 |
适用场景 | 实时应用 | 高精度需求 |
模型复杂度 | 简单 | 复杂 |
检测任务中常用的几个指标
在目标检测任务中,评估模型性能的指标有很多。常用的指标包括IOU(Intersection over Union)、Precision(精度)、Recall(召回率)、AP(Average Precision)和MAP(mean Average Precision)。这些指标帮助我们了解模型在目标检测任务中的表现。
1. IOU(Intersection over Union)
IOU是评估预测边界框与真实边界框重叠程度的指标。计算公式如下:
$$
\text{IOU} = \frac{\text{预测边界框与真实边界框的交集面积}}{\text{预测边界框与真实边界框的并集面积}}
$$
IOU在0到1之间取值,值越大表示预测边界框与真实边界框的重叠程度越高。
2. Precision(精度)
Precision表示在所有被预测为正类的样本中,真正类样本的比例。计算公式如下:
$$
\text{Precision} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Positives}}
$$
3. Recall(召回率)
Recall表示在所有真实正类样本中,被正确预测为正类样本的比例。计算公式如下:
$$
\text{Recall} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}}
$$
4. AP(Average Precision)
AP是Precision-Recall曲线下的面积,用于评估单个类别的检测性能。计算AP的步骤如下:
-
绘制Precision-Recall曲线:横轴为Recall,纵轴为Precision。
-
计算不同Recall值下的Precision:从0到1,以固定步长(如0.1)取若干个Recall值,计算每个Recall值对应的Precision。
-
计算平均Precision:对不同Recall值下的Precision求平均,得到AP值。
更正式的计算AP的方法如下:
-
排序:按照预测的置信度对检测结果进行排序。置信度表示模型对预测结果的可信程度,通常在0到1之间取值,值越高表示模型越确信该预测结果。
-
计算Precision和Recall:依次计算每个检测结果的Precision和Recall。
-
插值:将Precision-Recall曲线平滑化,计算每个Recall值的最大Precision。
-
求和:计算所有Recall值对应的最大Precision的平均值,得到AP。
示例
假设有以下检测结果:
置信度 | 是否为真正类(TP) | Precision | Recall |
---|---|---|---|
0.9 | 是 | 1.0 | 0.1 |
0.8 | 是 | 1.0 | 0.2 |
0.7 | 否 | 0.67 | 0.2 |
0.6 | 是 | 0.75 | 0.3 |
0.5 | 否 | 0.6 | 0.3 |
0.4 | 是 | 0.67 | 0.4 |
0.3 | 是 | 0.71 | 0.5 |
0.2 | 是 | 0.75 | 0.6 |
0.1 | 否 | 0.67 | 0.6 |
通过插值计算每个Recall值的最大Precision,得到的Precision-Recall曲线如下:
Recall | 最大Precision |
---|---|
0.1 | 1.0 |
0.2 | 1.0 |
0.3 | 0.75 |
0.4 | 0.67 |
0.5 | 0.71 |
0.6 | 0.75 |
AP为这些最大Precision值的平均:
$$
\text{AP} = \frac{1.0 + 1.0 + 0.75 + 0.67 + 0.71 + 0.75}{6} = 0.81
$$
5. mAP(mean Average Precision)
mAP是所有类别的AP值的平均,用于评估多类别检测任务的整体性能。计算公式如下:
$$
\text{mAP} = \frac{1}{N} \sum_{i=1}^{N} AP_i
$$
示例
假设有以下检测结果:
类别 | 真实正类数 | 预测正类数 | 真正类数(True Positives) | 假正类数(False Positives) | 假负类数(False Negatives) |
---|---|---|---|---|---|
类别A | 100 | 120 | 90 | 30 | 10 |
类别B | 150 | 140 | 120 | 20 | 30 |
对于类别A:
-
Precision = 90 / (90 + 30) = 0.75
-
Recall = 90 / (90 + 10) = 0.90
对于类别B:
-
Precision = 120 / (120 + 20) = 0.857
-
Recall = 120 / (120 + 30) = 0.80
假设类别A的AP为0.80,类别B的AP为0.85,则mAP为:
$$
\text{mAP} = \frac{0.80 + 0.85}{2} = 0.825
$$
总结
这些指标帮助我们全面评估目标检测模型的性能。IOU用于评估边界框的重叠程度,Precision和Recall用于评估模型的分类性能,AP和mAP用于评估模型在多类别检测任务中的整体表现。通过这些指标,我们可以更好地理解和改进目标检测模型。
YOLO-V1
核心思想
YOLOv1的核心思想可以概括为以下几个方面:
单次回归
将目标检测问题视为一个单次回归问题,通过一个卷积神经网络直接从输入图像预测目标的类别和边界框位置。
全局推理
YOLOv1在整个图像上进行推理,使用全局信息进行目标检测。通过查看整个图像,YOLOv1能够捕捉到目标之间的上下文信息,减少误检率。
网格划分
YOLOv1算法将输入图像划分为一个SxS的网格。每个网格单元负责检测该网格单元中的目标。具体过程如下:
-
图像划分:将输入图像划分为SxS的网格(例如,如果S=7,则图像被划分为7x7的网格)。
-
网格单元职责:每个网格单元负责检测其中心落在该网格单元中的目标,即使目标跨越多个网格单元。
例如,对于一个224x224像素的图像,若S=7,则每个网格单元的大小为32x32像素。
边界框预测
每个网格单元预测B个边界框和每个边界框的置信度,同时为每个类别预测C个条件类别概率。具体步骤如下:
-
边界框参数:每个边界框由5个参数表示:
-
中心坐标(x, y):相对于网格单元的位置,取值范围为0到1。
-
宽度和高度(w, h):相对于整个图像的宽度和高度,取值范围为0到1。
-
置信度(confidence):表示边界框包含目标的置信度以及边界框预测的准确度,计算公式为:
$$
\text{confidence} = \text{Pr(object)} \times \text{IOU}^{truth}_{pred}
$$
其中
$$
\text{Pr(object)}表示网格单元中是否存在目标的概率。
$$如果网格单元中存在目标,则为1,否则为0。
如果网格单元中存在目标且预测边界框与真实边界框高度重叠,则置信度较高;反之,则置信度较低。
-
-
类别概率:每个网格单元还预测C个条件类别概率,即目标属于每个类别的概率,前提是该网格单元中确实存在目标。
-
最终预测:每个网格单元的最终预测结果包括B个边界框及其置信度和C个类别概率。
示例
假设有一个7x7的网格(S=7),每个网格单元预测2个边界框(B=2),并且模型要检测20个类别(C=20)。则每个网格单元的输出为:
$$
B \times 5 + C = 2 \times 5 + 20 = 30
$$
整个图像的输出为:
$$
S \times S \times (B \times 5 + C) = 7 \times 7 \times 30 = 1470
$$
网络结构
以下是YOLOv1网络结构中每一层的输入和输出示例,假设输入图像大小为448x448x3。
1. 卷积层和池化层
-
第1层:卷积层
-
输入:448x448x3
-
卷积核:7x7,步长:2,输出通道数:64
-
输出:224x224x64
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:112x112x64
-
-
第2层:卷积层
-
输入:112x112x64
-
卷积核:3x3,步长:1,输出通道数:192
-
输出:112x112x192
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:56x56x192
-
-
第3层:卷积层
-
输入:56x56x192
-
卷积核:1x1,步长:1,输出通道数:128
-
输出:56x56x128
-
-
第4层:卷积层
-
输入:56x56x128
-
卷积核:3x3,步长:1,输出通道数:256
-
输出:56x56x256
-
-
第5层:卷积层
-
输入:56x56x256
-
卷积核:1x1,步长:1,输出通道数:256
-
输出:56x56x256
-
-
第6层:卷积层
-
输入:56x56x256
-
卷积核:3x3,步长:1,输出通道数:512
-
输出:56x56x512
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:28x28x512
-
-
第7-12层:卷积层
-
输入:28x28x512
-
卷积核:1x1和3x3,步长:1,输出通道数分别为256和512
-
输出:28x28x512(重复六次)
-
-
第13层:卷积层
-
输入:28x28x512
-
卷积核:3x3,步长:1,输出通道数:1024
-
输出:28x28x1024
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:14x14x1024
-
-
第14-18层:卷积层
-
输入:14x14x1024
-
卷积核:1x1和3x3,步长:1,输出通道数分别为512和1024
-
输出:14x14x1024(重复五次)
-
-
第19层:卷积层
-
输入:14x14x1024
-
卷积核:3x3,步长:1,输出通道数:1024
-
输出:14x14x1024
-
-
第20层:卷积层
-
输入:14x14x1024
-
卷积核:1x1,步长:1,输出通道数:1024
-
输出:14x14x1024
-
2. 全连接层
-
第21层:全连接层
-
输入:14x14x1024(展平为向量)
-
输出神经元数:4096
-
使用Dropout层(丢弃率为0.5)
-
-
第22层:全连接层
-
输入:4096
-
输出神经元数:SxSx(Bx5+C),假设S=7,B=2,C=20
-
输出:7x7x(2x5+20)=1470
-
假设S=7,B=2,C=20,则第21层的输出神经元数为7x7x(2x5+20)=1470。
参数设置
-
网格大小(S):将输入图像划分为SxS的网格,常用的值为7。
-
边界框数(B):每个网格预测B个边界框,常用的值为2。
-
类别数(C):检测的目标类别数,常用的值为20(如PASCAL VOC数据集)。
损失函数
其损失函数设计用于同时优化分类和定位的准确性。YOLOv1的损失函数由四个主要部分组成:定位损失、分类损失、包含目标的置信度损失和不包含目标的置信度损失。
YOLOv1的损失函数可以表示为以下公式:
$$
\text{Loss} = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (\hat{C}_i - C_i)^2 + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (\hat{C}_i - C_i)^2 + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (\hat{p}_i(c) - p_i(c))^2
$$
其中:
-
( S ) 是网格的大小(例如,7x7网格,S=7)。
-
( B ) 是每个网格预测的边界框数量(例如,B=2)。
-
$$
\mathbb{1}_{ij}^{\text{obj}}是一个指示函数
$$当第 (i) 个网格单元的第 (j) 个边界框包含目标时为1,否则为0。
-
$$
\mathbb{1}_{ij}^{\text{noobj}}是一个指示函数
$$当第 (i) 个网格单元的第 (j) 个边界框不包含目标时为1,否则为0。
-
$$
\lambda_{\text{coord}}是用于权衡坐标损失的权重参数,通常设置为5。
$$ -
$$
\lambda_{\text{noobj}} 是用于权衡没有目标的置信度损失的权重参数,通常设置为0.5。
$$
1. 定位损失(Localization Loss)
定位损失用于度量预测的边界框位置和大小与真实值之间的差异。具体包括边界框的中心坐标 ((x, y)) 和宽高 ((w, h)) 的平方误差。为了更好地处理不同尺度的目标,YOLOv1使用宽度和高度的平方根进行计算:
$$
\lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] + \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right]
$$
2. 包含目标的置信度损失(Confidence Loss for Objects)
置信度损失用于度量预测的边界框置信度与真实置信度之间的差异。置信度反映了边界框包含目标的概率以及预测的准确性:
$$
\sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (\hat{C}_i - C_i)^2
$$
3. 不包含目标的置信度损失(Confidence Loss for No Objects)
为了减少假阳性的影响,YOLOv1对不包含目标的置信度损失使用了较低的权重:
$$
\lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (\hat{C}_i - C_i)^2
$$
4. 分类损失(Classification Loss)
分类损失用于度量预测的类别概率分布与真实类别分布之间的差异。分类损失仅在网格单元包含目标时计算:
$$
\sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (\hat{p}_i(c) - p_i(c))^2
$$
损失函数解释
-
定位损失:用于优化边界框的坐标和大小。通过增加 \lambda_{\text{coord}} 的权重,YOLOv1对定位损失给予了更高的关注,以提高预测边界框的准确性。
-
包含目标的置信度损失:用于优化预测边界框包含目标的置信度,使得预测的边界框更符合实际情况。
-
不包含目标的置信度损失:用于减少假阳性预测的影响。由于大多数网格单元是背景,设置较低的权重 \lambda_{\text{noobj}} 可以有效减少背景区域对损失的影响。
-
分类损失:用于优化预测类别的准确性。该损失仅在网格单元包含目标时计算,以确保模型能够准确分类目标。
非极大值抑制(NMS)
为了提高检测结果的精度,YOLOv1在后处理阶段引入了非极大值抑制(NMS)来过滤多余的边界框。
非极大值抑制(Non-Maximum Suppression, NMS)是一种后处理技术,用于删除预测结果中多余的边界框。NMS的目的是保留每个目标的最佳边界框,并去除重叠度较高的冗余框,从而提高检测的准确性。
基本步骤
-
过滤低置信度框:首先过滤掉置信度低于某个阈值的边界框,只保留置信度较高的预测框。
-
排序:将剩余的边界框按置信度从高到低排序。
-
选择最高置信度框:选择当前置信度最高的边界框作为参考框。
-
计算IOU:计算参考框与其他边界框之间的交并比(IOU)。
-
删除重叠框:删除所有与参考框的IOU大于某个阈值的边界框。
-
重复:重复步骤3-5,直到所有边界框都处理完毕。
在NMS中,如果两个边界框的IOU大于一个预设的阈值(通常为0.5),则认为它们是重叠的,保留置信度高的框,删除置信度低的框。
应用
在YOLOv1中,NMS主要用于以下两个方面:
-
减少重复检测:YOLOv1在预测阶段会生成多个边界框,这些边界框可能会高度重叠。通过NMS,可以有效减少重复检测,只保留最有可能的边界框。
-
提高检测精度:NMS通过删除置信度较低的冗余边界框,提高了最终检测结果的精度。
实现步骤
-
预测阶段:YOLOv1模型在预测阶段生成大量边界框和置信度分数。
-
过滤低置信度框:首先过滤掉置信度低于某个阈值的边界框。
-
按类别进行NMS:对每个类别分别进行NMS处理,保留每个类别中置信度最高且不重叠的边界框。
-
输出最终结果:将通过NMS筛选后的边界框作为最终检测结果输出。
示例
假设YOLOv1模型对一幅图像生成了以下边界框和置信度分数:
边界框 | 置信度 | 类别 | x | y | w | h |
---|---|---|---|---|---|---|
A | 0.9 | 狗 | 50 | 50 | 100 | 100 |
B | 0.8 | 狗 | 55 | 55 | 100 | 100 |
C | 0.7 | 狗 | 200 | 200 | 100 | 100 |
D | 0.6 | 猫 | 300 | 300 | 100 | 100 |
E | 0.4 | 猫 | 305 | 305 | 100 | 100 |
使用NMS进行后处理的步骤如下:
-
过滤低置信度框:假设置信度阈值为0.5,过滤掉置信度低于0.5的边界框E。
-
按类别进行NMS:
-
对“狗”类别进行NMS:保留置信度最高的边界框A,删除与A的IOU大于0.5的边界框B。保留边界框C。
-
对“猫”类别进行NMS:保留置信度最高的边界框D。
-
最终结果:
边界框 | 置信度 | 类别 | x | y | w | h |
---|---|---|---|---|---|---|
A | 0.9 | 狗 | 50 | 50 | 100 | 100 |
C | 0.7 | 狗 | 200 | 200 | 100 | 100 |
D | 0.6 | 猫 | 300 | 300 | 100 | 100 |
优缺点
优点
-
检测速度快:YOLOv1在单次前向传播中完成目标检测,因此检测速度非常快,适用于实时应用。
-
全局推理:YOLOv1在整个图像上进行推理,能够学习到全局上下文信息,减少了误检率。
-
端到端训练:YOLOv1可以端到端训练,简化了训练过程,提高了检测效率。
缺点
-
定位精度较低:由于YOLOv1将目标检测问题转换为回归问题,因此在处理小目标和密集目标时,定位精度较低。
-
框数量有限:每个网格只能预测固定数量的边界框,可能会漏检一些目标。
YOLO-V2
批归一化
YOLOv2(You Only Look Once Version 2)在YOLOv1的基础上进行了多项改进,其中之一是引入了批归一化(Batch Normalization)。批归一化通过标准化每个小批量的数据,使得模型训练更加稳定,收敛速度更快,并且可以减少对权重初始化的依赖。
批归一化(Batch Normalization, BN)是一种用于加速深度神经网络训练的技术。BN通过在每个小批量(mini-batch)上执行标准化操作,使得每一层的输入保持相对稳定的分布。具体来说,BN对每一层的激活值进行归一化,使其均值为零,方差为一,然后再应用缩放和平移操作。
公式
假设有一个小批量数据 \{x_1, x_2, \ldots, x_m\},BN的计算步骤如下:
-
计算小批量均值: \ \mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i
-
计算小批量方差: \ \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2
-
标准化: \ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} 其中 \epsilon 是一个小常数,用于避免除零。
-
缩放和平移: \ y_i = \gamma \hat{x}_i + \beta 其中 \gamma 和 \beta 是可学习的参数,用于恢复网络的表达能力。
优点
-
加速收敛:批归一化通过标准化每个小批量的数据,使得每一层的输入分布更加稳定,从而加速了模型的收敛。
-
减少对权重初始化的依赖:由于每一层的输入被标准化,网络对权重初始化的依赖减少,模型更容易训练。
-
提高泛化能力:批归一化具有一定的正则化效果,可以减少过拟合,提高模型的泛化能力。
-
允许使用较大的学习率:批归一化使得模型训练更加稳定,允许使用较大的学习率,从而进一步加速训练过程。
在YOLOv2中,批归一化被应用到每一个卷积层之后,并且去掉了dropout层。通过在每个卷积层后添加批归一化层,YOLOv2模型的训练过程变得更加稳定,收敛速度更快,同时提高了检测精度。
更高分辨率的输入
YOLOv1使用448x448的输入图像,而YOLOv2将输入图像的分辨率提高到608x608,使得网络可以捕捉到更多细节信息,从而提高了检测精度。
网络结构改进
YOLOv2通过引入Darknet-19特征提取网络、批归一化、高低维特征融合(Passthrough Layer)等改进,使得网络结构更加高效和准确。在保持实时检测速度的同时,显著提高了检测精度。以下是YOLOv2各层网络的输入和输出示例,假设输入图像大小为608x608x3。
1. 卷积层和池化层
-
第1层:卷积层
-
输入:608x608x3
-
卷积核:3x3,步长:1,输出通道数:32
-
输出:608x608x32
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:304x304x32
-
-
第2层:卷积层
-
输入:304x304x32
-
卷积核:3x3,步长:1,输出通道数:64
-
输出:304x304x64
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:152x152x64
-
-
第3层:卷积层
-
输入:152x152x64
-
卷积核:3x3,步长:1,输出通道数:128
-
输出:152x152x128
-
-
第4层:卷积层
-
输入:152x152x128
-
卷积核:1x1,步长:1,输出通道数:64
-
输出:152x152x64
-
-
第5层:卷积层
-
输入:152x152x64
-
卷积核:3x3,步长:1,输出通道数:128
-
输出:152x152x128
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:76x76x128
-
-
第6层:卷积层
-
输入:76x76x128
-
卷积核:3x3,步长:1,输出通道数:256
-
输出:76x76x256
-
-
第7层:卷积层
-
输入:76x76x256
-
卷积核:1x1,步长:1,输出通道数:128
-
输出:76x76x128
-
-
第8层:卷积层
-
输入:76x76x128
-
卷积核:3x3,步长:1,输出通道数:256
-
输出:76x76x256
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:38x38x256
-
-
第9层:卷积层
-
输入:38x38x256
-
卷积核:3x3,步长:1,输出通道数:512
-
输出:38x38x512
-
-
第10层:卷积层
-
输入:38x38x512
-
卷积核:1x1,步长:1,输出通道数:256
-
输出:38x38x256
-
-
第11层:卷积层
-
输入:38x38x256
-
卷积核:3x3,步长:1,输出通道数:512
-
输出:38x38x512
-
-
第12层:卷积层
-
输入:38x38x512
-
卷积核:1x1,步长:1,输出通道数:256
-
输出:38x38x256
-
-
第13层:卷积层
-
输入:38x38x256
-
卷积核:3x3,步长:1,输出通道数:512
-
输出:38x38x512
-
后接最大池化层(2x2池化窗口,步长:2)
-
池化输出:19x19x512
-
-
第14层:卷积层
-
输入:19x19x512
-
卷积核:3x3,步长:1,输出通道数:1024
-
输出:19x19x1024
-
-
第15层:卷积层
-
输入:19x19x1024
-
卷积核:1x1,步长:1,输出通道数:512
-
输出:19x19x512
-
-
第16层:卷积层
-
输入:19x19x512
-
卷积核:3x3,步长:1,输出通道数:1024
-
输出:19x19x1024
-
-
第17层:卷积层
-
输入:19x19x1024
-
卷积核:1x1,步长:1,输出通道数:512
-
输出:19x19x512
-
-
第18层:卷积层
-
输入:19x19x512
-
卷积核:3x3,步长:1,输出通道数:1024
-
输出:19x19x1024
-
-
第19层:卷积层
-
输入:19x19x1024
-
卷积核:3x3,步长:1,输出通道数:1024
-
输出:19x19x1024
-
-
第20层:卷积层
-
输入:19x19x1024
-
卷积核:1x1,步长:1,输出通道数:1024
-
输出:19x19x1024
-
2. Passthrough Layer
-
卷积层:3x3卷积核,输出通道数为64
-
输入:38x38x512
-
输出:38x38x64
-
-
Passthrough Layer:将38x38x64的特征图重组为19x19x256,并与上一步的输出拼接
-
输入:38x38x64
-
输出:19x19x256
-
拼接后输出:19x19x1280
-
3. 最终检测层
-
卷积层:3x3卷积核,输出通道数为1024
-
输入:19x19x1280
-
输出:19x19x1024
-
-
卷积层:1x1卷积核,输出通道数为425(假设使用5个anchors,每个anchor预测5个坐标信息和20个类别概率,即5*(5+20)=125)
-
输入:19x19x1024
-
输出:19x19x125
-
4. 输出层
将19x19x125的特征图展平并转换为边界框、置信度和类别概率的预测结果。
K-means聚类提取先验框
在YOLOv2中,使用K-means聚类算法从训练数据中提取先验框,可以使得预测的边界框更加贴近真实边界框,提高模型的定位精度和召回率。通过这种方法,YOLOv2能够更好地适应不同尺度和形状的目标,从而显著提升检测性能。
先验框(Anchor Boxes)
先验框是预定义的一组边界框,它们在网络的输出层用于预测目标的位置和大小。每个先验框都有一个固定的宽度和高度,模型学习如何调整这些先验框以更好地匹配实际的目标。
K-means聚类算法
K-means是一种无监督的聚类算法,旨在将数据分成K个簇,使得每个数据点都属于离它最近的簇的中心(质心)。
在YOLOv2中,K-means聚类算法被用来从训练数据中的真实边界框中提取先验框。具体步骤如下:
-
收集边界框数据:从训练数据中提取所有目标的边界框。每个边界框用宽度和高度表示。
-
定义距离度量:为了更好地适应不同尺度的目标,YOLOv2使用一种特殊的距离度量,即IOU(Intersection over Union)距离。IOU距离定义为:
$$
\text{IOU}(B, C) = 1 - \frac{\text{Area of Overlap}}{\text{Area of Union}}
$$其中,B和C是两个边界框。IOU距离越小,两个边界框越相似。
-
初始化K个质心:随机选择K个边界框作为初始质心。
-
聚类:使用IOU距离将每个边界框分配到最近的质心所属的簇。
-
重新计算质心:对于每个簇,计算新的质心(即簇中所有边界框的平均宽度和高度)。
-
重复聚类过程:重复步骤4和步骤5,直到质心不再变化或变化很小为止。
-
得到先验框:最终的质心即为提取的先验框。
定向位置预测
在YOLOv1中,模型直接预测边界框的中心坐标X和Y、宽度W和高度H。这种直接预测的方法存在一些问题:
-
定位误差大:由于预测的坐标和尺寸是无约束的,容易导致模型预测的边界框偏离真实位置。
-
训练困难:直接预测坐标和尺寸的回归问题较为复杂,训练过程中容易出现梯度消失或爆炸。
为了克服YOLOv1中的位置预测问题,YOLOv2引入了定向位置预测。该方法通过对预测的坐标和尺寸进行约束,减少了定位误差,提高了模型的训练效率和预测精度。
具体方法
YOLOv2中的定向位置预测通过对边界框的中心坐标和尺寸进行变换,使其落在一个合理的范围内。
1. 预测中心坐标
YOLOv2不再直接预测边界框的中心坐标X和Y,而是预测相对于网格单元左上角的偏移量t_x 和 t_y。然后通过一个Sigmoid函数将偏移量限制在0到1之间,使得预测的中心坐标更加稳定。
具体公式如下:
$$
b_x = \sigma(t_x) + c_x
$$
$$
b_y = \sigma(t_y) + c_y
$$
其中,\sigma 是Sigmoid函数,c_x 和 c_y 分别表示网格单元左上角的坐标,b_x 和 b_y 分别是预测的边界框中心坐标。
2. 预测宽度和高度
YOLOv2不再直接预测边界框的宽度W和高度H,而是预测宽高的对数偏移量t_w 和 t_h,相对于先验框(Anchor Boxes)的宽度和高度进行调整。这样可以更好地适应不同尺度的目标。
具体公式如下:
$$
b_w = p_w e^{t_w}
$$
$$
b_h = p_h e^{t_h}
$$
其中,p_w 和 p_h 分别是先验框的宽度和高度,t_w 和 t_h 是预测的对数偏移量,b_w 和 b_h 分别是预测的边界框宽度和高度。
优点
-
减少定位误差:通过对坐标和尺寸进行约束,定向位置预测减少了模型预测的边界框偏离真实位置的情况,提高了定位精度。
-
训练更稳定:相对于直接预测坐标和尺寸,定向位置预测的回归问题更加简单,训练过程中梯度更加稳定,收敛速度更快。
-
适应不同尺度:通过对数偏移量调整宽高,模型能够更好地适应不同尺度的目标,提高了检测效果。
高低维特征融合
高低维特征融合增强了模型的特征表达能力,使YOLOv2在保持实时检测速度的同时,显著提升了检测性能。
背景
在目标检测任务中,不同尺度的目标需要不同层次的特征来进行有效的检测。低层特征包含更细粒度的信息,有助于检测小目标;高层特征包含更多的语义信息,有助于检测大目标。为了更好地利用这些特征。
YOLOv2通过引入Passthrough Layer来实现高低维特征融合。Passthrough Layer的主要作用是将低分辨率的高层特征与高分辨率的低层特征进行连接,从而提高对小目标的检测精度。
实现
Passthrough Layer通过将低层特征图分块并拼接到高层特征图上,从而实现特征融合。例如,将26x26x512的特征图分块并拼接到13x13x2048的特征图上。
详细步骤
-
Passthrough Layer卷积操作:
-
输入特征图:26x26x512
-
通过1x1卷积核,将通道数从512降到64,得到特征图:26x26x64
-
-
特征图分块操作:
-
将26x26x64的特征图reshape为(n, 64, 13, 2, 13, 2),其中n为batch size
-
permute操作将维度调整为(n, 64, 2, 2, 13, 13)
-
contiguous操作确保内存连续
-
将调整后的特征图reshape为(n, 64 * 4, 13, 13),即(n, 256, 13, 13)
-
-
特征图拼接操作:
-
将13x13x256的低层特征图与13x13x512的高层特征图在通道维度上拼接,得到13x13x768的融合特征图
-
最后通过卷积层进一步处理融合特征图
-
多尺度训练
在目标检测任务中,目标的尺度和形状各不相同,模型需要在不同尺度的输入图像上都能表现良好。传统的训练方法通常使用固定尺度的输入图像,这可能导致模型在处理不同尺度的目标时表现不佳。为了提高模型在不同尺度下的表现,YOLOv2引入了多尺度训练。
原理
多尺度训练的核心思想是:在训练过程中动态调整输入图像的分辨率,使得模型能够在不同分辨率下都能有效地进行目标检测。具体来说,YOLOv2通过每隔一定的训练步数(batches)随机选择一种分辨率进行训练。
具体实现
在YOLOv2中,多尺度训练步骤如下:
-
预定义多种分辨率:在训练开始前,预定义多种输入图像的分辨率。例如,YOLOv2使用的分辨率范围为320x320到608x608,间隔为32像素,即320、352、384、416、448、480、512、544、576、608。
-
动态调整分辨率:每隔10个训练步骤(batches),随机选择一种预定义的分辨率,并将输入图像调整为该分辨率。
-
训练过程:在每个训练步骤中,使用当前选择的分辨率对模型进行训练。
YOLOV3
网络结构
YOLOv3采用了一种新的网络结构,称为Darknet-53。Darknet-53是一个更深、更复杂的卷积神经网络,具有更强的特征提取能力。
特点
-
深度更深:Darknet-53包含53个卷积层,相比于YOLOv2的Darknet-19,网络深度更深。
-
残差连接:引入了残差连接(Residual Connections),使得网络更容易训练,缓解了深层网络训练中的梯度消失问题。
-
卷积层设计:采用3x3和1x1的卷积核交替使用,保持了计算效率。
具体结构
层级 | 输入大小 | 卷积核/步长 | 类型 | 输出大小 |
---|---|---|---|---|
1 | 416 x 416 x 3 | 3 x 3 / 1 | 卷积层 | 416 x 416 x 32 |
2 | 416 x 416 x 32 | 3 x 3 / 2 | 卷积层 | 208 x 208 x 64 |
3 | 208 x 208 x 64 | 残差块 | 208 x 208 x 64 | |
4 | 208 x 208 x 64 | 3 x 3 / 2 | 卷积层 | 104 x 104 x 128 |
5-8 | 104 x 104 x 128 | 残差块 | 104 x 104 x 128 | |
9 | 104 x 104 x 128 | 3 x 3 / 2 | 卷积层 | 52 x 52 x 256 |
10-26 | 52 x 52 x 256 | 残差块 | 52 x 52 x 256 | |
27 | 52 x 52 x 256 | 3 x 3 / 2 | 卷积层 | 26 x 26 x 512 |
28-44 | 26 x 26 x 512 | 残差块 | 26 x 26 x 512 | |
45 | 26 x 26 x 512 | 3 x 3 / 2 | 卷积层 | 13 x 13 x 1024 |
46-52 | 13 x 13 x 1024 | 残差块 | 13 x 13 x 1024 |
多尺度预测
在目标检测任务中,目标的尺度和形状各不相同,模型需要在不同尺度的输入图像上都能表现良好。为了提高模型在不同尺度下的表现,YOLOv3在多个尺度上进行预测。
原理
YOLOv3在三个尺度上进行预测,分别是原始特征图、下采样2倍和下采样4倍的特征图。这些特征图分别用于检测不同大小的目标:
-
高层特征图:用于检测大目标。
-
中层特征图:用于检测中等大小的目标。
-
低层特征图:用于检测小目标。
网络结构
层级 | 输入大小 | 卷积核/步长 | 类型 | 输出大小 |
---|---|---|---|---|
53 | 13 x 13 x 1024 | 1 x 1 / 1 | 卷积层 | 13 x 13 x 512 |
54 | 13 x 13 x 512 | 3 x 3 / 1 | 卷积层 | 13 x 13 x 1024 |
55 | 13 x 13 x 1024 | 1 x 1 / 1 | 卷积层 | 13 x 13 x 512 |
56 | 13 x 13 x 512 | 3 x 3 / 1 | 卷积层 | 13 x 13 x 1024 |
57 | 13 x 13 x 1024 | 1 x 1 / 1 | 卷积层 | 13 x 13 x 512 |
58 | 13 x 13 x 512 | 3 x 3 / 1 | 卷积层 | 13 x 13 x 1024 |
59 | 13 x 13 x 1024 | 1 x 1 / 1 | 卷积层 | 13 x 13 x 255 |
60 | 13 x 13 x 512 | 2 x 2 / 1 | 上采样层 | 26 x 26 x 256 |
61 | 26 x 26 x 512, 26 x 26 x 256 | Concatenate | 26 x 26 x 768 | |
62 | 26 x 26 x 768 | 1 x 1 / 1 | 卷积层 | 26 x 26 x 256 |
63 | 26 x 26 x 256 | 3 x 3 / 1 | 卷积层 | 26 x 26 x 512 |
64 | 26 x 26 x 512 | 1 x 1 / 1 | 卷积层 | 26 x 26 x 256 |
65 | 26 x 26 x 256 | 3 x 3 / 1 | 卷积层 | 26 x 26 x 512 |
66 | 26 x 26 x 512 | 1 x 1 / 1 | 卷积层 | 26 x 26 x 256 |
67 | 26 x 26 x 256 | 3 x 3 / 1 | 卷积层 | 26 x 26 x 512 |
68 | 26 x 26 x 512 | 1 x 1 / 1 | 卷积层 | 26 x 26 x 255 |
69 | 26 x 26 x 256 | 2 x 2 / 1 | 上采样层 | 52 x 52 x 128 |
70 | 52 x 52 x 256, 52 x 52 x 128 | Concatenate | 52 x 52 x 384 | |
71 | 52 x 52 x 384 | 1 x 1 / 1 | 卷积层 | 52 x 52 x 128 |
72 | 52 x 52 x 128 | 3 x 3 / 1 | 卷积层 | 52 x 52 x 256 |
73 | 52 x 52 x 256 | 1 x 1 / 1 | 卷积层 | 52 x 52 x 128 |
74 | 52 x 52 x 128 | 3 x 3 / 1 | 卷积层 | 52 x 52 x 256 |
75 | 52 x 52 x 256 | 1 x 1 / 1 | 卷积层 | 52 x 52 x 128 |
76 | 52 x 52 x 128 | 3 x 3 / 1 | 卷积层 | 52 x 52 x 256 |
77 | 52 x 52 x 256 | 1 x 1 / 1 | 卷积层 | 52 x 52 x 255 |
分类器改进
YOLOv3通过引入Softmax激活函数,将类别预测的输出转换为概率分布,提高了模型的分类精度和数值稳定性。Softmax函数在多分类任务中表现良好,使得YOLOv3能够更准确地预测目标的类别。
Softmax
Softmax是一种常用的激活函数,主要用于多分类任务。它将网络的输出转换为概率分布,使得每个类别的预测值都是一个概率,所有类别的概率之和为1。
Softmax函数的公式如下:
$$
\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}}
$$
其中,z_i 是第 i 个类别的未归一化得分(logits),Softmax函数将其转换为概率 p_i。
类别预测
在YOLOv3中,每个预测框不仅需要预测边界框的坐标和置信度,还需要预测目标的类别。YOLOv3采用了Softmax激活函数来处理类别预测。
输出结构
YOLOv3的每个预测输出包含三个部分:
-
边界框坐标:预测的目标边界框的中心坐标(x, y)、宽度(w)和高度(h)。
-
置信度:预测的目标置信度,表示边界框内包含目标的概率。
-
类别概率:预测的类别概率,表示目标属于每个类别的概率。
每个尺度的预测输出大小为 (grid_size, grid_size, num_anchors * (5 + num_classes))
,其中:
-
grid_size
是特征图的大小,例如13、26或52。 -
num_anchors
是每个尺度上的先验框(Anchor Boxes)的数量。 -
5 + num_classes
代表每个预测的5个边界框参数(x, y, w, h, 置信度)加上类别概率。
先验框改进
YOLOv3通过引入9个先验框,使得模型能够更准确地预测目标的边界框,并且能够适应不同尺度的目标。先验框的生成和使用是YOLOv3提高检测精度和性能的重要步骤。
分配
YOLOv3将9个先验框分配到三个尺度的特征图上:
-
大尺度特征图(52x52):负责检测小目标,使用较小的先验框。
-
中尺度特征图(26x26):负责检测中等大小的目标,使用中等大小的先验框。
-
小尺度特征图(13x13):负责检测大目标,使用较大的先验框。
每个尺度的特征图上使用3个先验框。假设分配如下:
-
52x52特征图:
[ [10, 13], [16, 30], [33, 23] ]
-
26x26特征图:
[ [30, 61], [62, 45], [59, 119] ]
-
13x13特征图:
[ [116, 90], [156, 198], [373, 326] ]
YOLOV4
BOF
YOLOv4在目标检测任务中引入了多种优化策略,这些策略被称为Bag of Freebies(BoF)。这些策略在不增加推理时间的情况下,显著提升了模型的性能。
Mosaic数据增强
Mosaic数据增强通过将四张图像拼接在一起形成一张新的图像,增强极大地增加了训练数据的多样性,提高了模型的泛化能力。
CutMix数据增强
CutMix数据增强将两张图像的部分区域混合在一起,使得模型能够更好地学习不同目标之间的区分特征。
Random Erase
Random Erase通过在图像中随机擦除一个矩形区域来增加训练数据的多样性,从而提高模型的泛化能力。其目标是通过随机遮挡图像的一部分,迫使模型学习图像的全局特征,而不是依赖某些特定的局部特征。这种方法可以有效地防止模型过拟合训练数据,从而提高模型在测试集上的表现。
Hide and Seek
Hide and Seek通过在图像中随机隐藏一些像素区域来增加训练数据的多样性,从而提高模型的泛化能力。
SAT
Self-Adversarial Training (SAT)通过分两个阶段对模型进行训练。
-
攻击阶段:模型在输入图像上执行前向传播,并生成对抗扰动。这些扰动被添加到输入图像上,生成对抗样本。
-
训练阶段:模型在生成的对抗样本上进行训练,通过反向传播更新模型参数。
DropBlock
DropBlock的目标是通过随机遮挡输入图像的一部分区域,迫使模型学习更具鲁棒性的特征。与Dropout不同,DropBlock在空间结构上遮挡连续的区域,而不是随机丢弃单个像素。这种方法可以更好地模拟实际场景中的遮挡情况,提高模型的泛化能力。更适合计算机视觉任务。
-
选择遮挡区域:在输入特征图上随机选择一个矩形区域作为遮挡区域。
-
确定遮挡区域大小:根据预设的遮挡比例,随机确定遮挡区域的宽度和高度。
-
遮挡区域:将选定的矩形区域的像素值设置为零。
Label Smoothing
Label Smoothing是一种简单而有效的正则化技术,通过对目标标签进行平滑处理,可以减少模型过拟合的风险,提高模型的泛化能力。它在许多深度学习任务中得到了广泛的应用,并且证明了其有效性。
原理
在分类任务中,目标标签通常是一个one-hot编码向量,其中目标类别的概率为1,其余类别的概率为0。这种硬标签可能导致模型过度自信,从而导致过拟合。Label Smoothing通过将目标标签进行平滑处理,使目标类别的概率小于1,其余类别的概率大于0,从而减少模型的过度自信。
公式
假设有一个包含 K 个类别的分类任务,目标标签为 y,对目标标签进行Label Smoothing后的标签为 y_{LS},其公式如下:
$$
y_{LS} = (1 - \alpha) \cdot y + \alpha / K
$$
其中:
-
y 是原始one-hot编码的目标标签。
-
\alpha 是平滑参数,取值范围在 [0, 1]。
-
K 是类别的数量。
优点
-
减少过拟合:通过对目标标签进行平滑处理,减少模型过度自信的风险,从而降低过拟合的可能性。
-
提高泛化能力:Label Smoothing可以帮助模型更好地泛化到未见过的数据上,提高模型的鲁棒性。
-
抑制异常点:在一些数据集中可能存在噪声标签,通过Label Smoothing可以减少这些异常点对模型训练的影响。
Cosine退火学习率
Cosine退火学习率(Cosine Annealing Learning Rate)动态调整学习率,使得模型在训练后期能够更好地收敛,提高了模型的训练效率和精度。
CIoU
Complete Intersection over Union (CIoU) Loss是一种用于边界框回归的损失函数,通过综合考虑重叠面积、中心点距离和长宽比,提高了边界框预测的精度。
原理
在目标检测任务中,传统的IoU(Intersection over Union)损失函数仅考虑预测框和真实框的重叠面积,忽略了其他几何信息。CIoU通过引入中心点距离和长宽比的惩罚项,使得预测框能够更好地拟合真实框,从而提高边界框回归的精度。
公式
CIoU损失函数的公式如下:
$$
\text{CIoU} = 1 - \text{IoU} + \frac{\rho^2(\mathbf{b}, \mathbf{b}^g)}{c^2} + \alpha v
$$
其中:
-
\text{IoU} 表示边界框与真实框的交并比。
-
\rho(\mathbf{b}, \mathbf{b}^g) 表示边界框中心点与真实框中心点之间的欧氏距离。
-
c 表示包围框的对角线长度。
-
\alpha 和 v 是权重参数,分别用来调节长宽比的影响。
网络结构
YOLOv4 网络结构概述
YOLOv4的网络结构主要包括以下几个部分:
-
Backbone:特征提取网络,负责从输入图像中提取多尺度特征。
-
Neck:特征融合网络,利用特征金字塔和路径聚合网络进行多尺度特征融合。
-
Head:检测头,负责生成最终的边界框和类别预测。
Backbone:CSPDarknet53
YOLOv4采用CSPDarknet53作为其Backbone。CSPDarknet53在Darknet53的基础上进行了改进,引入了Cross Stage Partial (CSP) 结构,进一步提高了特征提取的效率和性能。
CSPDarknet53的层次结构
CSPDarknet53由多个CSP模块和残差块组成,其主要层次结构如下:
-
输入层:输入图像的大小为 416 \times 416 \times 3。
-
卷积层 + CSP模块:通过一系列卷积层和CSP模块提取多尺度特征。
-
残差块:在CSP模块中引入残差连接,提高特征提取的深度和广度。
Neck:PANet和SPP
YOLOv4的Neck部分采用了PANet(Path Aggregation Network)和SPP(Spatial Pyramid Pooling),用于多尺度特征融合。PANet通过自顶向下和自底向上的路径聚合,提高了特征金字塔的表达能力。SPP通过不同尺度的池化操作,进一步增强了特征表达能力。
PANet的层次结构
PANet由以下几个关键部分组成:
-
FPN(Feature Pyramid Network):自顶向下的特征金字塔,用于融合不同尺度的特征。
-
路径聚合模块:自底向上的路径聚合,进一步结合不同层次的特征。
-
卷积层:在路径聚合模块后进行卷积操作,生成最终的特征图。
SPP的层次结构
SPP模块通过在特征图上进行不同尺寸的池化操作,生成多个尺度的特征图,并将它们进行拼接,从而增强特征表达能力。SPP模块的主要步骤如下:
-
池化操作:在特征图上进行不同尺寸的池化(如1x1、5x5、9x9等)。
-
特征拼接:将不同池化尺寸的特征图进行拼接,生成增强的特征图。
Head:YOLO Head
YOLOv4的Head部分负责生成最终的边界框和类别预测。YOLO Head基于多个尺度的特征图进行检测,提高了小物体的检测能力。
YOLO Head的层次结构
YOLO Head包括以下几个关键部分:
-
卷积层:对来自Neck部分的特征图进行卷积操作,生成预测结果。
-
锚框机制:采用预定义的锚框进行边界框回归,生成最终的边界框预测。
-
分类层:对每个边界框进行类别预测,生成最终的检测结果。