YOLO(You Only LOOK Once)论文详读

Abstract

       在此之前的方法是把分类器classifier用以进行执行检测任务。
       本文把目标检测视作回归问题,来把边界框和相关的类别概率进行空间分离。因为YOLO使用单一网络,从整幅图像中一次性同时完成预测边界框和生成类别概率的任务,从而可以在执行检测时进行端到端的优化。

现有的检测算法都是使用分类器进行目标检测的。

       为了检测目标,为目标制定一个分类器,并在测试图像中从不同的位置和不同的尺度对其进行评估。
       DPM方法使用滑动窗口的方法,所以分类器可以运行在整个图像的所有的空间位置。
       RCNN使用候选区域的方法,首先在图像中生成潜在的边界框,然后使用分类器对这些边界框进行分类,分类后对边界框进行微调,消除重复的边界框,并根据场景中其他的对象对边界框进行重新打分。这种方法速度慢且难以进行优化,因为每个独立的功能模块都需要分别进行训练。

YOLO

       YOLO把之前检测网络中分离的各个功能组件放在一个网络中,使用来自整幅图像的特征,通过网络在预测多尺寸的边界框的同时生成对应的类别概率,因为直接训练整个图像,所以可以直接优化检测性能,这种设计使得模型可以进行端到端的训练,从而可以得到较高的平均准确率。

YOLO的步骤:

在这里插入图片描述

YOLO模型实现步骤

  1. 把整幅图像分割成S×S个网格,如果某个网格中有目标对象,则该网格在检测该目标的过程中起到重要作用。
  2. 每一个网格生成B个边界框,对这些边界框对应生成置信度(confidence score置信度:反映了模型对该边框包含目标的信心和该边框预测的准确率,置信度的计算公式为 P (object)× IOU,P(object)是该边框包含目标对象的概率,IOU是预测的边界框与ground-troth的IOU值;如果该边框内不含有目标,则置信度为0)。一般是把置信度等于IOU
    每个边界框包含五个预测值(x, y, w, h, confidence),(x, y)是边框中心点的坐标,(w, h)是宽和高,confidence是ground-truth与预测的边界框的IOU值。
    每个网格同时预测得到C个条件概率P(class-i | object),这些条件概率表示该网格包含目标对象的概率(因为数据集中共C类,所以需要预测C个条件概率)。针对每个网格仅预测一组(C个)类别概率,而不是考虑B个边界框,从而速度更快。

       测试时,把类别条件概率和每个边界框的置信度相乘,从而得到每个边框特定类别的置信度,这些置信度反映了该类别目标出现在边框中的概率P(class-i)和预测结果与目标对象的契合度IOU。
在这里插入图片描述

       对于PASCAL VOC数据集,设S=7B=2,因为数据集有20类,所以C=20,卷积网络最后输出一个7×7×(2×5+20)Tensor(计算公式为S×S×(B×5+C))。

YOLO方法的特点:

  1. 速度快。因为把检测任务视为回归问题,从而不需要复杂的流程。因为可以达到45fps,最快可以达到155fps,从而可以对流媒体进行低于25ms延迟的实时处理。除此之外,YOLO具有比其他实时处理的系统高两倍的平均精度。
  2. 因为YOLO针对整个图片进行处理,所以比其他的方法拥有更多的关于类别的上下文信息。正是因为Fast RCNN不能获取到大面积的上下文,所以会在图像上产生大量错误背景正样本(把背景区域识别为目标对象的正样本),YOLO方法比Fast RCNN减少近一半数量的背景正样本错误。
  3. YOLO学习的都是样本的通用表现形式。正是因为高度的generalizable使得YOLO在遇到新类型的对象或unexcepted 输入时不会轻易break down
  4. 除此之外,YOLO准确率也比其他方法高很多,但是YOLO对精确定位某些对象(正如前文中提到的,YOLO会产生较多的定位错误),尤其是针对一些小尺寸的对象很吃力

YOLO网络模型

       使用卷积层从整个图像中提取特征,使用全连接层来预测、输出概率和坐标值。
基础的YOLO模型有24个卷积层、2个全连接层。使用1×1的卷积层,然后加上3×3的卷积层来替代原本Google Net使用的卷积计算方式。
       Fast YOLO模型有9个卷积层、2个全连接层,不过每个卷积层的filter要比基础YOLO模型小很多除了模型尺寸不一样,Fast YOLO模型和基础YOLO模型所有的训练参数、测试参数都是一样的
