YOLOv1 论文精读

摘要

        我们提出了YOLO,这是一个目标检测的新方法。目标检测领域的以往工作就是对分类器稍加调整以用于检测。相反,我们是将目标检测视为一个回归问题,这个问题是得到空间上分离的包围框(bounding boxes)以及和这些框相联系的类别概率。一个单独的神经网络就可以在一次评估中直接从整幅图像中预测bounding boxes以及对应的类别概率。由于整个检测的流程是在一个单独的网络中完成的,它能够依靠检测的表现结果进行端到端的直接优化。

依靠检测的表现结果进行端到端的直接优化:个人理解指的就是我们可以依靠检测结果与实际标签的误差loss直接对特征提取和预测的两部分进行优化,而对于那些非端到端的网络(R-CNN系列)是没有办法直接进行端到端的优化。

所谓端到端,一端是输入,一端是输出,在YOLO里,图像经过网络直接得到预测结果。而在R-CNN里,输入首先通过RPN网络得到建议框(proposal region),而后对这些建议框进行分类,并不是直接通过网络得到输出。

        我们整体的架构是非常快的。我们的基础YOLO模型能够以45f/s的帧率实时地处理图片。我们还有一个该网络的更小的版本Fast YOLO,能够以155f/s的惊人速度处理图片,同时还能保持着两倍于其他实时检测器mAP的性能。与最先进的检测系统相比,YOLO在定位上会犯更多的错,但是它不太可能会预测出背景上的假阳例(FP,将背景预测为物体)。最后,YOLO学习到非常一般化的目标描述。当我们想要从自然图片泛化到其他领域如艺术画的时候,YOLO比其他的检测方法优秀,这些其他方法包括DPM和R-CNN。

mAP是目标检测领域的一个重要指标,在说mAP之前还需要普及一些概念:

TP:真阳例,表示预测为正样本,且预测对了。-实际为物体。

FP:假阳例,表示预测为正样本,且预测错了-实际为背景。

TN:真阴例表示预测为负样本,且预测对了。-实际为背景。

FN:假阴例表示预测为负样本,且预测错了。-实际为物体。

在目标检测领域,正样本指的是物体,负样本指的是背景。我们再引入精确率和召回率的定义,注意在目标检测领域,我们重点关注的是对正样本(物体)的预测:

召回率:所有的实际物体,被预测出来多少,即

 recall = \frac{TP}{TP+FN}

精确率:预测为正样本的预测结果中,有多少预测是对的,即

precision = \frac{TP}{TP+FP}

我们可以计算出多组recall-precision数据点,以recall和precision分别为横纵坐标可以得到p-r曲线图,曲线下的积分即为当前类别的AP值。对所有类别的AP值取均值就是mAP。

注:AP图一般保持单调递减趋势,理由如下。考虑极端情况,当我们将所有的框都当成预测框的时候,此时检出率会达到最大,但显然相应的精确率会变得很低(预测的框越多,被检出的框至少不可能变少)。而当检出框的数量降低时,误检框的数量也在降低,同时对于VOC数据集的一副图片来说,目标相对于框的个数要少的多,因此精确率存在很大的上升可能性,但不是绝对上升。因此在计算mAP的时候,会做一个修正,以保证recall单调不减的同时,precision单调不增。

    @staticmethod
    def CalculateAveragePrecision(rec, prec):
        mrec = []
        mrec.append(0)
        [mrec.append(e) for e in rec]
        mrec.append(1)
        mpre = []
        mpre.append(0)
        [mpre.append(e) for e in prec]
        mpre.append(0)

        for i in range(len(mpre) - 1, 0, -1):
            mpre[i - 1] = max(mpre[i - 1], mpre[i])#修正 保证precision单调不增
        ii = []
        for i in range(len(mrec) - 1):
            if mrec[i+1] != mrec[i]:
                ii.append(i + 1)#按照recall的值对数据点去重
        ap = 0
        for i in ii:
            ap = ap + np.sum((mrec[i] - mrec[i - 1]) * mpre[i])
        return [ap, mpre[0:len(mpre) - 1], mrec[0:len(mpre) - 1], ii]

注意,本人发现很多地方有说是枚举置信度,以0.5~0.95以0.05为增长步幅,取改变预测出的框的个数。但是我读了源码发现官方实现并不是枚举置信度,而是采用逐步增加预测框个数来计算不同的p-r点值。

    def GetPascalVOCMetrics(self,
                            cfg,
                            classes, 
                            gt_boxes,
                            num_pos,
                            det_boxes):

        ret = []
        groundTruths = []
        detections = []
        
        for c in classes:
            dects = det_boxes[c]#与类别对应的 [det_box] det_box:[left, top, right, bottom, score, nameOfImage]
            gt_class = gt_boxes[c]#{nameOfImage:[ground_box]}:[left, top, right, bottom, 0]
            npos = num_pos[c]#类别c的ground_box 总数
            dects = sorted(dects, key=lambda conf: conf[4], reverse=True)#按照置信度排序
            TP = np.zeros(len(dects))
            FP = np.zeros(len(dects))
                
            for d in range(len(dects)):

                iouMax = sys.float_info.min
                if dects[d][-1] in gt_class:#det预测在 dects[d][-1](图片名) 中存在类别为c的物体
                    for j in range(len(gt_class[dects[d][-1]])):#遍历该图片拥有的ground_boxes
                        iou = Evaluator.iou(dects[d][:4], gt_class[dects[d][-1]][j][:4])
                        if iou > iouMax:
                            iouMax = iou
                            jmax = j

                    if iouMax >= cfg['iouThreshold']:#最大iou大于阈值 
                        if gt_class[dects[d][-1]][jmax][4] == 0:#如果没有被使用
                            TP[d] = 1
                            gt_class[dects[d][-1]][jmax][4] == 1

                        else:#如果已经被使用
                            FP[d] = 1
                    else:#如果最大iou值不满足阈值
                        FP[d] = 1
                else:#如果该图片名不存在c类别的ground_box,属于错误预测为c类 是FP
                    FP[d] = 1
            
            acc_FP = np.cumsum(FP)
            acc_TP = np.cumsum(TP)
            rec = acc_TP / npos
            prec = np.divide(acc_TP, (acc_FP + acc_TP))
            print(acc_FP)
            print(acc_TP)
            [ap, mpre, mrec, ii] = Evaluator.CalculateAveragePrecision(rec, prec)
            r = {
                'class': c,
                'precision': prec,
                'recall': rec,
                'AP': ap,
                'interpolated precision': mpre,
                'interpolated recall': mrec,
                'total positives': npos,
                'total TP': np.sum(TP),
                'total FP': np.sum(FP),
            }
            ret.append(r)
        return ret, classes

