目标检测(object detection)—— YOLO总结

点击这里了解RCNN
点击这里了解Fast RCNN
点击这里了解Faster RCNN
简明易懂的YOLO原理图示,本篇博文部分图片取自这里,需要*

1 概述

  • RCNN系列算法一脉相承,其终极版本Faster RCNN已经可以达到当时最快的检测速度和最高的准确率。但是RCNN系列算法并不简洁优美,原因在于,这些算法经过多阶段训练得到(multi-stage)。回想Faster RCNN,训练网络时,首先训练RPN网络,再训练Fast RCNN,这种两阶段训练网络的方式显然不够简洁优美。如果有算法可以只经过单阶段训练(one stage)就达到很好的检测速度和检测效果,岂不是非常简便,基于这个想法,YOLO(You Only Look Once)算法横空出世。
  • YOLO算法摒弃了RCNN系列算法先生成proposals再对其进行检测的思路,另辟蹊径,将目标检测任务直接视为回归问题,实现了一个端到端(end to end)训练的网络。

注1:从RCNN到Fast RCNN,再到Faster RCNN,再到YOLO,为了实现更快检测速度、更准确的检测结果,不断改进、甚至完全推翻前人方法的过程真是令人深深着迷。我认为这就是技术的部分魅力所在,只要肯想肯做,总有新的发现,总有新的成果。

2 整体网络结构

目标检测(object detection)—— YOLO总结

  • YOLO的网络结构如上,基于GoogLeNet,又添加了若干卷积层、池化层、全连接层

3 YOLO原理解读

3.1 训练阶段

YOLO如何将检测问题视为回归问题实现端到端的训练?请往下看:

3.1.1 原理

  • 训练阶段,将输入图像划分成SxS的网络,如下图所示(图中S=7):

目标检测(object detection)—— YOLO总结

  • 依据输入图像中目标的ground truth,可确定ground truth的中心所在的网格,如下图所示,狗的ground truth的中心落入红色网格内,其它同理:
    目标检测(object detection)—— YOLO总结
  • YOLO网络的目标是:对输入图像的每个网格,预测出B个bounding box(论文中B=2,bounding box的中心落入该网格)。训练过程中,这些预测出的bounding box与真实的ground truth求误差,进而训练网络,对生成的bounding box进行回归。每个bounding box预测5个值:bounding box的中心相对于网格中心的归一化坐标(x,y),bounding box的长宽相对于整个图像的长宽(w,h),置信度(confidence)。置信度计算方式如下
    目标检测(object detection)—— YOLO总结
  • 对每个bounding box,我们计算出一个置信度(confidence),其公式如下:其中,Pr(Object)表示bounding box所属的网格中是否包含ground truth的中心点,若包含,Pr(Object)=1,否则,Pr(Object)=0;IOU表示bounding box与ground truth的IOU。显然,当网格中落入ground truth的中心点时,该网格预测出的bounding box的confidence就是该bounding box与ground truth的IOU;网格中没有落入ground truth的中心点时,该网格预测出的bounding box的confidence为0

目标检测(object detection)—— YOLO总结

  • 到这里,每个网格预测出的bounding box只包含其中是否有目标的信息,要如何得到bounding box的目标中的类别信息呢? YOLO为每个网格预测C个条件概率密度,该条件概率密度表示:在网格中包含目标的情况下目标是第i类的概率:

目标检测(object detection)—— YOLO总结

  • 进而,每个bounding box包含第i个目标的概率可表示如下:显然这个值既度量了第i类目标出现在bounding box中的概率,又度量了这个bounding box与ground truth的接近程度

目标检测(object detection)—— YOLO总结

  • 也就是说,输入图像的每个网格会产生Bx5+C个值(B为每个网格预测的bounding box的数量,C为每个网格产生的条件概率的个数,也即目标类别总数)。输入图像共产生SxSx(Bx5+C)个值
  • 上述过程的示意图如下:

示意图一:
目标检测(object detection)—— YOLO总结
一张图像送入YOLO网络,最后经过两层全连接层后得到一个1470x1的tensor(第二个全连接层有1470个卷积核,每个卷积核的维度是1x1x4096),再reshape为7x7x30的tensor。这里有个问题:为什么是1470个卷积核?由前面的内容我们知道,输入图像经过YOLO网络后要产生1470个值,为了产生这个数目的值,就需要1470个卷积核。

