YOLO

[TOC]

YOLO

模型结构

结构:Backbone+Neck+Head

yolov8结构图

CSPLayer

CSPLayer「Cross Stage Partial Layer」是一种用于特征提取和特征融合的卷积层,通常应用于模型的backbone部分。通过分块与跨层连接的方式来改善特征表达能力,同时减少计算量。

设计目标是通过分块处理特征图的方式,减少重复梯度信息的传播,缓解网络中的梯度消失和梯度爆炸问题,同时提高模型的推理速度和内存效率。

结构细节:

CSPLayer通常包括以下几个主要部分:

  1. 输入特征图分块:输入的特征图在通道维度上被分成两部分,其中一部分直接传递到最后的特征融合阶段,另一部分则通过一系列的卷积操作进行处理。

  2. 部分卷积操作:对分块后的特征图的一部分,进行多个卷积层的操作,这些卷积层可能包括常规卷积、深度可分离卷积、或其他高效的卷积操作。这一过程旨在进一步提取和增强特征。

  3. 跨阶段连接:未经过卷积处理的特征图直接跳跃到最终的特征融合阶段。这种设计称为跨阶段连接(cross-stage connection),目的是保留更多的原始特征信息,从而帮助网络更好地学习特征表达。

  4. 特征融合:经过卷积处理的特征和跳跃连接的特征在最后进行融合。融合方式通常是通道维度上的拼接(concatenation)或加法(addition),具体取决于设计细节。

  5. 输出:融合后的特征图经过进一步的卷积处理(如1x1卷积)后输出,作为CSPLayer的最终输出。

优点:

  1. 减少计算成本:通过分块处理和跨阶段连接,CSPLayer减少了特征图的卷积操作,降低了计算成本。
  2. 缓解梯度问题:跨阶段连接有助于缓解深层网络中的梯度消失和梯度爆炸问题,从而使得网络更容易训练。
  3. 增强特征表达:这种分块处理和融合的方式能够更好地保留和提取特征信息,提升模型的特征表达能力。

LOSS

YOLOv8 中使用的分类损失和回归损失分别是 VFL Loss 和 CIOU Loss+DFL。以下是对这些损失函数的详细解释:

分类损失(VFL Loss)

VFL(Varifocal Loss)是一种改进的分类损失函数,用于处理目标检测中的分类任务。VFL Loss 旨在解决类别不平衡的问题,通过赋予正样本和负样本不同的权重来提高检测效果。

VFL Loss 的公式为:
$$
\mathcal L_{VFL} = - \sum_{i=1}^{N} \alpha_i [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)]
$$
其中:

  • ( $y_i$ ) 是真实标签(0 或 1),表示是否存在目标。
  • ( $p_i$ ) 是预测的概率。
  • ( $\alpha_i$ ) 是一个可变的焦点因子,用于调整不同样本的权重。

VFL Loss 的关键在于权重因子 $\alpha_i$ 的计算。权重因子 $\alpha_i$ 动态调整正负样本的权重,使得模型在训练过程中更关注那些置信度较低的样本。具体的权重计算方法如下:

对于正样本 ( $y_i = 1$ ):$\alpha_i = p_i$

对于负样本 ( $y_i = 0$ ):$\alpha_i = 1 - p_i$

通过这种权重调整机制,VFL Loss 实现了以下效果:

「这里的置信度是被分类为正样本的置信度」

对正样本的关注:当模型对正样本的置信度 $p_i$ 较低时,权重因子 $\alpha_i$ 也较低,损失较大。这样,模型会更关注这些置信度较低的正样本。
对负样本的关注:当模型对负样本的置信度 $p_i$ 较高时,权重因子 $\alpha_i$ 也较低,损失较大。这样,模型会更关注这些置信度较高的负样本。

回归损失(CIOU Loss + DFL)

CIOU Loss

CIOU(Complete Intersection over Union)损失是一种改进的边界框回归损失,综合考虑了边界框的重叠区域、中心点距离和宽高比差异。CIOU Loss 在优化目标检测框位置时具有更好的性能。