在这段代码中,TP[i]表示第i个预测框是否是TP,取0表示不是,取1表示是。FP同理。注意代码:

            acc_FP = np.cumsum(FP)
            acc_TP = np.cumsum(TP)

cumsun()函数作用于列表,操作时对于原列表list,操作后的结果为:

list[i]'=\sum_{j=0}^{i}list[i]

我们可以明白i越大,代表相应的预测框越多,于是通过i的不断增大,放出来的预测框越来越多,我们可以得到多组p-r值。另外需要注意的是,预测框是按照置信度排序的,我们会优先为有最高置信度的预测框找到匹配的真实框。

置于上面所说的枚举0.5~0.95,枚举的并不是置信度,而是IoU阈值,对应的有两种mAP指标,为mAP@0.5与mAP@0.5:0.95。mAP@0.5就是说在判定是否预测正确时,我们的IoU阈值设定为0.5。mAP@0.5:0.95就是说分别以0.5、0.55、、、、、、0.95为IoU阈值,得到这10情况下的mAP平均值,作为我们需要求的mAP值。

理论上说,mAP@0.5是我们常用的指标,mAP@0.5:0.95太过严格且的确存在一定的不合理性,IoU这个东西,对于人类来说其实并不敏感,尤其是IoU阈值为0.95,这个指标实在是太过严格。

1.引言

        人类仅仅瞥一眼图像就可以立刻知道图片里有什么物体,他们在图片中的哪里并且他们是如何交互的(这边的交互大概说的是图像中物体的相对位置信息)。人类的视觉系统是快而精确的,这允许我们能够完成类似于用很少的意识思维就能够驾驶则养的复杂任务。快而精确的目标检测算法将允许计算机不需要特殊的传感器就可以驾驶,允许人类辅助设备为人类使用者传达实时场景信息,并且解锁可万用的响应式机器人系统的潜力。

        当前的检测系统是对分类器进行稍微的改动来进行检测。为了检测一个物体,这些系统在一张测试图片上为那个物体准备了一个分类器并且评估这个物体的各种位置和大小。类似于可变部分模型(DPM)使用滑动窗口的方法,分类器运行在这个滑动窗口以等间距在这个图片上滑动时所包含的区域上。

DPM使用滑动窗口的思想对整幅图像进行遍历,同时为了适配多种尺度大小的目标,滑动窗口本身还有多种大小尺度。每次将滑动窗口所包含的区域经过特征提取+分类得到类别的判定。

        更现代的方法像R-CNN使用区域建议的方法去首先产生图片上可能的bounding boxes,然后对这些建议框运行分类器(进行类别的判定)。经过分类后,后处理被用来对这些bounding boxes进行精修,去除重复的检测结果,并且以场景中的其他物体信息为基础为boxes重新打分。这些复杂的流程时很慢且难以优化的,这是因为每一个组件必须被分开单独训练(即是说不能够想YOLO一样做到端到端)。

图1:YOLO检测系统。使用YOLO处理图片是简单而直接的。我们的系统

(1)将输入图片的尺度调整到448*448

(2)对这个图片运行了一个单一的卷积网络

