摘要:
YOLO把目标检测设计成一个回归问题:空间上分离的bounding box和有联系的类别概率。使用一个神经网络直接在整张图上预测bounding box和类别概率。
因为整个检测的流水线是单独的网络,所以可以端到端地优化。
YOLO可以实时处理图像,达到45帧每秒。一个更小的网络,Fast YOLO可以每秒处理155帧,并且mAP达到其他实时检测器的两倍。
和其他先进的检测系统相比,YOLO的定位错误更多,但是预测的负样本更少。
YOLO可以学到目标更加泛化的特征表达。当在别的领域,比如艺术品中应用检测时,他的性能超过了DPM和RCNN.
Introduction
快速、准确的目标检测算法在许多领域,比如无人驾驶中应用广泛。
DPM: 现在的检测系统重新定义分类器,让他们完成检测的任务。DPM使用滑动窗在整张图上扫,同时使用一个分类器在每个空间位置确定是否存在物体,计算量大。
RCNN: SS产生region proposal,然后使用分类器对每个proposal进行分类。分类之后,后处理精修bounding box的边界,去除重复检测。并依据场景中的其他目标来给boxes重新打分。每个部分都得分开训练,耗时,很难优化。
YOLO: 直接从图像的像素预测边界框和类别概率。如下图:使用一个单独的卷积网络可以同时预测多个bounding boxes和类别概率。
它在整图上进行训练并且直接优化,具有以下三个好处:
- 非常快。把检测问题建模成一个回归问题就无需复杂的pipeline。每秒45帧(更快的版本每秒150帧),在实时应用中没有延时,而且mAP也是别的实时检测系统的两倍。
- YOLO在预测时可以推理整张图片。也就是说,它能够在训练和预测阶段看到整幅图的信息,即包含类别及其外观的语义信息。这是个滑动窗方法不一样的地方。Fast RCNN会把背景误判为目因为他不能看到大的场景信息。YOLO的background error比Fast RCNN少了一半。
- YOLO能够学习到目标更加泛化的特征。当他被应用到新的场景或者输入不寻常的图像时,性能不会垮的很厉害。
总的来说,YOLO的性能比世界领先的目标检测系统的性能还差很多,虽然定位迅速,但是对小目标的定位仍然很困难。
Unnified Detection
首先,把输入图片分为$S\times S$个格子,如果目标的中心落入到一个网格内,则这个网格负责检测该目标。每个网格预测出$B$个bounding boxes和分数,分数反映了这个box包含一个模型的置信度和这个模型预测的准确性。定义置信度为:
$$
Pr(Object)*IOU_{pred}^{truth}
$$
$Pr(Object)$,当边界框包含目标时,为1,不包含目标时,为0.如果那个网格不包含这个目标,则置信度为0,如果包含,则置信度为预测的box和ground truth之间的IOU。
每个bounding box包含5个预测:$x,y,h,w$和confidence。$(x,y)$是box的中心相对于网格的坐标。注意,$(x,y)$是相对于每个单元格左上角坐标点的偏移值,单位是相对于单元格的大小。而边界框的宽高也是相对于整张图片的宽高的比例,这四个值的大小应该都在0-1之间。
每个网格也预测了$C$个条件类别概率,$Pr(Class_i|Object)$ .一个网格不论有多少个$B$boxes,都只预测一组条件类别概率。
测试阶段:
$$
Pr(Class_i|Object)Pr(Object)IOU_{pred}^{truth}=Pr(Class_i)IOU_{pred}^{truth}
$$
*计算每个box的特定类别的分数:该类别出现在这个box内的概率,以及这个box和目标的匹配程度。**
YOLO中,VOC数据集上使用$S=7,B=2,C=20$,最后的预测是一个$7\times 7\times 30$的张量。
Network Design
网络架构受GoogleNet启发,有24个卷积层,接着2个全连接层。对于卷积层,主要使用$1\times 1$的卷积来做channel reduction,然后紧跟着$3\times 3$卷积。如图3:
Training
首先,在ImageNet数据集上预训练前20层卷积层,使用的是Darknet框架。
然后,加了随机初始化的4层卷积层和2个全连接层。检测任务需要精细粒度的视觉信息,因此在检测的时候把网络的输入分辨率从$224\times 224$到$448\times 448$.前向过程如下:
最后一层预测类别概率和bound ing box的坐标。我们把bounding box的宽和高变为占原图的宽高的比例,因此缩放到0到1范围。我们把bounding box的$x$和$y$坐标参数化成特定网格位置的偏移,这样也被限制到了0到1之间。
在最后一层使用一个线性激活函数,其他层都使用leaky rectified线性激活函数:
$$
\phi(x)=\begin {cases}x,if \quad x>0 \ 0.1x,\quad otherwise\end{cases} \qquad(2)
$$
损失函数:
因为将目标检测看成是回归问题,因此采用的是均方误差函数,但是对于不同部分采用不同的权重。首先区分定位误差和分类误差。对于分类误差,即边界框坐标预测误差,对于前者,采用较大的权重值,$\lambda_{coord}=5$.然后区分不包含目标的边界框与含有目标的边界框的置信度。不含有目标,采用较小的权重$\lambda_{noobj}=0.5$,其他权值均设为1.对于边界框预测,同等对待大小不同的边界框,但是实际上小框的坐标误差会比大框的误差更敏感,因此为了保证这一点,将网络的边界框的宽高改为对平方根的预测,即$(x,y,\sqrt{w},\sqrt{h})$的预测。
另外,由于每个单元格预测多个边界框,但是类别只有一个,因此在训练时,如果单元格内确实存在目标,那么只选择与ground truth的IOU最大的那个边界框负责预测该目标,而其他边界框认为不存在目标。
这样设置的一个好处是,一个网格对应的bounding box会更专业,即可以适应不同的大小,纵横比,的目标,从而提升模型性能。
缺点是:如果网格内存在多个目标,那么YOLO只能选取一个来训练。
其中,第一项是边界框的中心坐标误差,$I_{ij}^{obj}$指的是第$i$个单元格存在目标,且该网格中的第$j$个边界框负责预测该目标。第二项是边界框的宽高误差项。第三项是包含目标的边界框的置信度误差项。第四项是不包含边界框的置信度误差项。最后一项是包含目标的单元格的分类误差项,$I_i^{obj}$指的是第$i$个单元格存在目标。
注意:损失函数只惩罚那些grid cell包含目标的分类错误,和预测器负责该groundtruth的时候才惩罚(和ground truth有最高IOU的那个框)的Bbox的坐标误差。
训练细节见原文。
为了防止过拟合,还使用了dropout和数据增强做处理。
Inference
在VOC数据集上,每个图片预测出98个框。使用非极大值抑制进行边界框的剔除。
YOLOvsRCNN
相似:使用卷积网络为每个网格预测可能的bounding box和这些box的分数,
不同:
- YOLO使用了空间约束,能够缓和给同一个目标预测出多个检测的现象。
- 并且YOLO的proposal更少,只有98个每张图,而RCNN有2000个。
- YOLO将独立的部分结合在一起,可以联合优化
Experiment
YOLO的负样本错误率更小,当在Fast RCNN中使用YOLO来去除背景预测后,Fast RCNN性能有提升。
检测结果: