YOLO_v1(You Only Look Once)论文解读

本文详细介绍了目标检测算法YOLO1。它将目标检测视为回归任务,可端到端优化,检测速度快。文中阐述了其网络设计、训练和推理过程,分析了损失函数及解决的问题,还探讨了优缺点,如优点是检测快、少FP误差、能学泛化特征,缺点是对小目标和多类目标检测有问题、精度稍低等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文链接:https://arxiv.org/abs/1506.02640

1. Abstract

我们提出了一种新的目标检测算法——YOLO。之前的目标检测都是基于two-stage的工作,先要提出候选框,然后再对提出的候选框做分类和边框回归;而我们是将目标检测看作一项回归任务,从空间上分割边界框和相关的类别概率,使用单个网络在一个评估中直接对整张图像中边界框和所属类别概率进行预测。由于整个检测流水线是单一网络,所以在检测性能上可以直接端到端的优化。

我们的统一结构非常快,基于我们的YOLO模型可以以每秒45帧的速度实时处理图片,更小版本的网络——Fast YOLO可以在保证其他实时检测器map两倍的同时处理速度达到每秒155帧。与一些最先进的检测网络相比,YOLO产生了更多的定位误差,但是它很少将背景类划分到前景类(很少的FP误差)。最后,YOLO学到了泛化性能很好的特征,当从自然图片向类似于艺术品这样的其他领域泛化时,它优于包括DPM和R-CNN等很多检测器。

2. Unified Detection

我们将目标检测的几个重要部分统一成单一的神经网络,我们的网络使用整张图片的特征来对每个bounding boxes做预测,它同时对一张图片上所有类别所有bounding boxes进行预测,这意味着我们的网络可以同时推理整张图片上的所有目标,因此YOLO设计可以端到端训练和实施处理,并且维持高的平均精度。

几点说明:

  • 我们的系统将整张图片划分为 SxS 个网格,如果一个目标的中心落在了这个网格,那么这个网格就负责检测这个目标;
  • 每个网格预测B个bounding boxes以及它们的置信度,这些置信度分数了反应了这个bounding box包含一个目标的自信度,正式来说,置信度定义为: P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU_{pred}^{truth} Pr(Object)IOUpredtruth,如果网格中没有这个目标,则置信度为0;否则置信度应该是我们预测的box和ground box之间的IOU值;
  • 每个bounding box由5个预测值组成:x,y,w,h和置信度。(x,y)坐标是相对于网格来说的,而w和h是相对于整个图片来讲的,最后置信度代表了bounding box和ground truth box之间的IOU;
    在这里插入图片描述
  • 每个网格同时预测C个条件类别概率值 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_{i}|Object) Pr(ClassiObject),这些概率值以网格包含一个目标为条件,我们在每个网格仅预测一组类别概率,而不管boxes的数量B有多少;
  • 在测试时,我们将条件类别概率值和单个box置信度预测相乘:
    P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_{i}|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_{i})*IOU_{pred}^{truth} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth
    它给定了对于每个box来说属于每个类别的置信度分数。
    在这里插入图片描述
    为了在PASCAL VOC数据集上评估YOLO,我们使用的超参为 S = 7 , B = 2 S=7,B=2 S=7,B=2,又PASCAL VOC数据集本身有20个类别,所以我们最终的预测是一个 7 × 7 × 30 7\times 7\times 30 7×7×30的张量,开源代码中输出向量的内容以下图形式表示。
    在这里插入图片描述

2.1 Network Design

我们用卷积神经网络实现了这个模型并在PASCAL VOC数据集上进行检测,开始的卷积层从整张图片中提取网络特征,而全连接层预测类别概率和坐标。最后网络的输出为一个 7 × 7 × 30 7\times 7\times 30 7×7×30的张量。
在这里插入图片描述
上面是YOLO使用的结构,包含有24个卷积层,后面跟了两个全连接层,Fast YOLO只有9个卷积层,并且使用了更少的卷积核,除了这个差异,YOLO和Fast YOLO具有相同的训练和测试参数。