(3)使用模型的置信度对检测结果以是否大于阈值的方式进行筛选

        我们将目标检测重新制定为一个单独的回归问题,直接从图像的像素去预测bounding boxes的坐标和类别概率。使用我们的系统,你进需要看一次(YOLO)图片就可以预测出图片上呈现了哪些物体且他们在哪里。

         YOLO是非常简单的:看图1。一个卷积网络同时预测多个bounding boxes以及这些boxes所对应的类别概率(实际上YOLO将图片分为多个grid cell,每一个cell预测B个bounding boxes,bounding boxes里只预测位置,类别概率与cell绑定。作者之所以说是bounding box的类别概率因为,我们在产生结果的时候,对于定位结果选取的是每一个cell里置信度最高的那个bounding box,配合上cell预测出的类别概率才是最终的结果,因此虽然有98个定位的框,但是实际上最终有效的只有49个)。YOLO训练在整幅图像上,并且直接优化检测性能。这个统一的模型相比于传统的目标检测方法有一些更好的地方。

         首先,YOLO非常快。由于我们将检测视为回归问题,因此我们不需要复杂的流程。在测试的时候,我们直接在一张新图片上运行我们的网络来检测目标。我们的基础版网络在没有批处理的情况下能够以45f/s的帧率运行在Titan X GPU上,并且一个更快版本的Fast YOLO能够超过150f/s。这意味着我们能够以小于25毫秒的延迟实时处理视频流数据。而且,YOLO的平均精度(mAP)是其他实时系统的两倍。我们的系统实时监测webcam的例子请观看我们的项目网页:http://pjreddie.com/yolo/。

        第二,YOLO使用图片的全局信息来进行推理(全局推理的意义在于,有时候我们需要单独识别物体是非常困难的,但是配合图像中的其他上下文信息如背景、其他物体等,会为我们提供更多的信息)。不同于滑动窗口和基于区域建议的那些方法,YOLO在训练和测试时看了整副图像,所以它毫无保留(完全)编码了关于物体类别和其位置的上下文信息。Fast R-CNN,一个顶尖的检测方法,就是因为没有更大的上下文信息,因此才会经常犯将图片中的背景块当成物体的错误。相比于Fast R-CNN,YOLO犯这种错的数量少于Fast R-CNN的一半。

        第三,YOLO可以学习到物体的一般化描述(这里想说YOLO的泛化性很好)。当使用自然图片训练、用艺术画作测试时,YOLO表现地比顶尖的检测方法如DPM和R-CNN好得多。由于YOLO具有高度的泛化性,因此当被运用于新的领域或者未曾料想到的输入时它不太可能失灵。(总之就是在说YOLO的泛化性狠好)。

        YOLO在精度上仍然落后于最先进的检测系统。然而它可以快速地识别出图片中的物体,也努力地准确定位一些物体,特别是对于那些小物体(目标检测领域,一般认为在原图上32*32的物体是小物体)。我们在实验中进一步测试了精度与速度的权衡。

        我们的训练和测试代码都是开源的。许多的预训练模型都是可以获取并下载的。

 2.统一检测

        我们将用于目标检测的相互分离的组件整合进了一个神经网络里(这里是和two-stage方法比较)。我们的网络使用来自于整幅图像的特征预测每一个bounding box。它为一幅图像同时预测所有的bounding boxes以及相应的类别。这意味着我们的网络使用整幅图像以及图像中物体的信息进行推理。YOLO的设计使得在保持较高的平均精度下进行端到端的训练以及实时的检测速度成为可能。

        我们的系统将输入图像分割成S*S的格子。如果一个物体的中心落在一个grid cell内,那么这个grid cell就负责预测这个物体(在YOLO的实现中,只考虑一个cell只有一个物体的情况)。 

        每一个grid cell预测B个bounding boxes,并且为每一个box都预测了置信度分数。这些置信度分数反映了模型认为当前box内包含物体的置信度(可信度)以及这个box的预测结果有多精确。我们将置信度分数正式定义为:

Pr(Object)*IOU_{pred}^{truth}

如果cell内没有物体,那么这个cell预测出的两个box的置信度分数应该是0。否则我们想要置信度分数等于预测框(bounding box)与真实标签(truth label)的交兵比值(IOU)。

作者此处说的对置信度分数的定义实际上指的是训练时置信度分数的标签值。

         每一个bounding box包含5个预测值:x、y、w、h、confidence。(x,y)这一对坐标值表示box的中心相对于grid cell边界的相对值(一般取相对于左上角的相对值)。预测的高度和宽度是相对于整幅图像的相对值。最后置信度预测值代表的是预测框与真实框的IOU值。

x=(t_x-gird_x) / grid_{width}

y=(offset_y-grid_y)/grid_{height}

w=t_w/img_{width}

h=t_h/img_{height}

         每一个grid cell都预测C个条件类别概率Pr(Class_i|Object)。这些概率是在grid cell含有物体时的条件概率。我们只对每一个grid cell一组类别概率,而不管每一个cell预测的bounding boxes的数量。

也就是说,在YOLO里,考虑到每一个cell里只有一个物体的情况,类别概率由cell负责,定位由bounding box负责,依此完成类别预测与定位预测的解耦,也能节省资源占用。毕竟每个cell只有一个物体的话就不需要多个类被概率,剩下的资源可以多开几个bounding boxes,以提高定位性能。

        在测试阶段我们将条件类别概率与每个box预测出来的置信度相乘得到最终的实际类被概率:

这将给我们每一个box的特定类别的置信度分数。这些分数的编码同时含有当前类别出现在这个box内的概率已经这个预测狂有多贴合这个物体(预测框与物体有多接近)。

 图2:模型。我们的系统将检测建模为一个回归问题。它将图片分成S*S个gird cell且每一个gird cell预测B个bounding boxes,这些boxes的置信度已经C个类别概率。这些预测被编码成S*S*(B*5+C)的张量。

此处应该有输出张量的示意图~~(累了,先睡一觉QAQ)

 2.1 网络设计

        我们将模型实现为卷积神经为网络并且在PASCAL VOC检测数据集上评估它的性能。最初的一些卷积层是网络从图像中提取特征的部分,全连接层部分用于预测概率和坐标的输出。

        我们的网络结构受到了用于图像分类的GoogLeNet的启发。我们的网络有24层卷积层,后面接上2层全连接层。不同于GoogLeNet使用的inception模块,我们仅仅在3*3的卷积层后使用1*1的降维层,类似于Lin[22]中做的那样。完整的网络如图3所示。

         我们也训练了一个YOLO的快速版本,这个版本是被设计用来进行快速目标检测的定位。Fast YOLO使用的神经网络只有少许的卷积层(是9层而不是24层),并且每一层的过滤器数量更少(即卷积后输出的通道数更少)。除了网络的大小之外,YOLO和Fast YOLO的所有的训练和测试参数都相同。

 图3:结构。我们的检测网络有24层卷积层后接2层全连接构成。交替使用1*1卷积层来减小来自于前层的特征空间(缩减通道数,进行特征压缩)。我们以网络输入分辨率的一般(224*244)利用ImageNet的分类任务对卷积层进行了预训练,当为检测训练时,我们再将输入分辨率的宽高各放大两倍。

