名字解析:
论文中有一句话是这样描述的: Using our system, you only look once (YOLO) at an image to predict what objects are present and where they are,大意是:使用我们的系统,您只需要看一次图像(YOLO),就能预测出现在的物体是什么以及他们的位置。显然,这是相对于RCNN系列网络来说的。
算法定位:
1.YOLO中心思想:
YOLO不同于其他物体检测方法,它将物体检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box 的坐标、box中包含物体的置信度和物体的probabilities。因为YOLO的物体检测流程是在一个神经网络里完成的,所以可以end to end来优化物体检测性能。
2.YOLO实现方法:
2.1,整体流程
我们的系统将输入图像划分为一个S×S网格。如果一个object的中心落入一个网格单元中,那么该网格单元负责检测该object。
- 每个格子预测B个bounding boxes(带有中心点x,y和宽高w,h四个信息)和confidence scores(这些boxes的置信度)。
什么是confidence scores,它代表了所预测的box中含有object的置信程度和这个box预测的有多么准确定两重信息,其值是这样计算的:
************************(1)
这个值是针对于每个网格来说的,如果一个格子里面没有object,那么是0,如果该格子里面有object,那么值就是1,也就是整个值就等于,这个IOU是什么,IOU就是预测的边框与实际边框的重叠率
B如果取2的话就是下面这种情况:
- 每个格子要预测出C个 conditional class probabilities(通俗的翻译:在有类别条件下的概率,毕竟你如果要知道这个格子属于哪一类,要先确定这个格子里要含有object才行)———即:
***************************(2)
每个格子代表的类如下:
在测试的时候,由以上两点,我们得出两个概率:(1)和(2),我们将条件类概率和单个bounding boxes置信度预测相乘,得到
**(3)
这个公式代表什么?代表这样既可得到每个bounding box的具体类别的confidence score。
这乘积既包含了bounding box中预测的class的 probability信息,也反映了预测的bounding box有多大程度适合该object
然后经过一系列计算(该计算过程请看2.3)就可以得到预测出的Label和边框,并标注在图片上就完成了测试。
----------------------------------------------------------------------------------------------------------------------------------------------------
2.2,训练以及损失
在训练的时候,最后的prediction是{ S * S * ( B * 5 + C) }的Tensor。在PASCAL VOC数据集中,S=7(划分为7*7的网格), B=2(每个格子预测2个box), C=20(20个类) ,所以最后得到的数据是7×7×(2*5+20)=7*7*30的Tensor
每个格子的数据如下图所示:右边的5+5+20=30
总体来看:每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别。其实这些数据存储的都是归一化的数据,包括坐标什么的,都归一化都0-1了,我这里不细说了。
网络方面主要采用GoogLeNet,卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标。最后的输出是7*7*30,这些前面也解释过了,7*7是grid cell的数量。这里注意下实现的细节可能人人都不大一样,比如对inception的改动,最后几层的全连接层的改动等等,但是重点在于最后一层的输出是7*7*30。
另外两个小细节:
1、作者先在ImageNet数据集上预训练网络,而且网络只采用上图的前面20个卷积层,输入是224*224大小的图像。然后在检测的时候再加上随机初始化的4个卷积层和2个全连接层,同时输入改为更高分辨率的448*448。
2、Relu层改为pRelu,即当x<0时,激活值是0.1*x,而不是传统的0。
损失函数计算:
作者采用sum-squared error的方式把localization error(bounding box的坐标误差)和classificaton error整合在一起。但是如果二者的权值一致,容易导致模型不稳定,训练发散。因为很多grid cell是不包含物体的,这样的话很多grid cell的confidence score为0。经常overpowering 包含object的格子的梯度,(作者用了一个overpowering这个词)所以采用设置不同权重方式来解决,一方面提高localization error的权重,另一方面降低没有object的box的confidence loss权值,loss权重分别是5和0.5。而对于包含object的box的confidence loss权值还是原来的1
这里我还是贴一下原文,,以便理解,其中ground truth 是真实的object:
然后给个更好理解的图:
可以看到,红框的式子和黄框的式子是对应的,一个是obj(含有object的box),一个是noobj(不含有object的box),很明显,如果不含object的话我们就对它冷淡一些,我们更关心的是含有object的box,所以红框前面的系数是1,而黄框前面的系数是λnoobj=0.5.
至于那个w为什么用根号,原文是这样解释的:
这样做主要是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者下,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。
2.3,测试的计算部分
每个grid有30维,这30维中,8维是回归box的坐标,2维是box的confidence,还有20维是类别,由于在式(3)中,是2维的confidence与20维的classes相乘,所以得到20*2个数据,如下图:
就这样,每个格子得到2个向量(20维)的矩阵,那么7*7=49个格子得到49*2个向量(20维),如下图所示:
然后就对这个20*98的矩阵进行运算。
98是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模型相对于之前的物体检测方法有多个优点:
1、YOLO检测物体非常快。
因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。更快的Fast YOLO检测速度可以达到155 FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。
2、YOLO可以很好的避免背景错误,产生false positives。
不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。
3、YOLO可以学到物体的泛化特征。
当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。
尽管YOLO有这些优点,它也有一些缺点:
1、YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。
2、YOLO容易产生物体的定位错误。
3、YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。
参考文献:
2.https://blog.csdn.net/u014380165/article/details/72616238
3.https://blog.csdn.net/hrsstudy/article/details/70305791
谢谢大家,我的表演结束