CIOU Loss 的公式为:
$$
\mathcal{L}_{CIOU} = 1 - \text{IoU} + \frac{\rho^2(\mathbf{b}, \mathbf{b}^{gt})}{c^2} + \alpha v
$$
其中:

  • ($\text{IoU}$) 是预测框和真实框的交并比。
  • ($\rho(\mathbf{b}, \mathbf{b}^gt)$) 是预测框和真实框中心点之间的欧氏距离。
  • ($c$) 是包含预测框和真实框的最小闭包区域的对角线长度。
  • ($\alpha$) 和 ($v$) 是用于衡量宽高比差异的参数。

DFL(Distribution Focal Loss)

DFL(Distribution Focal Loss)是一种用于回归任务的损失函数,旨在提高预测的精度。它通过对预测值进行分布化处理,使得模型能够更好地学习目标的精确位置。

DFL 的核心思想是将回归值转换为一系列的离散概率分布,然后通过计算分布之间的KL散度(Kullback-Leibler Divergence)来衡量预测值与真实值之间的差异。

DFL 的公式为:
$$
\mathcal L_{DFL} = \sum_{i=1}^N \text{KL}(P_i, Q_i)
$$
其中:

  • ($P_i$) 和 ($Q_i$) 分别是预测值和真实值的概率分布。
  • ($\text{KL}(P_i, Q_i)$) 是两个分布之间的KL散度。

组合损失函数

在 YOLOv8 中,回归损失通常是 CIOU Loss 和 DFL 的加权组合,用于更好地优化边界框的定位精度。

组合损失的公式为:
$$
\mathcal L_{reg} = \lambda_{CIOU} \mathcal L_{CIOU} + \lambda_{DFL} \mathcal L_{DFL}
$$
其中,($\lambda_{CIOU}$) 和 ($\lambda_{DFL}$) 是用于平衡两种损失的权重参数。

总结

  • VFL Loss 用于分类损失,通过动态调整样本权重来增强模型对难样本的学习能力。
  • CIOU Loss 用于边界框回归,通过综合考虑重叠区域、中心点距离和宽高比差异来优化边界框位置。
  • DFL(Distribution Focal Loss) 用于提高预测的精度,通过对预测值进行分布化处理来学习目标的精确位置。

这些损失函数的组合使得 YOLOv8 在目标检测任务中具有更高的精度和鲁棒性。

NMS-非极大值抑制

NMS是目标检测领域一项重要的后处理技术,旨在解决检测器生成的存在重叠的多个检测框的问题,主要包括两个关键超参数:Conf分数和IoU阈值

NMS的算法流程:

排序:根据候选框的置信度分数进行降序排序,低于置信度阈值的直接删除。

选择最高分数的框:选取当前最高分数的边界框作为一个保留框,然后将其从候选框列表中删除。

计算重叠度:对于剩余的候选框,计算它们与当前保留框的交并比(IoU,Intersection over Union)。

移除高重叠框:将与当前保留框的IoU大于预设阈值的候选框删除。

重复步骤2-4:直到所有的候选框都处理完毕。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def iou(box1, box2):
"""计算两个边界框的交并比(IoU)"""
x1, y1, x2, y2 = box1
x1_prime, y1_prime, x2_prime, y2_prime = box2

# 计算交集
xi1 = max(x1, x1_prime)
yi1 = max(y1, y1_prime)
xi2 = min(x2, x2_prime)
yi2 = min(y2, y2_prime)
inter_area = max(0, xi2 - xi1 + 1) * max(0, yi2 - yi1 + 1)

# 计算并集
box1_area = (x2 - x1 + 1) * (y2 - y1 + 1)
box2_area = (x2_prime - x1_prime + 1) * (y2_prime - y1_prime + 1)
union_area = box1_area + box2_area - inter_area

# 计算IoU
iou = inter_area / union_area
return iou

def non_max_suppression(boxes, scores, iou_threshold):
"""执行非极大值抑制(NMS)"""
idxs = np.argsort(scores)[::-1] # 置信度分数降序排序
keep = []
while len(idxs) > 0:
current = idxs[0]
keep.append(current)
idxs = idxs[1:]
filtered_idx = []
for i in idxs:
if iou(boxes[current], boxes[i]) <= iou_threshold:
filtered_idx.append(i)
idxs = np.array(filtered_idx)
return keep