在这里插入图片描述

YOLO网络模型

网络模型结构

01——Conv2D(filter=64, kernel_size=(7,7), strides=(2,2))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

02——Conv2D(filter=192, kernel_size= (3,3))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

03——Conv2D(filter=128, kernel_size= (1,1))
04——Conv2D(filter=256, kernel_size= (3,3))
05——Conv2D(filter=256, kernel_size= (1,1))
06——Conv2D(filter=512, kernel_size= (3,3))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

07——Conv2D(filter=256, kernel_size= (1,1))
08——Conv2D(filter=512, kernel_size= (3,3))
09——Conv2D(filter=256, kernel_size= (1,1))
10——Conv2D(filter=512, kernel_size= (3,3))
11——Conv2D(filter=256, kernel_size= (1,1))
12——Conv2D(filter=512, kernel_size= (3,3))
13——Conv2D(filter=256, kernel_size= (1,1))
14——Conv2D(filter=512, kernel_size= (3,3))
15——Conv2D(filter=512, kernel_size= (1,1))
16——Conv2D(filter=1024, kernel_size= (3,3))
Maxpool2D(kernel_size= (2,2), strides= (2,2))

17——Conv2D(filter=512, kernel_size= (1,1))
18——Conv2D(filter=1024, kernel_size= (3,3))
19——Conv2D(filter=512, kernel_size= (1,1))
20——Conv2D(filter=1024, kernel_size= (3,3))
21——Conv2D(filter=1024, kernel_size= (3,3))
22——Conv2D(filter=1024, kernel_size= (3,3), strides= (2,2))

23——Conv2D(filter=1024, kernel_size= (3,3))
24——Conv2D(filter=1024, kernel_size= (3,3))

FC(1024, 4096)
FC(4096, 30)

       在使用YOLO进行目标检测时发现,增加卷积层层数和全连接层层数可以提升表现,原因是进行目标检测时经常需要细粒度的视觉信息,所以增加了模型的输入分辨率——输入的大小从224×224增加至448×448
       因为最后一层的全连接层输出类别概率和边界框的坐标值,所以使用输入图像的长和宽正则化边界框的长和宽,从而使得他们的值都位于0-1之间,然后参数化边界框的x,y坐标为特定网格位置的偏移量,也使得他们的值位于0-1之间
       除了最后一层全连接层使用线性激活函数,其余层使用下面的leaky 线性纠正激活函数
在这里插入图片描述

       YOLO模型使用误差平方和(sum of squared error),因为误差平方和易于优化,但是它并不符合实现最大平均准确度的目标。因为误差平方和会对定位误差进行加权,导致分类误差并不理想
       因为每个图像中都会有很多的网格内不含有目标对象,所以这些网格的置信度为0且数量总是压倒性的超过包含对象的网格,从而导致训练时结果很快就发散了
       为了补救这一问题,增加来自边界框坐标预测的损失,减少针对不包含对象的边框置信度预测的损失,使用两个参数来实现——λcoord=5和λnoobj=0.5在这里插入图片描述

损失函数

       其中obji表示目标对象出现在网格i中objij表示边框中的第j个边框对该目标对象的预测结果起决定性作用(即第j个边框包含目标对象)

       误差平方和会对大尺寸边框、小尺寸边框同时进行加权,误差度量应该重点关注大边框中的偏差而不是小边框中的(同样一个小的误差在大尺寸边框内不起眼,但是会在小尺寸边框中对结果产生巨大的影响)。所以使用边界框的宽和高的平方根√w 、√h来替代原有的边界框的宽w和高h
       YOLO会在一个网格中预测多个边界框,训练时,想要一个边界框预测器负责一个目标,所以通过当前的IOU值使用预测器进行预测。这样使得预测器在预测尺寸、长宽比或目标类别时做的更好,从而提升了整体的性能。

本文的训练在PASCAL VOC2007 和2012的训练过程:

       迭代135次,数据集使用PASCAL VOC2007和2012,batch=64,decay=0.0005,momentum=0.9
       第一次迭代学习率从0.0001缓慢上升到0.001,然后使用0.01训练75次,0.001训练30次,0.0001训练30次。
       为了防止过拟合,使用dropout(参数值设为0.5)和多种类型的数据增强。数据增强使用随机尺寸缩放和旋转,还有变化图像的曝光饱和度

