yolo v1 学习与研究

Yolo:

you only look once: unified and real-time object detection

论文链接:
https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdf


一、理解

参考链接:
1、https://blog.csdn.net/tangwei2014/article/details/50915317

2、https://blog.csdn.net/u014380165/article/details/72616238

3、https://zhuanlan.zhihu.com/p/25236464

4、https://zhuanlan.zhihu.com/p/24916786

1、 优点

首先,yolo很快。自从我们重新将检测作为一个回归问题后,我们不需要复杂的过程。在测试图像上只需要运行神经网络就可以预测检测。基本的网络在Titan X GPU上没有使用批处理情况下,每秒运行45帧,一个更快的版本可以达到150。这意味着我们可以实时处理视频流,小于25毫秒的延迟。此外,yolo实现了其他实时检测系统两倍的mAP.

第二,当预测时,yolo在全局上产生推理。这不同于滑动窗口和基于region proposal的方法,yolo在训练的时候已经看了整个图像,测试时可以潜在编码类别的上下文信息、外观信息。fast rcnn,最好的检测方法,经常将背景误识为目标,这是由于他看不到整个文本。yolo相较于fast rcnn,减少了一半的背景误识。

第三,yolo可以学习到目标的泛化表示。当在自然图像上训练,在艺术图上测试时,yolo比DPM和RCNN表现的要好得多。当应用于新的领域或不知道的输入中,yolo其好的泛化能力可以保证系统不会奔溃。

整个系统结构如下:

这里写图片描述

与rcnn、fast rcnn、faster rcnn得到不同之处:(参考于链接中3):

  • YOLO训练和检测均是在一个单独网络中进行。YOLO没有显示地求取region proposal的过程。而rcnn/fast rcnn 采用分离的模块(独立于网络之外的selective search方法)求取候选框(可能会包含物体的矩形区域),训练过程因此也是分成多个模块进行。Faster rcnn使用RPN(region proposal network)卷积网络替代rcnn/fast rcnn的selective search模块,将RPN集成到fast rcnn检测网络中,得到一个统一的检测网络。尽管RPN与fast rcnn共享卷积层,但是在模型训练过程中,需要反复训练RPN网络和fast rcnn网络(注意这两个网络核心卷积层是参数共享的)。
  • YOLO将物体检测作为一个回归问题进行求解,输入图像经过一次inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。而rcnn/fast rcnn/faster rcnn将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding box(回归问题)。

这里写图片描述

2、要解决的问题

当时的目标检测系统大都是基于分类来做,首先需要Seleative search来选出候选框,然后再送入CNN中训练,这种训练比较复杂,不能端到端训练,而且不能实时检测。基于此,作者提出一个基于回归的、端到端训练、只要一个简单的CNN就能实时检测的系统,yolo。

3、解决方法

3.1 输入处理

yolo将输入图像分成S X S个网格,每个网格预测B个bounding box,预测C个类别的概率。在本文中,S=7,B=2,C=20(VOC数据集有20个类别)。

每个bounding box都有5个预测值:x、y、h、w、confidence,x、y是bounding box的中心坐标,相对于网格对齐(与当前网格的偏移值),取值在0-1之间;h、w根据原图像的高宽进行归一化(即除以原图像的高宽),取值在0-1之间。

confidence的定义如下:代表这个bounding box含有目标的置信度和这个bounding box位置预测的准确度。

这里写图片描述

如果网格中没有目标存在,则Pr=0,则confidence score是0;否则的话,Pr=1,confidence score就等于IOU(预测框与真实框的交并比)。怎么判断一个目标是否落在网格中,即这个目标的ground truth的中心坐标落在这个网格中,则这个网格负责预测这个目标,即目标落在网格中(如下图,黄色点所在的网格负责预测狗)。

这里写图片描述

每个网格预测C个类别的概率,即网格在包含目标的情况下该目标属于哪个类别的概率。
这里写图片描述

每个网格只给出一组类别概率预测,这与bounding box的数量无关,即与B无关。(这里注意,一个网格只预测C类概率,是针对网格而言,而confidence是针对bounding box而言。)

这里写图片描述

测试时,将每个bounding box的confidence 与 一组类别概率相乘,即得到每个bounding box输入哪个类别的概率。