1*1卷积进行特征压缩:个人理解为由于我们不知道每一层特征提取后适合输出多少种特征,因此我们需要做的是尽可能使用多个通道,宁多不少,但过多的特征通道可能会导致特征冗余,如A特征+B特征可以推出C特征,这种时候用1*1即强迫网络使用更少的通道,那么网络就有可能在前面提取出的特征的基础上进行去冗余,同时也有可能将低级特征组合为高级特征以达到降维的目的。

 2.2 训练

         我们在ImageNet的1000分类的竞赛数据集上预训练我们的卷积层。我们使用图3所示的网络的前20层卷积层后接上一个平均池化层和一个全连接层构成网络来进行预训练,相当于对最终的YOLO网络的前20层卷积进行预训练。我们训练了这个网络大约一周,并且在对ImageNet 2012 验证数据集的single crop测试中获得了top-5精确率88%的成绩,这与Caffe's Model Zoo实现的GoogLeNet性能相当。我们使用Darknet框架完成全部的训练和推理。

single crop测试:通常是指在测试过程中,将图像resize到某个尺度(比如256x256),选择其中的Center Crop(即图像正中间区域,比如224x224),作为CNN的输入,用于图像的测试,判断其分类结果的正确性。

         然后我们将预训练的模型转换到检测上。Ren et al. 表明对预训练模型增加卷积层和全连接层都能够提升性能。依照他们的方法,我们增加了4个卷积层和两个全连接层,并且对这些新增加的层的权重进行随机初始化。检测任务通常需要细粒度的视觉信息,因此我们将网络的输入图片分辨率从224*224提高到448*448。

         我们最后的层预测类别概率和bounding box的位置。我们使用图片的宽高对bounding box的宽高进行归一化,因此预测结果的宽高值落在[0,1]上。我们将x,y坐标参数化为相对于特定grid cell的位置的偏移,所以他们的值也是落在[0,1]上。

 x=(t_x-gird_x) / grid_{width}

y=(offset_y-grid_y)/grid_{height}

w=t_w/img_{width}

h=t_h/img_{height}

        我们对最后一层使用线性激活函数并且其他层使用如下得带泄露的矫正线性激活:

          我们在模型的输出端对和平方差误差损失进行优化。我们使用和平方差误差损失是因为它易于优化,但它并不能够完美地和我们最大化平均精度的目标相一致。它将定位误差与分类误差同等看待,但这可能不是完美的方式。并且,在每一张图片上,有很多的grid cells不含有任何物体。而我们的网络会将这些不含有物体的cells的bonding boxes的置信度分数向0推进(这些负样本的置信度分数值以0为label值进行优化),但由于这些cell的数量过多,会导致这一部分带来的梯度要远大于那些包含物体的cells提供的置信度分数的梯度。这可能导致网络的不稳定,因此训练的早期发散。

收敛与发散:收敛的表现之一就是loss下降到足够小且已经不太能够继续下降,即可以理解为网络按照我们的训练方式(由loss funciton规定)获得了我们需要的模式。发散就是网络没有按照我们的目标去优化,导致模型的loss增大而不下降。

在目标检测中,我们更看重的是模型对正样本的检出和正确判别,对于负样本实际上是不太关注的,因此如果负样本的权重过大,则会导致网络偏向于学习负样本的判别,但不具备识别出正样本的能力。

        为了改进这个缺陷,我们增加了来自于bounding box定位预测的损失,降低了来自于那些不包含物体的bounding box的置信度预测值的损失。我们使用两个参数\lambda_{coord}\lambda_{noobj}来完成这两部分的loss值的权衡。 我们设置\lambda_{coord}=5,\lambda_{noobj}=0.5

         和方差误差以同样的方式衡量的大框和小框的误差。我们对于错误的度量(loss function)应该反应出来一件事:大框上的小偏离对效果的影响比小物体上的小偏离的影响小。为了一定程度上缓解这个问题,我们直接预测了bounding box宽高的平方根而不是宽高。

这里作者想说的应该是在损失函数部分,为了权衡同一个偏移对大物体和小物体的不同影响,因此对预测的宽高做了开方处理,标签也相应开方处理,之后对两个开方结果计算loss。通过开方的方式,变相拉高误差对于小物体的权重。

举个例子,假设现在有小误差5,小框为16,大框为49,即小框预测的目标尺度为21,大框预测的目标尺度为54,我们先看看开方前的误差值:

loss_{small}=(16-21)^2=25,loss_{big}=(49-54)^2=25

开方后:

loss_{small}=(\sqrt{16}-\sqrt{21})^2=0.34,loss_{big}=(\sqrt{49}-\sqrt{54})^2=0.12

可以看到,通过开方操作,小物体的权重被变相提高了。

