YOLO v1检测原理

 

 

YOLO v1论文地址: You Only Look Once: Unified, Real-Time Object Detection

YOLO v1检测原理


YOLO v1之前的RCNN系列目标检测算法,其本质仍是一个分类问题,基本思路是通过滑窗在图像上滑动,遍历完整个图像,分别判断窗口图像的分类,再通过回归方法调整物体精确边框,达到检测和定位的目的。其后改进的fast-RCNN系列在速度上做了提升,基本流程是先通过CNN生成大量的region proposal,即潜在的目标区域,再用另一个CNN去提取该潜在目标区域的特征,进行类别判断。

与RCNN的先定位出潜在位置,再判断分类不同,YOLO v1是一个端到端的目标检测算法,通过一个CNN网络就可以输出物体的类别以及物体的位置(还有类别的置信度)。相较于其他先进的物体检测系统,YOLO的物体定位精度略低,对小物体的检测效果不太好,但是在背景上预测出不存在的物体(false positives)的情况会少一些。

以下是YOLO论文中作者给出的流程示意图:

YOLO检测简易流程

  • 1、将图像resize到448 * 448作为神经网络的输入
  • 2、运行神经网络,得到一些bounding box坐标位置、物体的置信度和20个类别概率
  • 3、进行非极大值抑制,筛选Boxes

相比之前的目标检测算法,YOLO结构简单,端到端,不需要预先提取region proposal,不存在重叠区域反复预判的情况,所以YOLO最大的优点就是检测快速。

YOLO v1首先将图片resize到448*448(是Imagenet224×224的2倍),再将图像分割成7*7个小网格,每个网络会输出

  • 1. 2个bounding box。这个bounding box包含5个值,分别是检测到的物体的中心点坐标x和y,物体的宽度和高度W、H,还有一个置信度参数C(当前box中属于某一类的概率)
  • 2. 当前网格整体上属于哪个分类的概率,取前20个分类的概率

所以每张图片经过YOLO的CNN后的最终输出是7*7*(2*5+20)=7*7*30维的Tensor向量,如下图所示:

YOLO在获取到的7*7*30维向量的基础上,根据每个小框的类别概率、每个小框的相对位置、小框内物体所属的分类以及分类置信度等信息综合判断,预测出图片上物体的位置、类别以及相应的概率,这个过程的示意图如下:

YOLO v1的网络结构与GoogLeNet的网络结构类似,但没有使用GoogLeNet的inception modules,而是用1*1+3*3的卷积核的组合来代替,整个YOLOv1网络结构包含24个卷积层和2个全连接层,网络的最终输出是 7*7*30维的Tensor。结构图如下:

YOLO训练


YOLO的训练分成两部分,先是物体的分类识别训练,再是物体的检测定位训练。
首先使用YOLO网络的前20层卷积层,加上一个平均池化层和一个全连接层,组成一个预训练网络,在ImageNet数据集上(图像尺寸:224×224)训练1000个类别的分类识别网络,最终达到Top-5精度88%,与GoogleNet的精度相当。
之后取该预训练网络的前20层,加上YOLO网络的后4个卷积层和2个全连接层,组成识别+检测定位网络,在PASCAL VOC2007数据集上(图像尺寸:448×448,含训练图片5011张,测试图片4952幅张,共包含20个种类)训练。网络最终的输出包括物体的Bounding box位置坐标信息(X,Y,W,H)和类别概率,将值归一化到[0,1],使用Leaky Relu作为激活函数,并在第一个全连接层后接了一个ratio=0.5的Dropout 层,以防止过拟合。

损失函数


YOLO的损失函数包含3部分,分别是位置坐标损失函数,置信度损失函数和类别预测损失函数(注意置信度跟类别预测的区别,置信度是7×7个小区域里预测出来2个分类的置信度,共有7×7×2个,类别预测是7×7个小区域整体上分别属于20个类别的概率,共有7×7×20。那么为什么不干脆只记录每个小区域所属的最大概率对应的类别呢,这样是不是数据维度是7×7×1就ok了?这是为了在最后做整体上的综合整合),如何在这3部分损失函数之间找到一个平衡点,YOLO主要从以下几个方面考虑:

  • 1. 坐标损失函数方面,每个小区域上输出的8维位置坐标偏差的权重应该比20维类别预测偏差的权重要大,因为首先从体量上考虑,20维的影响很容易超过8维的影响,导致分类准确但是位置偏差过大,再者最后还会在整体的分类预测结果上综合判断物体的类别,所以单个小区域的分类误差稍微大一点不至于影响最终的结果。最终设置位置坐标损失和类别损失函数的权重比为5:1
  • 2. 置信度损失函数方面,在不含有目标物体的网格上,物体的置信度是0,并且图像上大部分区域都是不含目标物体的,这些过多的置信度为0对梯度的贡献会远远大于含目标物体的网格对梯度的贡献,这就容易导致网络不稳定或者发散,也就是说网络会倾向于预测每个小网格不含有物体,因为大部分情况下这种预测都是正确的。所以需要减弱不含目标物体的网格的贡献,取权重系数为0.5,含目标物体的网格的权重正常取1
  • 3. 目标物体大小不等方面,考虑到目标物体有大有小,对于大的物体,坐标预测存在一些偏差无伤大雅,但是对于小的目标物体,偏差一点可能就是另外一个东西了。为了解决这个问题,作者将位置坐标的W和H分别取平方根来代替原本的W和H,以达到值越小,对同等大小改变的相应越大的目的,对于这一点,可以从下图上更直观的看出来:


上图中可见对于水平方向上同等尺度的增量,基准值越小,其在平方根上产生的偏差就越大,如图中的绿色段明显大于红色段。

基于以上3点考虑,YOLO综合的损失函数可以总结如下图:

训练出来的网络再对预测定位结果进行一个非极大值抑制,就可以完美定位出物体的位置了。

猜你喜欢

转载自blog.csdn.net/duanyajun987/article/details/81668364