YOLO 论文详解

时间:2024-04-03 10:21:33

YOLO

1、 YOLO 设计的目的

R-CNN系列的检测算法都是采用two-stage的方法,先提取proposal,再进行分类和回归,虽然这类方法检测的精度很高,但是检测的速度比较慢,因此本文提出了一个简洁的single-stage的方法来加快检测的速度,可以使用神经网络直接输出bounding box (bbox)的位置和所属类别。

2、 YOLO 的贡献

  • YOLO将目标检测问题转化为一个回归问题求解。
  • YOLO的结构非常简单,它是一个singlestagesingle-stage 的检测方法,直接使用一个卷积神经网络就可以同时预测bounding box的位置和类别。
  • YOLO速度非常快,因为YOLO只需将图片输入到网络中即可得到最终的检测结果,所以YOLO也可以实现视频的实时检测。
  • YOLO直接使用整幅图来进行检测,因此可以encode全局信息,所以可以减少将背景检测为物体的错误。
  • YOLO的泛化能力强,因为YOLO可以学习到高度泛化的特征,所以可以迁移到其他领域。

3、 YOLO 的结构

YOLO的检测过程特别简单,主要包括三步:

  1. Resize image:将图片resize成同样大小的,因为Detection需要图片的一些细粒度的信息,所以本文中使用高分辨率的输入: 448448448*448
  2. Run ConvNet:运行卷积神经网络,得到bbox的分类和回归结果。
  3. NMS:用非极大值抑制来筛选出最终的框。

4、 YOLO 的思想

如下图所示,在进行检测时,YOLO会首先将输入图片分成 SSS*S 个小格子(grid cell),若一个物体的中心点落到某个格子中,那么这个格子就负责检测出该物体,如图中,狗的 中心点落入了那个红色格子中,那红色格子就要负责检测出狗。
YOLO 论文详解
对于每个格子,YOLO都会预测出B个bounding box(bbox),在文中是预测2个bbox,如图中为红色的格子预测两个黄色的bbox,而对于每个bbox,YOLO都会预测出5个值,其中4个代表bbox的位置,还有一个代表bbox的confidence值:

  • bbox位置值(x, y, w, h),(x, y) 是bbox的中心点的位置,这个位置值是相对于grid cell归一化到0-1之间,假设图片的宽为width,高为height,然后图中红色grid cell的坐标为(1, 4),那 x=bboxx=bbox 的实际坐标 x/(width/S)1x/(width/S)-1y=bboxy=bbox的实际坐标 y/(height/S)4y/(height/S)-4(w,h)(w, h) 是bbox的宽和高,这个是相对于整张图片的,即w=bbox​实际的宽/图片的宽,h=bbox实际的高/图片的高,这样做可以将w和h归一到0-1之间,这有利于之后的回归。

  • bbox的confidence值:每个bbox都有一个confidence的值,表示预测的bbox包含一个物体的置信度。计算公式为: Pr(object)IoUPredTruthPr(object)*IoU^{Truth}_{Pred} ,从公式可以理解这个置信度衡量了两个方面:一个是bbox是否包含物体,另一个是bbox对于物体的位置预测的准确率(IOU)。如果一个bbox不包含物体,那么这个bbox的置信度为0,如果一个bbox包含物体,那么 Pr(object)=1Pr(object)=1,置信度就是bbox和ground truth box的IOU值了。

  • 此外,YOLO还会为每个grid cell进行分类,一共有C类,为每个grid cell都预测一组条件概率: Pr(classiobject)Pr(class_i|object) ,grid cell中的B个bbox共享这个条件概率。

    综上所述,一共有 SSS*S 个格子,每个格子预测B个bbox,每个bbox预测5个值,此外,每个格子预测C个类别,所以检测器最终需要预测一个 SS(B5+C)S*S*(B*5+C) 的tensor。在文中,S=7, B=2, C=20,所以最终会得到一个 77(25+20)=77307*7*(2*5+20)=7*7*30 的tensor。

5、网络设计(Network)

YOLO直接使用一个卷积神经网络来实现整个检测过程。其中,卷积层用来提取特征,全连接层用来进行分类和预测。网络结构是受GooLeNet的启发,把GooLeNet的inception层替换成 111*1333*3 的卷积。最终,整个网络包括24个卷积层和2个全连接层,其中卷积层的前20层是修改后的GoogLeNet。

YOLO 论文详解

此外,除过最后一层使用线性**函数之外,其他层都使用leaky ReLU**函数:

YOLO 论文详解

网络经过最后一个FC层得到一个147011470*1 的输出,将这个输出reshap一下,得到 77307*7*30 的一个tensor,即最终每个grid cell都有一个30维的输出,代表预测结果。

YOLO 论文详解

如上图所示,30维的输出主要包括三部分:

  • bbox1的回归结果,包括5维,其中前4维代表位置 (x,y,w,h)(x,y,w,h) ,最后一维代表置信度cc
  • bbox2的回归结果,同样也包括5维。
  • grid cell的分类结果,包括20维,分别是20类的概率。

9.6. 训练(Training)

在训练过程中,首先在ImageNet上对网络中的前20层进行预训练,之后再在这20层后连上4层卷积和2层全连接层进行训练。所以,前20层是用预训练网络初始化,最后的这6层是随机初始化的并在训练过程中更新权重。此外,因为detection需要更多图片细节的信息,所以在训练时,统一将输入图片的size从 224224224*224 调整为 448448448*448