YOLO的不足之处:

       因为网格方法的引入,使得可以在边界框上执行分类。一般情况下,可以清晰的分析出哪个边界框内含有目标,并且网络对于一种目标只需要预测一个边框。针对一些大尺寸的目标对象,或是一些靠近多个边框的目标对象,可以通过非极大值抑制方法,由多个网格来确定它的位置。
       因为YOLO对边界框的空间限制,导致每个网格只能预测两个边界框,并且只能得到一类结果,从而限制了模型预测目标对象的数量。所以YOLO对出现在团体中的小尺寸的目标难以进行预测,比如成群的鸟。
       因为模型是从指定的数据集中学会预测的,所以对于新类型的目标对象、非普遍的大小的图像,很难对其进行精准预测
       因为模型中含有多个下采样层,所以模型使用比较粗糙的特征进行预测
       因为模型的损失函数对大边界框和小边界框中的错误一视同仁,而同样一个小错误在大边界框中很普遍,但是在小边界框中会对IOU产生巨大影响,所以本算法的error主要是localizations error
在这里插入图片描述

       从图中可以看出YOLO方法的定位错误比较多Fast RCNN中出现的背景错误比较多,所以使用YOLO来评估Fast RCNN的背景检测结果,可以减少把背景误判为正样本的error,从而使Fast RCNN的性能得到显著提升
在这里插入图片描述

       因为是把两部分分别进行训练然后结合到一起,所以YOLO速度快的特点并没有在结合方法中体现,但还是因为YOLO速度快的特点,所以结合的方法也没有在原本Fast RCNN算法上添加运行时间。

与其他方法的对比

        DPM使用滑动窗口进行目标检测,使用分离的步骤分别进行提取固定的特征、区域分类、预测边界框的功能。
       一些基于DPM的方法,加快了HOG的计算速度,使用级联结构,并在GPU上进行计算,即便这样,也只有30HZ的DPM可以进行实时处理
       YOLO是把这些步骤压缩在一个网络中进行并发进行,网络不使用固定的特征,而是针对特征进行在线训练,根据检测任务对其进行优化。YOLO更快更准确。

       RCNN及其变形的算法是通过候选区域代替滑动窗口的作用。使用Selective Search的方法生成边界框,使用卷积提取特征,然后使用SVM进行打分,使用线性的模型对边界框进行调整,最后使用非极大值抑制消除重复的边界框。但是RCNN的每个步骤都需要分别进行训练,测试时每张图片的耗时在40s左右。
       YOLO在每个网格中使用卷积网络生成边界框并进行打分,但是由于YOLO对网格的空间限制,使得对同一对象重复检测的情况得以缓解。因为只在一张图片中生成98个边界框,使得速度得以加快。YOLO的所有步骤都在一个网络中完成,所以易于优化。
       Fast RCNN和Faster RCNN是在RCNN的基础上针对速度进行优化的方案,通过共享计算结果、使用神经网络生成候选区域替代原本的SS方法,提升了准确率和速度。

       Deep Multi box使用卷积网络生成ROI,使用单一类别预测替代置信度预测方法。但是Multi Box只是检测的一部分,还需要再进行分类操作。

       OverFeat使用卷积网络训练一个定位器,然后使用定位器进行检测。OverFeat同样是使用滑动窗口进行检测,但它也只是检测的一部分。Over Feat只优化定位功能,而不是检测性能。与DPM一样,OverFeat的定位器预测时只能看到位置信息,不能对全局上下文进行推理,所以需要大量的后续处理才能得到完整、一致的检测结果

       MultiGrasp只需要对图像包含的每一个对象预测一个单一的抓取区域,不需要对检测对象的尺寸、位置、边界框进行估计,也不需要对其进行分类。
       YOLO是对多检测对象、多类别同时预测边界框和类别概率。

       RCNN minus R方法将RCNN中的Selective Search替换为静态的候选边界框,速度更快了,但速度还是达不到实时处理的水平,并且可能会因为获取不到好位置的边界框从而影响准确度。

猜你喜欢

转载自blog.csdn.net/weixin_41963310/article/details/109696160