值得注意的是,实际YOLO输出的w、h是bounding boxes相对于整幅图像尺度的相对值,上述这样举例只是为了方便计算书写。

        YOLO的每一个grid cell预测了多个bounding boxes。在训练时,我们仅仅想要一个bounding box的预测器负责各个目标(一个bounding box仅仅预测一个目标)。我们分配一个预测器来负责预测一个物体是基于那个预测与真实样本(ground truth)拥有最高的当前IOU值(即先通过预测框的x、y、w、h得到bounding box,再计算bounding box与当前box所在的cell内含有的那个物体的标注框的IOU,从B个bounding boxes中选取拥有最高IOU值得那个bounding box,让其负责预测标准框,且令其预测的置信度分数为当前的IOU值)。这导致两个bounding boxes预测器之间的专业化(可能指的是每次都用IOU值高的那个,但是网络由于训练样本很多,因此两个框都会被训练到定位物体的能力)。每一个预测器更好地预测确定的尺寸、宽高比或者物体的的类别,提高整体的召回。

        在训练过程中,我们优化如下的多部分的损失函数:

在这个公式中代表是否有物体出现在第i个cell内,并且代表第i个cell内第j个bounding box事负责预测的。

        注意损失函数仅当grid cell中有物体的时候才会对分类损失误差产生惩罚,因此条件类别概率之前讨论过。同时它也仅仅当预测器负责真实框(ground truth box)的时候惩罚bounding box的定位损失。也就是这个cell中的与真实框拥有最高IOU值的那个预测器。

惩罚:简单来说就是计算损失,通过这部分损失进行梯度反向传播,更新时使得网络朝着令惩罚项下降的方向进行更新。

        我们使用PASCAL VOC2007和2012的训练与验证数据集训练了这个网络大概135个epochs。当我们在VOC 2012上测试的时候,我们也将VOC 2007的测试数据集用于训练。在整个过程中,我们使用的batch大小为64,动量为0.9,权重衰减为0.0005。

批大小(batch_size):每一个batch

动量(momentum):

权重衰减(weight decay):

         我们的学习率调整策略如下:对于第一个epoch,我们将慢慢地将学习率从10^{-3}提高到10^{-2}。如果我们一开始对模型就用一个大的学习率常常会由于不稳定的梯度导致网络发散(学习率大导致更新步幅大,梯度的变化也容易比较剧烈)。我们持续使用10^{-2}训练了75个epochs,然后使用10^{-3}训练了30个epochs,最后使用10^{-4}训练了30个epoch。

        为了避免过拟合我们使用了drouput和大量的数据增强方法。在第一层全连接层后面的drouput层使用的弃用比例为0.5,这可以防止层间的互相适应。为了数据增强我们引进随机缩放和随机变化原始图像尺寸的20%。我们也随机调整了图像的曝光度和饱和度,在HSV颜色空间中使用1.5的乘法因子做如此调整。

drouput:每一个输出的神经元有一定的概率使得当前神经元被杀死,即为0。当采用了drouput后,在训练过程中,如果我们将被杀死的神经元直接抹去不看,就可以发现实际上带有drouput的网络在训练各种不同的模型,这可以防止过拟合,也就是作者所说的防止层间的互相适应。

值得注意的是,很多情况下,batch_normalization与drouput不能并用,二者会给网络带来偏差,效果反而会变差

2.3 推理

        和训练一样,对一张测试图片进行预测检测仅需要一个网络进行评估。在PASCAL VOC数据集上,网络对每张图片预测98个bounding boxes,也为每一个box预测了类别概率(实际上这里应该是对cell预测的类别概率)。YOLO在测试时是非常快的,因为它只需要一个网络进行评估,与那些以分类器为基础的方法是完全不同的(如DPM和R-CNN)。

       grid的设计强行使得bounding box的预测具有空间多样性(???)。通常很清楚的一件事是一个物体落在了哪个cell内以及网络仅仅为各个物体预测一个bounding box。但是,一些大物体或者是靠近多个cell边界的物体可能会被多个cells定位。非极大值抑制(NMS)能够用于修正这些重复的检测结果。然而非极大值抑制对R-CNN和DPM的影响并没有那么重要,但是NMS给我们的网络增加了2-3%的mAP。

2.4 YOLO的限制

        YOLO对bounding box的预测实施了强有力的空间限制,因为每一个grid cell仅仅预测两个box并且只有一个类别概率向量(因为bounding box的预测是基于cell的,因此与cell的空间位置有关)。这个空间限制了我们的模型能够检测出的邻近目标的数量(也就是说YOLO因为这份限制导致了对于一些靠得很近的目标效果并不好)。我们的模型努力识别成群出现的小目标,如鸟群。

        由于我们的模型学着从数据中预测bounding boxes,因此它很难地将物体泛化到新的或者不常见的宽高比或者结构的目标上。我们的模型也使用相对粗粒度的特征用于bounding boxes的预测,这是因为我们的算法有多个降采样的层(pooling池化)。

        最后,当我们训练在一个接近检测性能的损失函数上训练时,我们的损失函数同等对待了小bounding boxes和大bounding boxes的误差。  对于大的框来说,小的误差是温和的(对IOU值的影响不大),但是对于小物体来说,小的误差对于IOU的影响就大得多。我们的主要误差来源是不正确的定位。