即得到每个bounding box属于哪一类的confidence score。也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。

然后过滤掉得分低的bounding box,再使用NMS,最后每个网格最多只预测一个目标。

接下来的操作都是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里面没有物体,跳过即可。(该段文字参考于https://blog.csdn.net/u014380165/article/details/72616238

最后网络输出层一个7*7*(20+5*2)的tensor。

3.2 网络结构

使用了Googlenet的结构,但没有使用inception模块。

这里写图片描述

3.3 损失函数

损失函数如下,

这里写图片描述

  • 只有当某个网格中有object的时候才对classification error进行惩罚。
  • 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。

具体展开:首先采用平方和误差,将定位误差和分类误差整合到一起。但是由于定位误差和分类误差权重不同,很多网格中并没有包含目标,所以设置不同权重,,即5和0.5。

这里写图片描述

这个损失函数一共有5部分组成,其中这里写图片描述 表示是否有目标出现在网格i中,这里写图片描述 表示网格i中第j个bounding box的概率。

第一、二行是定位误差,其中第一行是x、y的坐标误差,即与真实坐标x、y相减取平方和;第二行是h、w的误差,但是这里采用平方根,这么做的原因是相同的高、宽,对于小目标的误差影响要比大目标的误差影响要大,而用平方根会减少这种影响差异。(参考与https://blog.csdn.net/u014380165/article/details/72616238 的解释:举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。 )

第三行和第四行是bounding box的confidence损失,“就像前面所说的,分成grid cell包含与不包含object两种情况。这里注意下因为每个grid cell包含两个bounding box,所以只有当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项。 ”

第五行是预测类别概率误差,当网格包含目标时,前面系数才为1。

参考:


所以具体实现的时候是什么样的过程呢?

训练的时候:输入N个图像,每个图像包含M个object,每个object包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7*7*30大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数的第一、二 、五行。至于第三、四行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了。

测试的时候:输入一张图像,跑到网络的末端得到7*7*30的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。

一个grid cell中是否有object怎么界定?

首先要明白grid cell的含义,以文中7*7为例,这个size其实就是对输入图像(假设是224*224)不断提取特征然后sample得到的(缩小了32倍),然后就是把输入图像划分成7*7个grid cell,这样输入图像中的32个像素点就对应一个grid cell。回归正题,那么我们有每个object的标注信息,也就是知道每个object的中心点坐标在输入图像的哪个位置,那么不就相当于知道了每个object的中心点坐标属于哪个grid cell了吗,而只要object的中心点坐标落在哪个grid cell中,这个object就由哪个grid cell负责预测,也就是该grid cell包含这个object。另外由于一个grid cell会预测两个bounding box,实际上只有一个bounding box是用来预测属于该grid cell的object的,因为这两个bounding box到底哪个来预测呢?答案是:和该object的ground truth的IOU值最大的bounding box。

最后再加一段解释,参考于链接4:

这里写图片描述

  • 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 \lambda_{coord} ,在pascal VOC训练中取5。(上图蓝色框)
  • 对没有object的bbox的confidence loss,赋予小的loss weight,记为 \lambda_{noobj} ,在pascal VOC训练中取0.5。(上图橙色框)

一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。

在测试时,上面提到那个公式用图片表示(同样来自于链接4)

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

4、效果

4.1 实验结果

首先在voc2007数据集上比较了yolo和其他实时检测系统。

为了探讨yolo与rcnn的变体之间的差异,分析了yolo和fast rcnn在voc2007数据集上的错误。

基于不同的错误,我们认为yolo可以用来重新打分fast rcnn检测,减少背景误分的错误,得到一个比较鲁邦的性能。

展示了voc2012的结果并与最先进水平比较mAP。

最后,在两个艺术品数据集上,我们发现yolo在新领域的泛化性能比其他检测器要好。

具体结果可以看后面的原文翻译有结果截图。

4.2 缺点

1、位置定位比较差,对于小目标的检测较差,比如一束花、一群小鸟;
2、虽然降低了背景误检率,但召回率比较低;


二、原文部分翻译

摘要

作者提出一个新的目标检测方法,yolo。先前的目标检测都是转化为分类问题来做,作者将目标检测重新使用回归,在空间上分割bounding box和类别预测概率。一个简单的神经网络预测的目标框和类别预测值可以在一次验证中直接根据整个图像给出。因为整个检测流程是一个简单的网络,因此可以充分利用直接端到端的检测。

这个统一的架构特别快。最基本的YOLO模型可以在一秒实时处理45帧图像,一个更小版本的网络,fast yolo,一秒处理155帧图像,并且实现了其他实时检测器的两倍mAP。与最先进检测系统相比,yolo可能会产生更多的定位错误,但是很低的误检率(将背景预测为目标)。最终,yolo学到目标的泛化表示,它比其他检测方法,如DPM、RCNN,在从自然图像到艺术图像的泛化上表现的更好。

1、Intruduction

人只要看了一眼图像就能快速的知道图像中的目标,是什么,在哪,他们是如何影响的。人类的视觉系统是如此的快而准确,可以花一点注意力就可以驾驶汽车。快又准确的目标检测算法允许计算机在没有检查员的情况下驾驶汽车,使用一些辅助设备实时传递场景信息给用户,对通用目的开放潜能,响应机器人系统。

目前的检测系统都使用分类来做检测。检测一个目标,这些系统使用一个分类器识别目标,并且在一个测试图像中不同的位置和缩放比例验证这个结果。例如deformable parts
models (DPM)使用滑动窗口算法,分类器在整个图均匀的位置分类。

最近的方法,例如RCNN,使用region proposal方法,首先产生一副图像中潜在的bounding box,然后在这些proposal box上运行分类器。在分类完成后,后续处理来微调bounding box,消除重复检测,并且基于场景中的其他目标重新打分。这个复杂的过程很慢且难以优化,因为每个单独的部分必须分开训练。

我们再构造了目标检测,作为一个单一的回归问题,直接从像素中获取候选框和分类预测。使用这个系统,一副图像你只需看一次,就可以知道目标是什么,他们在哪。

这里写图片描述

yolo很简单,如图1所示,一个简单的卷积网络同时预测多个bounding box和他们的分类可能性。yolo在整个图像上运行,并且可以直接优化检测性能。这个统一的模型相对目标检测的传统方法有几点好处:

首先,yolo很快。自从我们重新将检测作为一个回归问题后,我们不需要复杂的过程。在测试图像上只需要运行神经网络就可以预测检测。基本的网络在Titan X GPU上没有使用批处理情况下,每秒运行45帧,一个更快的版本可以达到150。这意味着我们可以实时处理视频流,小于25毫秒的延迟。此外,yolo实现了其他实时检测系统两倍的mAP.

第二,当预测时,yolo在全局上产生推理。这不同于滑动窗口和基于region proposal的方法,yolo在训练的时候已经看了整个图像,测试时可以潜在编码类别的上下文信息、外观信息。fast rcnn,最好的检测方法,经常将背景误识为目标,这是由于他看不到整个文本。yolo相较于fast rcnn,减少了一半的背景误识。

第三,yolo可以学习到目标的泛化表示。当在自然图像上训练,在艺术图上测试时,yolo比DPM和RCNN表现的要好得多。当应用于新的领域或不知道的输入中,yolo其好的泛化能力可以保证系统不会奔溃。

yolo在检测准确率上仍然比不过最先进水平,但是它可以精确地定位一些目标,特别是小的目标,快速给出目标身份,在后续实验中权衡了这些利弊。

2、Unified Detection

在一个简单的卷积网络中统一了目标检测分散的步骤。这个网络使用整幅图的特征来预测每一个bounding box。同时也预测了一幅图的所有类别的所有bounding box。这意味网络对整幅图和图中所有的目标进行了全局推理。yolo端到端训练,实时检测还保证了高AP。

系统将图像分成了S x S网格,如果一个目标的中心落入到一个网格单元中,这个网格单元则负责检测这个目标。

每个网格单元预测B个bounding box和这些box的信任分数。信任分数反映了这个模型对于这个box是否包含了目标以及预测出这个目标是否在正确的信心。正式地,将信心定义为Pr(Object) * IOUtruth_pred .如果一个单元中没有目标,信心分数应该是0.不然我们认为信心分数等于预测框与真实框的交并比。

每个bounding box包含了5个预测值:x,y,w,h,confidence。(x,y)坐标相对于网格单元边界来说box的中心(相对于当前网格单元的偏移值),w和h代表除以整幅图的宽、高后归一化的宽、高,最终信心分数表示预测框和所有真实框之间的IOU。

每个网格单元都预测C个类别的概率,Pr(Classi | Object),这些条件概率是网络单元在包含目标的情况下才有的。对每个网格单元,只预测一组类别概率,不管box的数量B是多少。

在测试时,我们用类别条件概率乘以box的信心预测,

这里写图片描述

对每个box,都给了一个类别依赖信心分数。这些分数同时涵盖了对于box中出现改目标的可能性和和预测框是否完全拟合目标。

在voc数据集上验证yolo,s=7,b=2,c=20(由于一共有20个类别),因此最终预测tensor的大小是7*7*30.

这里写图片描述

2.1 network design

我们在卷积网络上实现这个模型,并且在VOC检测数据集上验证。网络的初始卷积层提取整幅图像的特征,全连接层预测可能性和坐标。

网络结构受图像识别中googlenet启发,一共有24个卷积层和两个全连接层。除了googlenet中使用的inception模块之外,在3X3卷积层后跟了1x1 reduction layer,整个网络结构如图三所示。

这里写图片描述

我们也训练了一个yolo的快速版本,推进快速目标检测的边界。快速yolo使用更少的卷积层(24减少为9)和更少的卷积核。除了网络大小不同,所有训练、测试参数都与yolo一样。

最终网络的输出预测是一个7x7x30的tensor。

2.2 training

在ImageNet1000类别的数据集上进行了预训练。对于预训练,使用了图三中的前20个卷积层,一个平均池化层和一个全连接层。网络训练了一周时间,在ImageNet2012验证集上实现了top5(88%)的效果,与googlenet在caffe上的效果相比。我们使用Darknet框架进行所有的训练和推断。

然后转换网络来进行检测。Ren et al.认为在预训练网络中同时添加卷积和全连接层能够提高性能。跟随他们的例子,我们添加了四个卷积层和两个全连接层,权重随机初始化。检测通常需要细粒度视觉信息,因此我们提高了网络输入的分辨率,从224x224变为448x448.

最后一层同时预测类别可能性和bounding box的坐标。我们利用了图像的宽高归一化了bounding box的宽和高,这样他们的值在0-1之间。我们参数化bounding box的x、y坐标,是与相应的网格单元位置的偏移,因此他们也在0-1之间。

对最后一层使用线性激活函数,其他所有层使用leaky rectified线性激活函数:

这里写图片描述

我们对模型的输出使用平方和误差进行优化。使用平方和误差的原因是它很容易优化,但它与我们的目标,最大化ap并不完全匹配。它对定位错误和分类错误的权重相同,这可能并不理想。此外,在每个图像中,很多网格单元并不包含任何一个目标。这可能使得这些网格单元的信心分数趋于0,对有包含目标的网格单元有压倒性的梯度优势。这可能导致模型不稳定,使得训练过早的偏离。

为了弥补这一点,我们提高了bounding box坐标预测的损失,减少了bounding box不包含目标的信心预测。使用了两个参数来完成,并且设置为:
这里写图片描述

平方和误差同样对大的box和小的box的权重均分,我们的误差度量应该是大box上的偏移要比小box上的偏移要小。为了特别处理,我们预测的是bounding box宽高的平方根而不是高宽本身。

yolo在每个网格单元上预测多个bounding box。在训练时,对每一个目标,我们只想要一个bounding box预测器。我们分配一个预测器来负责预测目标,取决于哪个预测值与ground truth的IOU最高。这就导致了bounding box预测器之间的特别作用。每个预测器在预测特定size、宽高比、或者是目标类别时,都会变得更好,提高了总体的召回。

在训练时我们优化如下,损失函数的多个部分:

这里写图片描述

其中,这里写图片描述表明目标是否出现在单元i中,这里写图片描述表明单元i的第j个bounding box预测器来负责预测。

注意,如果一个目标出现在网格单元中,损失函数只惩罚分类错误(就是前面讨论的条件类别概率)。如果预测器负责ground truth box(在网格单元的所有预产期中它的IOU最大),则损失函数只惩罚bounding box坐标错误。

在训练时我们大约训练了135个epoch,验证数据集来自VOC07和VOC2012.当在voc2012测试时,我们也加入了VOC07的测试集进行训练。整个训练过程batchsize=64,momentum=0.9,decay=0.0005.

学习率的安排如下:对于第一个epoch,将学习率缓慢的从10^-3提高到10^-2,如果开始从高的学习率训练,模型很容易因为梯度不稳定导致偏离。然后使用10^-2训练75个epoch,10^-3训练30个epoch,最后使用10^-4训练30个epoch。

为了避免过拟合,使用了dropout和数据增强。在第一个全连接层后设置0.5的dropout,阻止层间的互相适应。对于数据增强,使用随机裁剪和翻转,相对于原图大小的20%。我们也随机调整了图像的曝光和饱和度,HSV色彩空间中设置factor=1.5。

2.3 inference

就像在训练时一样,在测试图像上预测检测只需要一个模型验证。在VOC数据集上,每个图网络预测98个bounding box,每个box一个类别预测。yolo在测试的时候特别快,只需要一个网络验证,不像那些基于分类的方法。

网格设计促进了bounding box预测的空间多样性,而且很清楚目标落入哪个网格单元,网络对于每个目标只预测一个类别概率。然而,一些大的目标,或者目标靠近多个单元的边界,可能被多个单元定位。非极大抑制可以用来处理多个检测。相对于DPM和RCNN,非极大抑制可以提到2-3%mAP,虽然这不是关键的性能提升。

2.4 limitations of yolo

Yolo在bounding box的预测上加了很强的空间约束,每个网格单元只预测两个box和一个类别。空间约束限制了模型可以预测的临近目标的数量。例如处理那些出现一组的小目标,例如一群鸟。

尽管模型从数据中学习到预测bounding box,它对于新的或易于寻常的宽高比或配置的目标,很难泛化。由于网络架构对输入图像有多个下采样层,我们的模型使用了相对粗糙的特征预测bounding box。

最后,尽管我们训练了一个损失函数可以近似逼近检测性能,损失函数对于小bounding box和大bounding box的error一样。大bounding box上的小error通常是良性的,但小bounding box上的小error对IOU就会有比较大的影响。我们错误的主要来源就是错误的定位。

3、Comparison to other detection systems

目标检测是计算机视觉的核心问题。检测方法开始时通常是从输入图像中提取一组比较鲁邦的特征(如haar、sift、HOG、卷积特征),然后分类器或定位器用来在特征空间中鉴定目标。这些分类器或定位器在整幅图的滑动窗口或图的子区域上运行。我们将yolo检测系统与其他几个顶级的检测框架进行了比较,并指出关键的异同。

Deformable part models.

R-CNN.

other Fast detector.

4、Experiments

首先在voc2007数据集上比较了yolo和其他实时检测系统。为了探讨yolo与rcnn的变体之间的差异,我们分析了yolo和fast rcnn在voc2007数据集上的错误。基于不同的错误,我们认为yolo可以用来重新打分fast rcnn检测,减少背景误分的错误,得到一个比较鲁邦的性能。我们也展示了voc2012的结果并与最先进水平比较mAP。最后,在两个艺术品数据集上,我们发现yolo在新领域的泛化性能比其他检测器要好。

4.1 Comparison to other real-time systems

这里写图片描述

4.2 voc2007 error analysis

这里写图片描述

4.3 combining fast rcnn and yolo

这里写图片描述

4.4 voc2012 results

这里写图片描述

4.5 generalizability: person detection in artwork

这里写图片描述

5、real-time detection in the wild

这里写图片描述

6、conclusion

我们介绍了检测系统一个统一的模型,yolo。构建模型很简单,可以直接在图像上训练。不同于那些基于分类的方法,yolo直接在与检测性能相联系的损失函数上直接训练,整个模型共同训练。

fast yolo是一个快速的多目的的目标检测。yolo推进了实时目标检测的最先进水平。yolo在新领域也能泛化的很好,由于其快速、强的检测。

猜你喜欢

转载自blog.csdn.net/liuxiao214/article/details/80892954