2.2 Training

  • 预训练时我们的网络结构:Figure 3中前20个卷积层后面跟了一个平均池化层和全连接层,我们对网络训练了一周,在ImageNet 2012验证集上实现了88%的top-5准确率;
  • 然后我们将预训练的前20个卷积层的结果迁移到检测任务中,后面加了4个卷积层和两个全连接层来提升性能。由于检测任务需要更细颗粒度的视觉信息,我们将网络输入的分辨率由 224x224 变为 448x448;
  • 我们的最后一层对类别概率和坐标进行预测。我们正则化了bounding box的宽和高(分别除以图像的w和h),将它们都转化到0-1之间。我们对bounding box的x和y坐标参数化为对特定网格的偏移量,所以它们的值也在0-1之间;
  • 除了最后一层使用的是线性激活函数,其他层都使用了下面的 leaky ReLU:
    在这里插入图片描述
  • 为避免过拟合,我们使用了dropout和数据增强,在第一个全连接层之后使用了keep_prob=0.5的一个dropout层来防止过拟合。

我们选择了平方和误差损失函数,因为它比较容易优化,然而它并不完全符合最大化平均精度的目标。主要存在两个问题:

  • 问题一:8维的定位误差和20维的分类误差并不是同等重要的,这使得网格的置信度分数倾向于0,通常压倒了包含目标的网格梯度,这导致了模型不稳定——训练早期发散;
    解决方法:为了解决这个问题,我们一方面增加了bounding box位置预测的损失,另一方面减少了没有包含目标的boxes的置信度预测值的损失,我们引入了两个参数, λ c o o r d = 5 , λ n o o b j = 0.5 \lambda _{coord}=5,\lambda _{noobj}=0.5 λcoord=5,λnoobj=0.5
  • 问题二:我们的平方差误差损失函数中对于大的boxes和小的boxes的误差权重相同,即相同的偏差在大的boxes和小的boxes反映在损失函数上是相同的,但是这是不合理的,我们的度量标准应该反映出小的boxes中的偏差要比大的boxes中的偏差更重要;
    解决方法:将损失函数中每一个box的h和w的平方误差用h和w的平方根的平方误差替代;
    在这里插入图片描述
    YOLO对于每个网格会预测多个bounding box,在训练期间,我们对于一个目标仅想要一个bounding box预测器负责。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个 predictor就负责object。这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor对特定尺寸、长宽比的目标的预测会变得更好。(不懂没有关系我后面会举例子)
    损失函数如下:
    在这里插入图片描述

第五行对应的是分类误差,分类误差是针对网格,而非bbox的,只有该网格对某个目标负责时(即某个目标的ground truth的中心落在了该网格上),对应的 I i o b j \mathbb{I}_{i}^{^{obj}} Iiobj才为1,我们以下图为例,共有 7x7=49 个网格,下图中只有三个网格(下图中有三个目标)对分类误差有贡献,其余的不计算;第一、二、三、四行是针对bbox的,只有说第i个网格的第j个bbox对某个目标负责时(对某个目标负责的网格内有B=2个bbox,我们选择与该目标ground truth的IOU值最大的那个bbox对该目标负责),此时 I i j o b j \mathbb{I}_{ij}^{^{obj}} Iijobj才为1,我们以下图为例,只有三个bbox是计入第一、二、三行误差的,剩下的 7x7x2 - 3 = 95 个bbox只计算第四行误差,很明显误差项的个数不平衡,所以需要引入权重因子做一些平衡(上面已经具体介绍过)。

既然说到这,我们就进一步想一个更基本的问题,我们每个bbox对应的真实标签是如何得到的?即一张图片对应的 [7, 7, 30] 维度的labels是如何得到的?通过对源码进行分析,我找到了答案,下面以一张图片的标签获得说明一下,起初定义了一个 [7, 7, 25]维度(20个类别信息+由每个网格负责的检测目标的信息)的全零张量,然后我们加载出一张图片的真实ground truth的信息(x,y,w,h,c)——四个位置信息+一个类别信息,然后我们判断这个目标会落在哪个网格上,就将49个网格中哪一个网格检测目标信息就是这个目标的真实ground truth归一化后的值(对应在[7, 7, 25]维度的张量中有一个[1, 1, 25]维度的[0:5]位置上获得了值,然后[5:25]位置上 index=5+c的那个位置置1代表了这个网格要检测的目标类别),以下图为例,最后得到的[7, 7, 25]维度的张量中只有3个[1, 1, 25]的张量非全零,剩下的都是0。至于怎么得到[7, 7, 30]维度的labels,其实是将每一个[1, 1, 25]维度张量中的前五个值进行了复制,添加到了[5, 10]的位置上,而将原来的[5:25]位置上的值移到了[25:30]位置,也就是说,同一个网格对应的B=2个bbox的五个值的设置是一样的,都是该网格对应的检测目标的ground truth归一化后得到的值。