3.与其他检测系统对比

        目标检测是计算机视觉领域的核心问题。目标检测的流程通常开始时从输入的图像中提取一些列的鲁棒特征(Haar[25],SIFT[23],HOG[4],convolutional features[6]),Haar、SIFT、HOG是一些人工设计的特征,convolution features是卷积特征,如使用canny算子得到的图片边缘特征。然后,使用分类器或定位器识别特征空间中的目标。这些分类器或者定位器要么以滑动窗口的方式运行在整幅图像上,要么运行在图像中的某些子区域上。我们将YOLO检测系统与几个先进的检测框架进行了比较,突出了关键的相似点和不同点。

         可变性部件模型(DPM)。可变性部件模型使用滑动窗口的方式进行目标检测。DPM使用一些互相分离的部分来提取静态特征、分类区域、为高置信度分数的区域预测bounding boxes等等。我们的系统使用一个卷积神经网络替代了这些分离的部分。这个网络同时进行特征提取、bounding boxes预测、非极大值抑制(NMS)以及上下文信息推理。与静态特征不同,网络在线训练特征并且为检测任务对它们进行优化。我们统一化的架构相比于DPM来说是一个更快更准确的模型。

         R-CNN。R-CNN以及它的变体使用候选区域(region proposal)替代滑动窗口来找到图像中的物体。线性搜索[35]生成可能的bounding boxes,卷积网络进行特征提取,SVM分类器负责为这些boxes打分,线性模型用于调整bounding boxes(对box的位置进行精修),非极大值抑制消除重复的检测结果。这个复杂流程的每一个阶段都必须独立地精确调整,这导致系统非常慢,在测试时处理一张图片需要40秒以上。

        YOLO与R-CNN有一些相似之处。每一个gird cell通过使用卷积特征预测可能的bounding boxes以及这些框的置信度分数。但是,我们的系统在grid cell上实施了空间约束,这能够缓和重复预测同一个目标的问题。相较于R-CNN,我们的系统预测的bounding boxes更少,每一张图片仅有98个,而选择搜索算法生成大约2000个。最后,我们的系统将这些独立的组件组合成一个单一的、联合优化的模型(即端到端的优化,从loss直接优化预测和特征提取)。

        其他快速的检测器如Fast和Faster R-CNN聚焦于通过共享计算和使用神经网络替代线性搜索来进行候选框提取来加速R-CNN算法框架。尽管他们有着超越R-CNN和速度和精度,但是仍然达不到实时检测的性能。

        许多研究都努力在加速DPM的算法流程上。他们加速了HOG特征的计算,使用级联的方式,并且将计算推到GPU群上进行。然而,事实上DPM只有30HZ的实时速度。

        不同于尝试优化一个大而复杂的检测流程的各个独立组件,YOLO完全抛弃复杂流程,并且被设计为一种快速的方法。

        针对单个类别如人脸或者人类的检测器可以高度优化,因为他们必须要处理的变化相对要少。YOLO是一个通用的检测器,它可以学习同时检测多种目标。

         Deep MultiBox。与R-CNN不同,Szegedy等人训练了一个卷积神经网络替代线性搜索方法来预测感兴趣区域(也就是候选框提取)。通过将置信度的预测替换为一个类别概率的预测,MultiBox能够进行单个目标的检测。然而,MultiBox不能执行通用的目标检测并且仍然只是一个较大的检测流程中的一部分,需要更进一步对图像块进行分类。YOLO和MultiBox都使用一个卷积网络来预测图像中的bounding booxes,但是YOLO是一个完整的检测系统而不像MultiBox只是系统的一部分。

        OverFeat。Sermanet等人训练了一个卷积神经网络来执行定位并且使用这个定位器来执行检测任务。OverFeat有效地执行滑动窗口的检测方式但是它仍然是一个脱离的系统(存在很多独立部件)。OverFeat为定位任务而不是检测性能进行优化。像DPM一样,定位器在预测的时候只能够看到局部的信息。OverFeat不能推断全局上下文信息,因此需要大量的后处理来产生一致性的检测结果(由于没有上下文信息,因此推理结果可能存在残缺、偏移等情况,需要后处理模块对检测结果进行修正)。

        MultiGrasp。我们的工作在设计上与Redmon等人所做的抓取检测(grasp detection)类似。我们预测bounding box的grid方法以MultiGrasp系统做回归来进行抓取的思想为基础。但是,抓取检测时一个比目标检测简单得多的任务。对于仅包含一个物体的图像,MultiGrasp仅仅需要预测一个可抓取区域。它不需要估计目标大小、欸之或边界,也不需要预测它的类别,只需要找到一个合适的抓取区域。YOLO在一张图像上为多个类别的多个物体预测了bounding boxes、类别概率。

4.实验

        首先我们以PASCAL VOC 2007数据集为标准比较了YOLO和其他的实时检测系统。为了理解YOLO和R-CNN变体之间的差异,我们探索了YOLO和Fast R0CNN在VOC 2007数据集上所犯的错误情况,Fast R-CNN时R-CNN的性能最高的版本之一。根据这份不同错误类型的扼要报告,我们证明YOLO可以用来为Fast R-CNN的检测结果重新打分并且减少来自背景假阳性(将背景错误预测为物体)的错误,从而显著地提高检测性能。我们也呈现了VOC 2012数据集的结果,并且将mAP值与当前最先进的方法进行了比较。最后,我们证明在两个艺术画作的数据集上,相比于其他检测器,YOLO能更好地泛化到新领域。

 4.1 与其他实时系统比较

         许多目标检测领域的研究努力聚焦于使得标准的检测流程更快。但是,事实上,只有Sadeghi等人生产了一个可以实时运行的检测系统(30f/s或更高)。我们将YOLO与在30HZ或100HZ下运行的DPM的GPU实现进行了比较。尽管其他的努力没有达到实时这一里程碑,我们也比较了他们的相对mAP和速度,以测试目标检测系统中准确性和检测性能之间的权衡。

        Fast YOLO是在PASCAL数据集上最快的目标检测方法。正如我们所知道的,他是目前最快的检测器。在52.7%的mAP下,它二点准确率是以往实时检测系统的两倍以上。YOLO能够在保持实时检测性能的同时将mAP值提高到63.4%。