9.6.1 损失(Loss)

Loss是通过ground truth和输出之间的sum-squared error进行计算的,所以相当于把分类问题也当成回归问题来计算loss。如下图所示,loss一共包括四个部分:

  • 位置误差
  • 置信度误差,含有object的
  • 置信度误差,不含object的
  • 分类误差

YOLO 论文详解

位置误差

对于位置误差,主要是计算bbox的 (x,y,w,h)(x,y,w,h) 和对应的ground truth box的 (x,y,w,h)(x,y,w,h) 之间的sum-squared error,需要注意的是并不是所有的bbox都参与loss的计算,首先必须是cell i中存在object,并且cell i中的第j个bbox和ground truth box有最大的IoU值,那么这个bbox j才参与loss的计算,其他的不满足条件的bbox不参与。即,一个ground truth box只需要一个bbox来负责,而有最大IoU的bbox更接近ground truth所以学习起来更快。

此外,因为误差在小的box上体现的更明显,就是一点点小的位置上的偏差可能对大的box影响不是很大,但是对小的box的影响就比较明显了,所以为了给不同size的box的位置loss赋予不同的‘权重’,需要对w和h开方后才进行计算。因为根据 y=xy=\sqrt x 的函数图像可知,当x较小时,x的一点小的变化都会导致y大的变化,而当x较大的时候,x的一点儿小的变化不会让y的变化太大。 但这个方法只能减弱这个问题,并不能彻底解决这个问题。

YOLO 论文详解

置信度误差

置信度误差的计算分两种情况,一种是有object的cell的置信度计算,另一种是没有object的cell的置信度计算。两种情况都是cell中所有的bbox都参与计算。对于有object的cell中的bbox的置信度的ground truth就是 1IoUPredTruth1*IoU_{Pred}^{Truth} 。需要注意的是这个IOU是在训练过程中不断计算出来的,因为网络在训练过程中每次预测的bbox是变化的,所以bbox和ground truth计算出来的IOU每次也会不一样。而对于没有object的cell中的bbox的置信度的ground truth为0IoUPredTruth=00*IoU_{Pred}^{Truth} =0,因为不包含物体。

分类误差

在本文中将分类误差当作回归误差来计算,使用sum-squared error来计算分类误差,需要注意的是只有包含object的cell才参与分类loss的计算,即object中心点落入的cell才进行分类loss的计算,而这个cell的ground truth label就是该物体的label。

此外,为了使得三种误差达到平衡,就需要给不同的误差赋予不同的权重。

  • 首先在目标检测问题中,localization的误差比分类的误差更重要,所以给位置误差赋予更大的权重,记为 λcrood=5\lambda_{crood}=5
  • 其次,因为一张图中大多数的bbox都是没有物体的,那么这些bbox的confidence的误差就会产生比较大的影响,甚至会影响到少量的含义object的bbox的误差优化,就是会产生一个overpowering,我猜测就是对于大部分的bbox来说优化loss是为了让这些bbox的confidence变为0,只有少量的是让confidence接近一个非零值,所以最后优化的结果可能是所有的bbox的confidence都变成0。为了避免这个问题,我们就需要赋予不含物体的bbox的confidence loss更小的权重,记为 λnoobj=5\lambda_{noobj}=5

总结起来就是:

  • 对于有object的cell,那么计算cell的分类误差,然后cell中两个bbox的置信度误差,然后cell中和ground truth box的IoU最大的bbox的位置误差。
  • 对于没有object的cell,那就只计算cell中两个bbox的置信度误差。

9.7. 测试(Testing)

在测试的时候,就是将一张图输入到网络中,然后得到一个77307*7*30 的预测结果。然后我们将计算结果中的每个cell预测的class信息Pr(classiobject)Pr(class_{i}|object) 和每个bbox的confidence信息Pr(object)IoUPredTruthPr(object)*IoU_{Pred}^{Truth} ,相乘即可得到每个bbox的class-specific confidence score:

YOLO 论文详解

如下图所示:

YOLO 论文详解

根据同样的方法我们可以计算得到98个bbox的confidence score,然后根据confidence score对预测得到的98个bbox进行非极大值抑制,然后得到最终的检测结果。

9.8. 缺陷(Limitations)

YOLO也存在一些缺点:

  • 因为YOLO中每个cell只预测两个bbox和一个类别,这就限制了能预测重叠或邻近物体的数量,比如说两个物体的中心点都落在这个cell中,但是这个cell只能预测一个类别。
  • 此外,不像Faster R-CNN一样预测offset,YOLO是直接预测bbox的位置的,这就增加了训练的难度。
  • YOLO是根据训练数据来预测bbox的,但是当测试数据中的物体出现了训练数据中的物体没有的长宽比时,YOLO的泛化能力就变弱了。
  • 同时经过多次下采样,使得最终得到的feature的分辨率比较低,就是得到coarse feature,这可能会影响到物体的定位。
  • 损失函数的设计存在缺陷,使得物体的定位误差有点儿大,尤其在不同尺寸大小的物体的处理上还有待加强。

9.9 总结

本文提出了一种新的single-stage的目标检测的算法YOLO,它将目标检测问题转化为回归问题。YOLO的结构非常简单,检测速度非常快,但检测的准确率还有待提高。