提到计算机视觉,自然会提到目标检测(object detection),而谈到目标检测,YOLO系列算法算是目标检测中2016年起燃起的一颗新星,接下来笔者将会挨个介绍YOLO这个家族中各个算法,本文则从CVPR2016的这篇You Only Look Once: Unified, Real-Time Object Detection介绍YOLO v1的论文说起。先上YOLO的官方演示demo:
目标检测之YOLO-You Only Look Once(一)

目录

  • 背景
  • 简单介绍
  • 算法原理
  • 实验结果
  • 参考文献

背景

  • 我们知道,目标检测通常分为两个步骤: (1)生成bounding box(边界框)****(2)对物体分类。因此目标检测算法也因此分为one-stagetwo-stage两个算法系列。

  • 顾名思义,two-stage算法就是把两个步骤分别进行,比如R-CNN方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。

  • 作者提出的YOLO(you only look once)就是one-stage算法系列的代表。它将目标检测任务当做回归问题(regression problem)来处理,直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。顾名思义,通过YOLO,每张图像只需要看一眼就能得出图像中都有哪些物体和这些物体的位置。

简单介绍

简单流程

目标检测之YOLO-You Only Look Once(一)
YOLO检测的流程十分简单,如论文中的这张图所示:
1、将图像resize448×448作为神经网络的输入
2、用卷积神经网络得到一些bounding box坐标、box中包含物体的置信度class probabilities
3、进行nms(非极大值抑制),筛选Boxes

优点

  1. YOLO检测物体非常快。 因为只是当成一个回归问题处理而没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。更快的Fast YOLO检测速度可以达到155 FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。
  2. YOLO可以很好的避免背景错误(前后景分离)。 不像其他物体检测系统使用了滑窗region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。
  3. 泛化能力强。作者在自然图像上训练好的结果在艺术作品中测试依然有很好的效果。
  4. 可以end to end优化。因为YOLO是one-stage算法,所以可以直接end to end优化整个检测。

缺点

  1. YOLO的物体检测精准度低于其他state-of-the-art的物体检测系统。
  2. YOLO容易产生物体的定位错误。
  3. YOLO对小物体的检测效果不好。(尤其是小物体,因为一个格只能预测1个物体类别,这个后面会提到)

算法原理

网络结构

目标检测之YOLO-You Only Look Once(一)
YOLO检测网络包括24个卷积层和2个全连接层,YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。

算法流程及部分定义

这部分是重点,会重点阐述。

  1. 首先,YOLO将图片分为SS*SS个网格,这里规定了物体的中心落在哪个格子,就由哪个格子负责预测这个物体,YOLO取S=7S=7。比如上图中,假定左下角坐标为(0,0),狗的中心落在了(1,2)这个格子,那么(1,2)这个格子就负责预测这只狗。
    目标检测之YOLO-You Only Look Once(一)

  2. 其次,每个网格预测BBbounding boxes以及对应的confidence scores(置信度分数),作者定义每个bounding box的置信度分数Confidence=Pr(Object)IOUpredtruthConfidence=Pr(Object)*IOU^{truth}_{pred},如果这个栅格中不存在物体,则Pr(Object)=0Pr(Object)=0confidence score为0;否则的话,confidence score则为predicted bounding boxground truth box之间的IOU(即predicted bounding boxGround Truth的交集比上它们的并集),在论文中每个网格预测2bounding box

  3. 每个预测出的bounding box5个预测值:x,y,w,h(x,y,w,h)还有对应的confidence。下面解释一下这几个参数:
    x,yx,y:xxyybounding box中心坐标,这里有个小技巧,x,yx,y不直接回归中心点坐标数值,而是回归相对于格点左上角坐标的位移值。例如,一个格点中物体坐标为(1.1,1.1)(1.1,1.1) ,那么在回归的时候使用(0.1,0.1)(0.1,0.1),在使用时,加上格点左上角坐标(1,1)(1,1)即可。
    w,hw,h:wwhh则是物体长宽相对于整幅图像的比例
    confidence:confidence就是预测的bounding boxground truth boxIOU值。

  4. 每个网格还预测CC个类别物体的条件概率Pr(ClassiObject)Pr(Classi|Object)。注意这里是每个网格,而不是每个bounding box。 可以利用公式计算每个bounding box对于每个类别的score,这样可以判断对于某一类物体的预测情况。

