YOLO系列笔记 · 二 · v1
YOLO-V1
概述
YOLOv1(You Only Look Once版本1)作为经典的单阶段目标检测算法,其设计理念是将目标检测问题通过卷积神经网络(CNN)转化为回归问题,实现了对视频流的实时检测,并因其应用范围广泛而备受关注。与早期的深度学习网络相比,YOLOv1在模型推理速度上有显著的优势,尽管其平均精度(mAP)不如后来的两阶段(two-stage)网络高,但在速度上仍保持领先地位。
核心思路
YOLOv1的核心思想在于将输入的图像划分成多个格子(cells / grids),每个格子负责预测落在其中心点的物体。通过对图像中的物体预设若干框,并不断调整这些框的位置(x, y)和大小(w, h),以及计算框与真实物体之间的交并比(IOU)和置信度(confidence),YOLOv1旨在寻找最适合每个物体的框。具体到YOLOv1中,每个格子会初始化两个预测框,通过计算IOU和置信度来筛选非目标格子,这种方式简化了检测流程,提高了处理速度。
网络结构
YOLOv1的网络结构设计较为简约,输入层固定接收448x448x3的图像尺寸,这一设计受到网络后期全连接层限制的影响。通过一系列的卷积层提取特征图(feature maps),并经过全连接层处理,YOLOv1最终输出一个7x7x30的结果。这一输出代表将图像分为7x7的格子,每个格子对应30个输出值,包括两个预测框的位置、大小、置信度以及20个可能类别的概率。
数据结构解释
针对每个格子的30个值,其中10个值(每个预测框5个,共2个框)包含预测框的位置(x, y)、大小(w, h)以及框中物体存在的置信度(c)。剩余的20个值代表了该格子中物体属于20个类别中的哪一个的概率。这种数据结构允许YOLOv1同时对物体的位置和类别进行预测。
损失函数
YOLOv1的损失函数是其设计中的一个核心要素,因为它直接影响到网络学习的效果,包括如何准确地定位物体和预测其类别。这个损失函数由几个不同的部分组成,用以评估不同类型的预测误差,并通过它们的和来指导模型的训练。以下是损失函数的详细分解和解释:
1. 位置误差(Bounding Box Prediction)
位置误差反映了预测的边界框(bounding boxes)与真实边界框之间的差异。YOLOv1对每个边界框的中心坐标(x, y)和尺寸(w, h)进行预测。误差计算使用的是预测值与真实值之间的平方差。为了平衡不同尺寸物体的影响,对宽度w和高度h的预测使用了平方根,因为较大物体的尺寸误差对损失的贡献应小于较小物体的尺寸误差。这部分的损失函数可以表达为:
λ
coord
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
obj
[
(
x
i
−
x
^
i
)
2
+
(
y
i
−
y
^
i
)
2
+
(
w
i
−
w
^
i
)
2
+
(
h
i
−
h
^
i
)
2
]
\lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ \left( x_i - \hat{x}_i \right)^2 + \left( y_i - \hat{y}_i \right)^2 + \left( \sqrt{w_i} - \sqrt{\hat{w}_i} \right)^2 + \left( \sqrt{h_i} - \sqrt{\hat{h}_i} \right)^2 \right]
λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi
−w^i
)2+(hi
−h^i
)2]
其中, S 2 S^2 S2 表示格子的数量,B是每个格子预测的边界框数量, ( 1 i j obj ) (\mathbb{1}_{ij}^{\text{obj}}) (1ijobj)是一个指示函数,当第(i)个格子的第(j)个框负责预测某个物体时为1,否则为0。 ( x , y , w , h ) (x, y, w, h) (x,y,w,h)分别是预测的中心坐标和边界框尺寸,而带有帽子的值表示对应的真实值。 λ coord \lambda_{\text{coord}} λcoord是坐标预测的权重系数,用于增加模型对边界框位置准确性的关注。
2. 置信度误差(Confidence Prediction)
置信度误差考虑了边界框是否包含物体以及边界框的准确性。YOLOv1为每个预测框分配一个置信分数,表示框中含有物体的置信度以及框的准确性(即预测框与真实框的IOU)。损失函数的这一部分区分了包含物体的框和不包含物体的框,给不含物体的框的置信度误差分配了较低的权重:
∑
i
=
0
S
2
∑
j
=
0
B
[
1
i
j
obj
(
C
i
−
C
^
i
)
2
+
λ
noobj
1
i
j
noobj
(
C
i
−
C
^
i
)
2
]
\sum_{i=0}^{S^2} \sum_{j=0}^{B} \left[ \mathbb{1}_{ij}^{\text{obj}} \left( C_i - \hat{C}_i \right)^2 + \lambda_{\text{noobj}} \mathbb{1}_{ij}^{\text{noobj}} \left( C_i - \hat{C}_i \right)^2 \right]
i=0∑S2j=0∑B[1ijobj(Ci−C^i)2+λnoobj1ijnoobj(Ci−C^i)2]
其中,
C
i
C_i
Ci是预测的置信度,
C
^
i
\hat{C}_i
C^i是与真实边界框相比的IOU,
1
i
j
noobj
\mathbb{1}_{ij}^{\text{noobj}}
1ijnoobj是当没有物体被第 i 个格子的第 j 个框预测时为1的指示函数。
λ
noobj
\lambda_{\text{noobj}}
λnoobj是非物体置信度的权重系数,减少模型将背景误识别为物体的倾向。
3. 分类误差(Class Prediction)
分类误差衡量了预测的类别分布与真实的类别分布之间的差异,使用的是平方差损失函数。对于每个格子,如果格子中心包含物体,则计算其类别预测的误差:
∑
i
=
0
S
2
1
i
obj
∑
c
∈
classes
(
p
i
(
c
)
−
p
^
i
(
c
)
)
2
\sum_{i=0}^{S^2} \mathbb{1}_i^{\text{obj}} \sum_{c \in \text{classes}} \left( p_i(c) - \hat{p}_i(c) \right)^2
i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
其中,
p
i
(
c
)
p_i(c)
pi(c) 是格子 i 预测物体属于类别 c 的概率,
p
^
i
(
c
)
\hat{p}_i(c)
p^i(c)是真实值,
1
i
obj
\mathbb{1}_i^{\text{obj}}
1iobj 是当格子(i)包含物体中心时为1的指示函数。
通过综合这三个部分,YOLOv1的损失函数旨在同时优化位置准确性、置信度以及类别预测的准确性,从而实现高效准确的目标检测。
NMS(非极大值抑制)
在多个预测框重叠的情况下,非极大值抑制(NMS)是一种有效的方法来选择最佳预测框。通过比较重叠框的IOU值,NMS算法能够筛选出与真实物体位置最接近的预测框,从而提高检测的准确性。
存在的问题
尽管YOLOv1在速度和性能上取得了显著成果,但它在处理高度重合的物体、多标签预测以及对小物体的敏感度方面仍存在局限。特别是,其单一尺寸的预设框难以适应不同大小物体的检测需求,这些问题在后续版本中得到了改进和优化。
标签:置信度,预测,YOLOv1,格子,text,物体,YOLO,笔记,v1 From: https://blog.csdn.net/XISHI_TIANLAN/article/details/137422341