通过上面分析,不难发现得到的[7, 7, 30]维度的张量中每一个[1, 1, 30]维度的张量的第0个位置(也即第5个位置)的值就编码了损失函数中 I i o b j \mathbb{I}_{i}^{^{obj}} Iiobj的信息,然后再对每个网格对应的B=2个bbox计算和真实检测目标之间的IOU得到[7, 7, 2]维度的张量,取每个网格B个bbox中IOU最大的那个bbox来负责预测当前网格负责的目标,其和 I i o b j \mathbb{I}_{i}^{^{obj}} Iiobj共同编码 I i j o b j \mathbb{I}_{ij}^{^{obj}} Iijobj的信息。
在这里插入图片描述

2.3 Inference

上面对训练阶段的细节做了详细描述,现在来介绍一下测试阶段,使用训练好的模型对一张图片做测试,网络会对每张图片预测98个bbox,通过 P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_{i}|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_{i})*IOU_{pred}^{truth} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth计算得到每个bbox属于每个类别的score,也就是说最后会得到20(772)=20*98的score矩阵,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。*
在这里插入图片描述
问题:同一个网格是否会出现两个相同class的bbox?而又是否会出现两个不同class的bbox?
先说结论,同一个网格的两个bbox可以同属一类,同一个网格中不可能出现两个不同类的bbox。why?简而言之,是因为它计算score的方式—— P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_{i}|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_{i})*IOU_{pred}^{truth} Pr(ClassiObject)Pr(Object)IOUpredtruth=Pr(Classi)IOUpredtruth决定的,对于同一网格内的B=2个bbox 20个类别之间的高低得分 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_{i}|Object) Pr(ClassiObject)是固定的,用每个网格内不同bbox的置信度 P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU_{pred}^{truth} Pr(Object)IOUpredtruth乘以共同的20类别概率并不影响类别概率之间的高低得分排序(线性相关),同时这B个bbox相对应类别之间的IOU值是相同的(比如说20个类别里面由car和cat两个类别,bbox1的两个类别的得分为0.8和0.6,bbox2的两个类别得分为0.4和0.3),那么在对每个类别做NMS时,IOU值是固定的(两个bbox的位置一直都没变),即对于bbox1和bbox2的car和cat两个类,当IOU>0.5时,bbox2的0.4和0.3就会置0(舍弃掉了bbox2),当IOU<0.5时,bbox2保留下来了,最后对于每个bbox输出的是score得分最高的那个类,因为前面提到的线性相关特性,最终输出的类别也会是相同的(如果bbox1和bbox2中car的概率是最高的,那么这两个bbox最后预测都是car这个类别)。由上所述,并不会存在输出不同类别的情况。

2.4 YOLO的优缺点

优点:

  1. 检测速度快,因为它是one-stage的,直接将检测视作回归问题;
  2. 可以很好的避免产生FP错误,不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。
  3. YOLO可以学到物体的泛化特征。当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。

缺点:

  1. 虽然每个格子可以预测B个bounding box,但是这B个bbox的预测输出只能是一个类的。这种空间约束限制了我们的模型可以预测附近目标的数量,即对成群的小目标预测有问题;
  2. 多个不同类的目标中心落在同一个网格时,我们一个网格内的bbox输出类别唯一,检测出现问题;
  3. 模型采用了多个下采样层,导致模型学到的特征并不精细,也会影响检测结果;
  4. 相比于其他先进的目标检测系统,它的精度稍低;召回率低;
  5. YOLO loss函数中,大物体IOU误差和小物体IOU误差对网络训练中loss贡献值接近(虽然采用求平方根方式,但没有根本解决问题)。因此,对于小物体,小的IOU误差也会对网络优化过程造成很大的影响,从而降低了物体检测的定位准确性。

Correct: correct class and IOU > 0.5
Localization: correct class, 0.1 < IOU < 0.5
Similar: class is similar, IOU > 0.1
Other: class is wrong, IOU > 0.1
Background: IOU < 0.1 for any object
在这里插入图片描述

实验结果

在这里插入图片描述
参考:https://zhuanlan.zhihu.com/p/37850811

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值