为什么YOLO需要NMS,RT-DETR不需要?

首先通用视觉目标检测可以分为基于CNN架构的和基于Transformer架构的两大类:

  1. 前者是“密集检测范式”,即布置大量空间anchor作为采样点,因此寻找每个anchor所携带的感受野范围内的物体,如RetinaNet、YOLO和SSD。

  2. 后者是“稀疏检测范式”,即设置固定数量(远小于前者的anchor数量)的object query去存储不同物体的高级语义特征,通过交叉注意力机制去查询图像中的感兴趣的目标,实现对图像中的目标的检测。

YOLO中的NMS

在YOLO模型中,整个图像被分割成网格,并在每个网格中预测边界框和类别概率。由于网格的重叠或预测中的不确定性,可能会为同一个物体产生多个相似的检测框。NMS的作用是消除这些多余的检测框,只保留置信度最高的那个。避免对同一个物体的多次检测。

RT-DETR中的NMS

RT-DETR使用一种称为查询的机制来直接预测目标的位置和类别。与传统的检测方法不同,RT-DETR的设计理念是通过一个称为“DETR”的结构来对图像中的每一个对象产生一个唯一的查询。因此,每个查询应对应于一个唯一的对象,而不应该有重复。

由于RT-DETR模型的设计和训练方式,它能够有效地学习到如何为每个对象生成唯一的检测。理论上,它生成的预测框之间不应有显著的重叠,这样就不需要NMS来去除冗余的检测。因此,RT-DETR可以避免使用NMS,并直接输出最终的检测结果。

Bot-SORT

BotSort是一种用于目标跟踪的算法,主要用于多目标跟踪(Multi-Object Tracking, MOT)任务。BotSort的主要目标是通过跟踪对象的外观和运动特征来解决多个物体在视频序列中出现和消失的问题。以下是BotSort的基本原理和关键组成部分:

1. 检测器

BotSort的第一步是使用目标检测器识别每一帧中的目标物体。常用的目标检测器包括YOLO、SSD、Faster R-CNN等。这些检测器在图像中产生边界框和类别预测。

2. 特征提取

一旦目标检测器识别出物体,BotSort会提取这些物体的外观特征和运动特征。外观特征通常使用深度卷积神经网络(CNN)来提取,例如使用预训练的ResNet或MobileNet等。运动特征则可以通过Kalman滤波器等传统方法来估计物体的运动状态,包括位置和速度。

3. 数据关联

在多目标跟踪中,数据关联是一个关键问题,即如何在相邻帧之间将检测结果正确地链接到同一个对象上。BotSort通常使用卡尔曼滤波器预测每个目标的下一位置,然后使用匈牙利算法等优化方法将检测结果与跟踪对象匹配。

为实现匹配,BotSort会结合检测结果的外观特征和位置预测,计算检测与跟踪目标之间的相似度,通常使用的距离度量包括欧氏距离、马氏距离等。最小化这些距离以实现最佳匹配。

4. 轨迹管理

轨迹管理是多目标跟踪中的重要环节,包括初始化、维护和删除轨迹。BotSort使用一定的规则来管理轨迹,例如如果一个新检测结果没有与任何现有轨迹匹配,它会初始化一个新的轨迹;如果某个轨迹在一定时间内没有新的检测结果匹配,它会被认为已消失并删除。

5. 特征融合与更新

在每一帧中,BotSort不仅仅是简单地匹配检测结果和轨迹,还会更新每个轨迹的特征。更新过程包括结合当前帧的外观特征和运动特征来更新轨迹的状态。这一更新使得跟踪器能够适应目标的外观和运动变化,提高跟踪的稳定性和准确性。

关键技术

卡尔曼滤波器:用于预测目标的运动状态。

匈牙利算法:用于解决最优匹配问题。

深度学习特征提取:用于提取目标的外观特征,提高关联准确性。


YOLO
https://adzuki23.github.io/2024/07/23/OD-Yolo/
作者
Hongyu Li
发布于
2024年7月23日
更新于
2024年8月7日
许可协议