这里主要说的是YOLO可以做精度与速度的权衡,并且由于YOLO本身就非常快,因此牺牲速度提高精度是一个可行的方案。

        我们也使用VGG-16训练了YOLO模型。这个模型更加准确但是也明显慢于YOLO(这里的意思指的是将YOLO的backbone主干网络部分替换为VGG-16来做特征提取的工作)。与其他依赖于VGG-16的模型相比它是有用的,但是由于它慢于实时的要求,因此本文的剩余部分将聚焦于我们更快的模型。

        最快的DPM系统有效地加速了DPM算法并且没有牺牲太多的mAP,但是它仍然会将实时检测性能降低两倍?(没有达到实时检测性能的两倍?)相比于神经网络方法,DPM在目标检测方面的精确率要相对更低,因此这个方法是有限的。

         R-CNN minus R 使用静态bounding box提取替代选择搜索。尽管比R-CNN快得多,但是它仍然达不到实时的要求并且由于没有好的候选框,因此精度受到了很大的影响。

        表1:PASCAL VOC 2007上实时检测系统效果。该表比较了快速检测器额性能(检测效果)和速度。Fast YOLO是PASCAL VOC检测任务上保持最快速度记录的检测器,并且在这种速度下,依旧保持了两倍于其他实时检测器的精确度。YOLO比Fast YOLO高了10点mAP,因此更加准确,但是它仍然高于实时性检测对速度的要求。

        Fast R-CNN对R-CNN的类别预测阶段进行了加速,但是它仍然依靠选择性搜索搜索,这个方法处理需要大约两秒处理每一张图片来生成bounding boxes的建议框。因此尽管它拥有很高的mAP值但是仅仅0.5f/s的帧率远远达不到实时的要求。

        最近的Faster R-CNN使用一个神经网络替代选择性搜索来提取bounding boxes的候选框,这与Szegedy等人所做的工作类似。在我们的测试中,他们最准确的模型能够有7f/s的帧率,而更小的但不是那么准确的模型能够达到18f/s。以VGG-16作为主干网络的Faster R-CNN版本比原版本的mAP值高了10个点但同时比YOLO慢了6倍。Zeiler-Fergus的Faster R-CNN仅仅比YOLO慢了2.5倍但是精确度比YOLO低。

4.2 VOC 2007上的误差分析

         为了进一步探讨YOLO和最先进的探测器之间的差异,我们对这些模型在VOC 2007上的检测结果做了一个分类。我们将YOLO和Fast R-CNN比较是因为它是在PASCAL上性能最好的检测器并且它的检测是公开可用的(开源??)。

         我们使用Hoiem等人[19]的方法论与工具。在测试时,对于每一个类别,我们看该类别的前N个预测(即只看置信度最高的N个预测,这么做可以防止类别的样本数量不均衡带来的对结果判定的影响)。每个预测要么正确,要么依据以下的错误类型分类(下述IOU指的是bounding box与ground truth的IOU):

    * 正确:类别正确,IOU>0.5

    * 定位(不准):类别正确,0.1<IOU<0.5

    * 相似(类别):类别相似,IOU>0.1

    * 其他(错误):类别错误,IOU>0.1

    * 背景(预测为目标,FP):与任何物体的IOU<0.1

图4:误差分析:Fast R-CNN vs YOLO。这些图标显示了各种类别下前N个预测的定位和背景错误占比(N并不等于该类下的目标数量,而是为了平衡类别数量的差异而进行人工设定的)

        图4显示了在预测20个类别的情况下,每一种错误类型的均值(类别指的是网络预测的物体的类别,错误类型指的是上述的正确[需要注意这个图是所有预测的情况,是包含正确预测这种情况的]、定位、相似、背景等)

        YOLO难以很准确地定位目标。YOLO的错误中定位错误比其他其他错误加起来都多。Fast R-CNN犯更少的定位错误但是更多地犯将背景错当成物体的错误。Fast R-CNN的检测结果中有13.6%是假阳例(将背景当成目标),这些预测框中不包含任何物体。Fast R-CNN将背景当成目标的可能性几乎是YOLO的3倍。

4.3 Fast R-CNN与YOLO的结合

        YOLO比起Fast R-CNN,很少会将背景错误当成物体。通过使用YOLO消除Fast R-CNN所做的背景的错误预测,我们得到一个在检测性能上显著提升的模型。对于R-CNN预测的每一个bounding box,我们会去检查YOLO是否会预测一个相近的box。如果YOLO也预测了相似的box,则我们依据YOLO预测出的物体存在概率(置信度分数)以及Fast R-CNN与YOLO预测的两个box的重叠情况来提高预测的准确性。

        最好的Fast R-CNN模型在VOC 2007测试集上有71.8%的mAP。当与YOLO结合后,它的mAP增加了3.2%,增加到了75%。我们也尝试将最好的Fast R-CNN模型与其他一些版本的Fast R-CNN结合。这些集成模型(Ensembles)对mAP有一些小幅提升,大概0.3~0.6%,看表2以获得更多细节。

集成模型:集成模型基于机器学习的理论,当多个弱的模型组合在一起的时候,可以获得一个性能更强的模型。

表2:在VOC 2007上进行模型集成的实验。我们探索了对最好版本的Fast R-CNN集成各种模型后的效果。集成测试表明,对于最好的Fast R-CNN来说,其他版本的Fast R-CNN带来的性能提升比YOLO要小得多。