示意图二:
目标检测(object detection)—— YOLO总结
7x7x30的tensor中每一个1x1x30的tensor都是原输入图像对应网格的预测值(见注2)。这个1x1x30的tensor的结构如下:前5个数代表对应网格预测出的第一个bounding box的参数;再5个数代表第二个bounding box的参数;最后20个数代表该网格的20个条件概率(论文中类别数为20,每个条件概率值代表该网格在包含目标的条件下目标是第i类的概率)

注2:我读论文到这里的时候,有个巨大的疑问,怎么确保每个1x1x30的tensor就与原图像某个网格对应起来?我的理解是这样的:第一层全连接层前,feature maps的形状为7x7x1024,这时候,feature maps中的每一个长条(1x1x1024)都可以在原图像上映射出一个区域(类似于anchor),并且该区域相对于输入图像的位置近似于该长条相对于feature maps的位置,也就是说,此时每个网格与feature maps上的对应位置具有一定的联系。经过两层全连接层后,原始feature maps中的信息被打乱重新分布于1x1x1470的tensor中。这时候,这种网格与对应tensor的位置关系是未知的,但是通过设置合适的误差函数,我们可以让神经网络不断调整权重参数,使网络强行寻找这种网格与tensor间的对应关系。网络训练完成后,网格与1x1x1470的tensor的位置对应关系也就确定了。检测时,1x1x1470的tensor中的不同位置的数值对应测试图像的不同网格。

示意图三:
目标检测(object detection)—— YOLO总结
再用第一个bounding box中的confidence分别与后20个条件概率相乘,从而得到了该bounding box不同类别的得分

示意图四:
目标检测(object detection)—— YOLO总结
对每个网格中的两个bounding box都重复上述操作,最终得到7x7x2=98个向量。

3.1.2 损失函数

目标检测(object detection)—— YOLO总结
误差函数中有三个值得注意的地方:

  • 首先,bounding box是否准确带来的误差(上图中第1个框)与类别预测是否正确的误差(上图中第4个框)是两类不同的误差,因此不能对两类误差使用相同的权值。论文中将lambda_coord设置为5
  • 其次,对每幅图像而言,不包含目标的网格要显著多于包含目标的网格,所以在计算两类网格的confidence误差时(上图中第2、3个框)应该使用不同的权值(若使用相同的权值,则误差收敛的速度过快,训练得到的网路不稳定)。论文中将lambda_noobj设置为0.5
  • 最后,大目标的bounding box和小目标的bounding box对误差的容忍程度是不同的。应该放大对小目标预测的bounding box的误差,缩小对大目标预测的bounding box的误差。论文中对长、宽开了根号,非常巧妙的实现了上述目的

3.2 检测阶段

检测阶段没什么可说的,将测试图像送入网络,得到多个bounding box,再应用NMS算法,保留效果最好的bounding box,完成检测。
目标检测(object detection)—— YOLO总结

4 YOLO存在的问题

4.1 缺点

  • 输入图像的每个网格只能预测两个bounding box,对这两个bounding box,只能预测出一个类别。回看上面的内容,每个网格均对应一个1x1x30的tensor,其中前5个数为预测的第一个bounding box的参数,再5个数为预测的第二个bounding box的参数,类别信息存储在后20个数中。显然,这两个bounding box共享了这个类别向量。这也就意味着,YOLO是没有办法在一个网格中区分出多个不同类别的目标的,这是个很大的问题。同时,YOLO也很难区别同一网格中同一类的多个目标(鸟群)
  • YOLO直接用输入图像的ground truth预测bounding box,因此对特殊比例的ground truth(训练时没见过的比例)的泛化性能较差(在这点上Faster RCNN做的比较好,因为Faster RCNN其实是用ground truth对应的feature maps训练网络,因此泛化性能较好)
  • 难以准确定位目标

4.2 优点

  • 速度快,45FPS on Titan X GPU
  • 相对于Faster RCNN,将背景错认为目标的情况较少出现。这说明,YOLO可有效提取目标的特征

YOLO可以说是暴力美学了,天马行空般的将目标检测任务转化为回归任务,一次训练,就能得到很好的效果。

上一篇:目标检测算法——YOLOV2——better&faster


下一篇:wp中的双向绑定