概述:本文为YOLOv1论文精度的记录,帮助理解YOLOv1整个训练以及预测过程。
Tips:
- 文章绿色部分为YOLO后续论文中优化更改的内容。
- YOLOv1论文精度资料,包括论文原文,推测部分经典PPT, 本人精度论文中的标注,已经上传至CSDN,见链接,不方便下载可以给我留言。
资料- 文章主要内容参考自B站UP主同济子豪兄的讲解,十分详细的论文精读视频!!
YOLOv1相对与同期模型最大的特点是其为单阶段模型,所以YOLO的运行速度相对于其他模型有显著提升。作者创新性的将目标检测问题看作回归问题,输入一张图片经过一个‘黑盒子’便可直接输出预测结果。为了更好的理解YOLO目标检测的过程,我们先不看那个黑盒子,而是聚焦于输出结果,即模型推理阶段。
下图给出了模型的推理过程,YOLOV1的输入为 448 × 448 × 3 448\times448\times3 448×448×3图像,输出大小为 7 × 7 × 30 7\times7\times30 7×7×30向量,输出向量的含义是我们理解YOLO模型推理阶段的关键先生。我们将整张输入图片分成 S × S S\times S S×S个网格(grid cell
),每个网格中随机生成 B B B个预测框,用来框出我们待检测的物体。为了确定一个框在图像中的位置,我们采用四个变量,分别是:
经过黑盒子变换,我们最初随机生成的预测框的位置会发生变换,即模型会输出预测框新的上述四个变量。**同时我们还给每一框定义了一个新的性质——置信度(confidence)用来表征每个框包含物体的概率以及其与真实框的重合情况。**所以一个框将有五个变量输出分别是 x , y , w , h , c x,y,w,h,c x,y,w,h,c。
在YOLOV1中 S = 7 , B = 2 S=7, B=2 S=7,B=2即将每个输入图片分成 7 × 7 7\times7 7×7个网格,每个网格将生成 2 2 2个预测框,用来框出图片中的物体。 每个框会预测出5个变量值,所以一个网格生成两个框,一个框带有5个属性,所以一个格就需要预测出 5 × 2 = 10 5\times2=10 5×2=10个变量值。回到我们模型的输出为 7 × 7 × 30 7\times7\times30 7×7×30,所以 7 × 7 7\times7 7×7即表示网格数量,在图中我们可以看到一个网格后面跟着30个变量值,其中前10个就为该网格预测出的两个框的变量值。
我们在前面分析到,每一个预测框有一个confidence属性表征其包含物体的概率。但具其体包含的是哪个物体,就需要计算出这个框包含每一类物体的概率。在YOLOv1中有20个类别的物体,所以输出结果的后20个值就表示每一个小网格(grid cell)对应每一类物体的概率,即由该网格生产的两个预测框对应每一类物体的概率。 由此,输出的 7 × 7 × 30 7\times7\times30 7×7×30向量的每一项含义便清楚了。
但经过上面分析,一张图片一共生产 7 × 7 × 2 7\times7\times2 7×7×2个框,但只有一部分框我们认为是真正找到物体的,所以我们还需要使用一些后处理方法,去掉无用的框。根据上面的分析,我们输出结果中有每个框包含物体的概率(confidence)以及每个框在包含物体的情况下是每个类别的概率。将二者相乘就是每个框是每个类别物体的概率。我们通过这个概率即可去掉无用的框,选出真正预测到物体的框。
见下图我们将所有框预测到的概率值按照每一行是一个概率列出来,并逐行处理。例如我们处理第一行——所有框关于类别狗的预测概率。我们先将所有小于0.2的预测概率置为0,然后将概率值按照降序进行排列,对排序后的概率采用非极大值抑制(NMS)。
NMS的工作原理如下:将最大的概率的框设为bbox_max
,然后依次向下,观察概率排序第二的框与bbox_max
的IOU(交并比),如果大于0.5,则认为这两个框选中的是同一个物体,因此我们保留概率大的框,并将另一个框概率置为0。如果IOU不大于0.5则保留该框的预测概率。按照这个方法,让第一个框依次比较后续的框。第一个框与其后所有的框比较完后,我们另在这个过程中没有被置零的下一个框为bbox_max
,再依次向后比较,重复上述过程,直到最后一个bbox_max
比较过后,其后面的框的概率均被置为0.
将每一个类别都进行上述过程,便可以将概率仍然不为零的框画出来,至此得到我们最后的预测结果。
在训练阶段我们将通过两个部分——网络结构以及损失函数去深入理解YOLOV1这个黑盒子。
YOLOv1中采用了24个卷积层和两个全连接层,其整体结构如下(注:YOLOv1论文中作者在网络结构图中少画了一个全连接层)。我们直到卷积层用来提取图像的特征,所以在预训练阶段作者将前20个卷积层在图片分类数据集上进行训练。
在整个网络(24+2)的训练过程中,除最后一层采用ReLU
函数外,其他层均采用leaky ReLU
激活函数。leaky ReLU
相对于ReLU
函数可以解决在输入为负值时的零梯度问题。YOLOv1中采用的leaky ReLU
函数的表达式为:
ϕ ( x ) = { x , i f x > 0 0.1 x , o t h e r w i s e \phi(x)= \begin{cases} x, &if\ x>0 \\ 0.1x, &otherwise \end{cases} ϕ(x)={x,0.1x,if x>0otherwise
我们在训练过程中,通过最小化损失函数去更新模型中的参数。YOLOv1中作者采用了平方和损失函数,并为每一项损失(定位(x,y,w,h),分类(c, p))分配了不同的权重。见下图:
在解释每一项的内容之前我们需要先明确几个概念。在预测阶段我们分析道,输入给模型一张图片,模型会将其分成 7 × 7 7\times7 7×7个网格,每个网格生成两个预测框。在训练采用的图片中我们已经认为标注了物体的位置,这个人为标注的框称为ground truth
,这个ground truth
的中心落在哪一个网格里就由这个网格所生成的两个预测框中与ground truth
IOU大的那一个去最后贴合ground truth
。这个框就成为负责检测物体的框,这个格子里剩下的另一个框以及没有groung truth
中心落在的格子生成的两个框统称为不负责检测物体的框。
第一项:负责检测物体的框中心点(x, y)定位误差,遍历所有负责检测物体的框,计算其 ( x i , y i ) (x_i,y_i) (xi,yi)坐标与实际框的 ( x i ^ , y i ^ ) (\hat{x_i},\hat{y_i}) (xi^,yi^)的平方和误差,其权重 λ c o o r d = 5 \lambda_{coord}=5 λcoord=5.
第二项:负责检测物体的框的高宽(w,h)定位误差,遍历所有负责检测物体的框,计算 ( w i , h i ) (\sqrt{w_i},\sqrt{h_i}) (wi,hi)坐标与实际框的的 ( w i ^ , h i ^ ) (\sqrt{\hat{w_i}},\sqrt{\hat{h_i}}) (wi^,hi^)平方和误差,其权重 λ c o o r d = 5 \lambda_{coord}=5 λcoord=5.这里采用根式形式是为了对小框更加敏感。(可以想一下开二次方函数,在取值较小时,变换比较大)
第三项:负责检测物体的confidence
平方和误差:我们在预测阶段只给出了confidence
的大致含义,却没有给其具体公式,在YOLOv1中作者定义confidence
为 P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU^{truth}_{pred} Pr(Object)∗IOUpredtruth。所以在训练中我们是要将预测框的 P r ( O b j e c t ) Pr(Object) Pr(Object)的值变为1的,所以confidence
的标签值应该为预测框与实际框的 I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth
第四项:不负责检测物体的confidence
平方和误差,根据第三项,我们可以知道这一项的标签值应为0。其权重为0.5。
第五项:负责检测物体的网格对应类别的分类误差:当实际框中心落在某个网格内时,这个网格便需要预测该物体的类别。所以这一项我们遍历所有的网格,并将其类别预测值与实际值求平方误差。很明显,标签值在实际类别时为1,在非该物体类别时为0。
注:公式中特殊符号的含义:
至此我们整个YOLOv1架构就全部给出了解释。我们读过整个论文我们也会发现,YOLOv1一张 448 ∗ 448 448*448 448∗448图片只给出了 7 ∗ 7 ∗ 2 7*7*2 7∗7∗2个预测框,且每个网格只能负责预测一个物体,这对于两个物体的中心在同一个网格,小物体检测和群体物体检测很不友好。这些问题在YOLO后续的版本都做出了相应的对策。
YOLOv2,YOLOv3,YOlOv4的论文精度,以及YOLOv5的代码、网络结构分析即将更新。