表3:PASCAL VOC 2012积分榜。直到2015年11月6日,YOLO与 comp4(允许外部数据[训练?])的公开排行榜进行了比较。这个排行榜展示了许多检测方法的平均精度均值(mAP)与每一个类别的平均精度。YOLO是唯一的实时检测器。YOLO  Fast R-CNN+YOLO是分数第四高的方法,这在Fast R-CNN的基础上提升了2.3%。

Pascal VOC comp4是众多国内外企业物体检测团队证明自己实力的地方。

        这份来自于YOLO提供的性能提升并不是简简单单只是集成Fast R-CNN与YOLO的副产品,因为结合其他版本的Fast R-CNN几乎没有任何好处(提升很微弱,而且严重费时间)。相反,正是因为YOLO在测试时犯了各种各样的错误,所以在提升Fast R-CNN的性能时才更加有效。

这边作者可能想说,两个Fast R-CNN犯的错基本相近,因此对于性能改善的帮助不大,而YOLO侧重犯定位的错误,恰好Fast R-CNN犯的比较多的背景错误对YOLO来说犯的少,因此结合起来会有比较大的提升。

        不幸的是,这种结合的方式并不能汲取YOLO快速的优势,因为我们是分开运行这两个模型然后将结果结合。但是,由于YOLO非常快,相较于原始的Fast R-CNN,这种集成方式也不会增加明显的计算时间。

4.4 VOC 2012上的测试结果

        在VOC  2012的测试集上,YOLO的mAP值得分为57.9%。这低于当前最先进的模型的精度,但是与最原始的使用VGG-16的R-CNN相近,请看图3。与最接近的竞争者相比,我们的系统难以处理小目标。对那些类别如 瓶子、羊、电视机/显示器,YOLO的得分比R-CNN和Feature Edit低8-10%。但是在其他类别如猫和火车上,YOLO的得分更高。

        我们的结合模型 Fast R-CNN+YOLO 是最好检测性能的方法之一。Fast R-CNN通过与YOLO结合可以提升2.3%的性能,这使得他在积分榜上相较于结合前提升了5个位置。

4.5 泛化性:艺术画作中的人类检测

        学术研究使用的目标检测数据集是从相同的分布中抽取训练和测试数据集。在实际的应用中,很难预测所有可能的用例,并且测试数据可能不同于系统之前见过的数据。我们在Picasso 和 People-Art这里两个用于测试艺术画中的人类检测数据集上将YOLO与其他检测系统进行比较。

        图5展示了YOLO和其他检测方法之间的性能比较结果。为了参考,我们给出模型在VOC 2007上的人类的AP值,并且所有的模型都是在VOC 2007数据集上训练的。在Picasso上测试泛化误差的模型是在VOC 2012上训练的,而在People-Art上测试泛化误差的模型是在VOC 2010上训练的。

        R-CNN在VOC 2007数据集上有很高的AP值。但是R-CNN运用于艺术画作的时候精度会大幅度下降。R-CNN使用选择性搜索来生成bounding box建议框,这个方法很适合自然图像。R-CNN中的分类器只能看到一些小区域并且需要好的建议框。

        DPM运用于艺术画作的时候能够很好地保持它的平均精度(AP)。先前的工作在理论上证明DPM表现得好是因为他有关于物体形状和布局的强大空间模型。尽管DPM并不像R-CNN那样性能下降那么严重,但它的初始AP就比较低(因此没有多少下降空间哈哈哈)

        YOLO在VOC 2007上表现得很好,并且当运用在艺术画作上时,它的AP值下降也低于其他方法。像DPM一样,YOLO对物体的大小、形状、物体间的联系、物体通常在哪些位置建模,艺术画作和自然图像在像素级别上的差异很大,但是在物体的大小和形状方面时很相似的,因此YOLO能够仍然预测到很好的bounding boxes和检测结果。

5.自然环境下的实时检测

         YOLO是一个快速的且比较精确的目标检测器,这些特点使得它对于计算机视觉的应用是十分理想的。我们将YOLO连接上webcam并且确认了它可以维持实时检测的性能,我们考察的时间长度包括从相机中提取图片并且进行预测的时间。

(a)Picasso数据集上的精确-召回曲线       

(b)VOC 2007、Picasso、People-Art上的定性结果,Picasso数据集同时评估了AP和Best F1

 图5:在Picasso和People-Art数据集上的泛化结果

 图6:定性结果。YOLO运行在来自互联网的采样的艺术作品和自然图片。虽然它在测试结果中将人当成飞机(第二行第二幅图),但是它基本上是正确的。

        由此产生的系统是交互式且参与式的。尽管YOLO单独处理图像,当它连接到webcam的时候,它的运转就像一个跟踪系统,当目标移动或者外观发生变化时预测它们。这个系统的演示和源码可以在我们的项目网站上找到:http://pjreddie.com/yolo/

6.结论

        我们介绍了一种一体的物体检测模型-YOLO。我们的模型便于构造并且能够直接在整张图片上训练(不需要预先进行候选框提取,经过候选框提取后,就是针对局部信息训练了)。与基于分类器的方法不同,YOLO是基于直接与检测性能对应的损失函数来训练的,并且整个模型是联合在一起训练的(特征提取和预测部分是同时训练的)。

        Fast YOLO是目前文献中最快的通用目标检测器,并且YOLO推动了最先进的实习目标检测。YOLO也能够很好地泛化到新领域,这使得它成为依赖于快速、鲁棒性好的目标检测应用的理想选择。

        

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值