目标检测之YOLO-You Only Look Once(一)
即得到每个bounding box属于哪一类的confidence score。也就是说最后会得到20×(7×7×2=20×9820×(7×7×2)=20×98score矩阵,括号里面是bounding box的数量,一共有7×77×7个格子,每个格子预测2bounding box20代表物体类别(YOLO v1采用20个物体类别)。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box。最后每个bounding box20score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。

(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding boxIOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding boxIOU,重复以上过程直到最后

目标检测之YOLO-You Only Look Once(一)
5. 说到现在,大家应该可以理解网络最后全连接的输出层是7×7×30(7×7×30)了,7×77×7就是网格的数量,30=2×5+2030=(2×5+20),也就是每个网格预测bounding box的数量(B=2)×预测框的参数(x,y,w,h,confidence 5个参数)+预测物体的类别数量(20),这里要注意,每个网格最后只会预测出一个物体,预测的bounding box的数量只能提高预测的精度,但最终也只能预测出一个物体,这也就可以理解前面说的YOLO的缺点之一——对小物体的检测效果不好,因为一个图片7*7个网格只能预测出49个物体。

损失函数

目标检测之YOLO-You Only Look Once(一)

  • YOLO的损失函数乍一看比较长,其实我们可以理解为坐标误差(localization error)+分类误差(classification error)。但在训练过程中,如果将坐标误差和分类误差同等对待都采用均方差作为损失函数,这样是不合理的。因为在一个网格中,有很大的概率是没有物体的,那么在类别上的置信度是 0,这样对于其他少量的包含物体的网格而言,模型是不稳定的,训练容易发散。因此论文中加大了坐标误差的权重,也就是设置λcoord=5lambda_{coord}=5,λnoobj=0.5lambda_{noobj}=0.5
  1. 第一行是预测框的中心点误差。其中1ijobj1^{obj}_{ij}为控制函数,在标签中包含物体的那些格点中,该值为11;若格点不含有物体,该值为00,也就是只对含有物体的格子算损失。
  2. 第二行是预测框的长宽。这里大致和第一行计算的方式相同,但是多了一个根号。这是因为对于相等的误差值,大物体误差对检测的影响应小于小物体误差对检测的影响。例如,5个像素点的偏差,对于400500的预测框几乎没有影响,此时的IOU数值还是很大,但是对于1010的预测框影响就很大,加了根号就是为了减少这种影响。
  3. 第三行与第四行,都是预测框的置信度的损失。
  4. 第五行则是物体类别的概率损失

训练

训练部分我不多赘述,大家感兴趣的可以去看原文,但这里有一段吸引了我的注意:

YOLO predicts multiple bounding boxes per grid cell.At training time we only want one bounding box predictor to be responsible for each object. We assign one predictor to be “responsible” for predicting an object based on which prediction has the highest current IOU with the ground truth. This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall.

每个格子预测多个矩形框,而在损失函数计算中,作者只对拥有最高IOU的框计算损失,其余框不进行修正。这让每个框(predictor)在尺寸、长宽比、或者某些类别上有更好的预测表现,总体的召回率得到提升

实验结果

下表给出了YOLO与其他目标检测算法,在速度和准确性方面的比较结果(使用VOC 2007数据集)。
目标检测之YOLO-You Only Look Once(一)
作者还把YOLO和Fast R-CNN进行对比,进行了错误分析:
目标检测之YOLO-You Only Look Once(一)

• Correct: correct class and IOU > .5
• Localization: correct class, .1 < IOU < .5
• Similar: class is similar, IOU > .1
• Other: class is wrong, IOU > .1
• Background: IOU < .1 for any object

我们可以看出,YOLO对背景内容的误判率(4.75%)比fast rcnn的误判率(13.6%)低很多。但是YOLO的定位准确率较差,占总误差比例的19.0%,而fast rcnn仅为8.6%。

参考文献

  1. https://arxiv.org/pdf/1506.02640.pdf
  2. https://blog.csdn.net/u014380165/article/details/72616238