一.yolo概述
作者在YOLO算法中把物体检测
(object detection)问题处理成回归问题,用一个卷积神经网络结构就可以从输入图像直接预测bounding box和类别概率。
YOLO算法的优点:
- YOLO的速度非常快。在Titan X GPU上的速度是45 fps(frames per second),加速版的YOLO差不多是150fps。
- YOLO是基于图像的全局信息进行预测的。这一点和基于sliding window以及region proposal等检测算法不一样。与Fast R-CNN相比,YOLO在误检测(将背景检测为物体)方面的错误率能降低一半多。
- YOLO可以学到物体的generalizable representations。可以理解为泛化能力强。
- 准确率高,有实验证明。
yolov1只有=98个proposal。
自己的理解
实际上这个部分是针对下文中,我们将图片划分成 的网格,同时我们对于每一个网格分配了2个边框,所以最后我们有个检测区域。
算法结构图如Fig1:结构上主要的特点就是 unified detection,不再是原来许多步骤组成的物体检测,这使得模型的运行速度快,可以直接学习图像的全局信息,且可以end-to-end训练。
算法首先把输入图像划分成的格子,如果一个目标的中心落入格子,该格子就负责检测该目标对应原文如下:
算法首先把输入图像划分成的格子,然后对每个格子都预测B个bounding boxes
。每一个Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence
。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。
confidence反映当前bounding box是否包含物体以及物体位置的准确性。
其中,若bounding box包含物体,则Pr(object) = 1;否则Pr(object) = 0.
IOU(intersection over union)为预测bounding box与ground truth的iou值。
每个bounding box都对应一个confidence score,如果grid cell里面没有object,confidence就是0,如果有,则confidence score等于预测的box和ground truth的IOU值,见上面公式。所以如何判断一个grid cell中是否包含object呢?答案是:如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。
即yolo的
目标检测完全是由一些grid cell负责
的,即为那些包含ground truth中心点的grid cell。(正确与否待验证。。。)
每个grid cell都预测C个类别概率,表示一个grid cell在包含object的条件下属于某个类别的概率。
注意预测c个类别的概率是以一个grid cell为整体,而不管其中包含的B个bbox。
在测试
时,每个box通过类别概率和box置信度相乘来得到特定类别置信分数:
这个分数代表该类别出现在box中的概率和box和目标的合适度。在PASCAL VOC数据集上评价时,我们采用S=7,B=2,C=20(该数据集包含20个类别),最终预测结果为7×7×30的tensor。
自己的理解:
1.在这个地方我们S等于7,表示我们将图片化成的方格,B为2,说明我们的每个方格有两个预测box,C为20,说明一共有20个类别,最终我们可以得到是每个B会得到5个预测数据,x,y,w,h,confidence,一个方格有两个B,这样会有10个数据,同时加上20个类别,一个方格上共产生30个数据,总共会产生的一个tensor。
2.confidence的计算使用的是IOU的方式
3.预测有没有object在cell中,就看object的中心点坐标是不是在cell中,在概率为1,不在为0.
这个乘法具体是怎么做的呢?请看下图:每个bounding box的confidence和每个类别的score相乘,得到每个bounding box属于哪一类的confidence score。
即得到每个bounding box属于哪一类的confidence score。也就是说最后会得到的score矩阵,括号里面是bounding box的数量,20代表类别。
- 接下来的操作都是20个类别轮流进行:
- 在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。
- 最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。
- 最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。(具体细节参考最后的参考资料1。)
二.网络结构
YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1×1卷积层(此处1×1卷积层的存在是为了跨通道信息整合)+3×3卷积层简单替代。YOLO论文中,作者还给出一个更轻快的检测网络fast YOLO,它只有9个卷积层和2个全连接层。使用titan x GPU,fast YOLO可以达到155fps的检测速度,但是mAP值也从YOLO的63.4%降到了52.7%,但却仍然远高于以往的实时物体检测方法(DPM)的mAP值。
最终输出为7×7×30的tensor。
三.训练
作者采用ImageNet 1000-class 数据集来预训练卷积层。预训练阶段,采用上图网络中的前20卷积层,外加average-pooling 层和全连接层。模型训练了一周,获得了top-5 accuracy为0.88(ImageNet2012 validation set),与GoogleNet模型准确率相当。然后,将模型转换为检测模型。作者向预训练模型中加入了4个卷积层和两层全连接层,提高了模型输入分辨率(224×224->448×448)。最后一层预测类别概率和bounding box协调值。bounding box的宽和高通过输入图像宽和高归一化到0-1区间。
实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。
最后一层采用linear activation,其它层使用 leaky rectified linear。
损失函数方面,作者采用sum-squared error的方式把localization error(bounding box的坐标误差)和classificaton error整合在一起。但是如果二者的权值一致,容易导致模型不稳定,训练发散。因为很多grid cell是不包含物体的,这样的话很多grid cell的confidence score为0。所以采用设置不同权重方式
来解决,一方面提高localization error的权重,另一方面降低没有object的box的confidence loss权值,loss权重分别是5和0.5。而对于包含object的box的confidence loss权值还是原来的1。详见下面的原文解释和loos function函数。
这里详细讲一下loss function。在loss function中,前面两行表示localization error(即坐标误差),第一行是box中心坐标(x,y)的预测,第二行为宽和高的预测。这里注意用宽和高的开根号
代替原来的宽和高,这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。
第三、四行表示bounding box的confidence损失,就像前面所说的,分成grid cell包含与不包含object两种情况。这里注意下因为每个grid cell包含两个bounding box,所以只有当ground truth 和该网格中的某个bounding box的IOU值最大的时候,才计算这项。
第五行表示预测类别的误差,注意前面的系数只有在grid cell包含object的时候才为1。
所以具体实现的时候是什么样的过程呢?
训练的时候:
输入:
输入N个图像,每个图像包含M个object,每个object包含4个坐标(x,y,w,h)和1个label。输出:
然后通过网络得到大小的三维矩阵。每个的向量
前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别
。注意这30个都是预测的结果。计算loss:
然后就可以计算损失函数的第一、二 、五行。至于第三四行,confidence可以根据ground truth和预测的bounding box计算出的IOU和是否有object的0,1值相乘得到。真实的confidence是0或1值,即有object则为1,没有object则为0。 这样就能计算出loss function的值了.
测试的时候:
输入一张图像,跑到网络的末端得到的三维矩阵,这里虽然没有计算IOU,但是由训练好的权重已经直接计算出了bounding box的confidence。然后再跟预测的类别概率相乘就得到每个bounding box属于哪一类的概率。
四.分析
Limitations限制
- 一,YOLO的每一个网格只预测两个boxes,一种类别。这导致模型对相邻目标预测准确率下降。因此,YOLO对成队列的目标(如 一群鸟)识别准确率较低。
- 二,YOLO是从数据中学习预测bounding boxes,因此,对新的或者不常见角度的目标无法识别。
- 三,YOLO的loss函数对small bounding boxes和large bounding boxes的error平等对待,影响了模型识别准确率。因为对于小的bounding boxes,small error影响更大。
YOLO模型训练分为两步:
1)预训练。使用ImageNet
1000类数据训练YOLO网络的前20个卷积层+1个average池化层+1个全连接层。训练图像分辨率resize到224×224。
2)用步骤1)得到的前20个卷积层网络参数来初始化YOLO模型前20个卷积层的网络参数,然后用VOC 20类标注数据进行YOLO模型训练。为提高图像精度,在训练检测模型时,将输入图像分辨率resize到448×448。
五.参考文献(这个部分详细观看,对于理解网络非常的透彻
)
docs.google.com/presentatio…
(非常清楚的图解了yolo网络,尤其是测试过程)