经典论文解读YOLO 目标检测
Posted 一颗小树x
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典论文解读YOLO 目标检测相关的知识,希望对你有一定的参考价值。
前言
YOLO是一种目标检测方法,它的输入是整张图片,当检测到目标物体时用边界框圈起来,同时给该目标物体一个类别;边界框由中心位置、宽、高等来表示的;它的输出是n个物体的检测信息,每个物体的信息包括:中心位置(x,y)、高(h)、宽(w)、类别。
YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置;它是通过归回的方式计算和优化边界框和类别。
论文地址:You Only Look Once: Unified, Real-Time Object Detection
开源代码:https://github.com/pjreddie/darknet
一、思路流程
- 输入一张图像,把图像划分为7*7的网格;此时图像由49个网格组成的。
- 对于每个网络,模型都预测2个边界框;每个边界框包含的信息:置信度、中心坐标、宽、高等。此时图像有7*7*2 = 98个边界框。
- 设置一个阈值,去除“置信度”过低的边界框;然后通过非极大值抑制来去除冗余的边界框。
二、网络结构
YOLO的结构比较简单,常规的卷积、池化最后加了两层全连接。画了一个草图,便于大家理解:
YOLO是输入图片,经过神经网络的变换得到一个输出的张量。下面是官方的模型结构图:
网络结构包含24个卷积层和2个全连接层;其中前20个卷积层用来做预训练,后面4个是随机初始化的卷积层,和2个全连接层。
2.1 输入
输入原始图像,但要求缩放到448*448的尺寸;因为YOLO的网络中,最后接了两个全连接层,全连接层是要求固定大小的向量作为输入,所以倒推回去也就要求原始图像有固定的尺寸。
2.2 模型处理
YOLO是把输入图像被划分为 7*7 的网格(grid),每个格子都可以检测是否包含目标;(这里是二分类,有物体或无物体)
如果目标的中心位置在格子里,则让该格子负责该目标,此时以格子为中心出现边界框,尝试把目标框起来,虽然一开始不准确;后面通过回归的方式不断修正边界框,让边界框更贴合目标物体。
注意:初代的YOLO中,每个格子只能检测一种物体。
最后,对每个网格应用图像分类和定位处理,获得预测对象的边界框及其对应的类概率。
2.3 输出
输出是一个 7*7*30 的张量(tensor),神经网络对输入图像信息的提取和变换,“网格周边的信息”也会被识别和整理,最后编码到那个30维向量中。(一共7*7 个网格,每个网格对应一个30维向量)
这里解释一下,30维的含义是什么。
一个边界框,由中心位置、宽、高、置信度来表示的,这里有5维了;YOLO中对每个网格预测2个边界框的,于是就10维了;预测20种不同的对象(人、鸟、猫、汽车、椅子等),这里20维。
一个网格的维度 = 类别 +(坐标x、坐标y、宽度、高度、置信度)* 边界框数量
即:30 = 20 + (5) *2
下面有一幅图,有助于理解:
2.4 小结
重点1:一个网格只能检测一个物体,所以一张图片最多可以检测出49个对象;因为每个30维向量中只有一组(20个)对象分类的概率,也就只能预测出一个对象。
重点2:总共有98 个边界框 bounding box,也叫候选区;因为共有49个网格,每个网格有2个边界框,于是有98个边界框;
重点3:YOLO的bounding box并不是Faster RCNN的Anchor,Faster RCNN的Anchor(先验框,预先设置好不同的大小和宽高比。YOLO并没有预先设置2个bounding box的大小和形状,也没有对每个bounding box分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个bounding box,选择预测得相对比较准的那个。
三、如何编码边界框bounding box?
边界框包含“位置”和“置信度”信息。
3.1 边界框的位置
每个边界框需要4个数值来表示其位置:
(Center_x, Center_y, width, height)
即(边界框的中心点的x坐标,y坐标,边界框的宽度,高度)
3.2 边界框的的置信度
边界框的置信度 = 该边界框内存在对象的概率 * 该边界框 与 该对象实际边界框的IOU
公式来表示:
一个边界框的置信度Confidence意味着它 “是否包含对象”且“位置准确”的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象 或者 即便有对象也存在较大的位置偏差。
Pr(Object) 是一个网格有物体的概率,在有物体的时候为1,没有物体的时候为0。当网格中没有物体,此时Pr(Object)为0 ,后面的IOU就不用计算了。
是用网络输出的2个边界框与对象真实边界框一起计算出IOU。然后看2个边界框的IOU,哪个比较大,就由哪个边界框来负责预测该对象。
简单解释一下IOU,IOU的全称是intersection over union,也就是交并比,它反应了两个框框的相似度。IOU=交集部分面积/并集部分面积
可以调整网格数量、bounding box数量
7*7网格,每个网格2个bounding box,对448*448输入图像来说覆盖粒度有点粗。我们也可以设置更多的网格以及更多的bounding box。设网格数量为 S*S,每个网格产生B个边框,网络支持识别C个不同的对象。这时,输出的向量长度为:
整个输出的tensor就是:
YOLO选择的参数是 7*7网格,2个bounding box,20种对象,因此 输出向量长度 : 20 + 2 * (4+1) = 30。整个输出的tensor就是 7*7*30。
初代的YOLO因为网格和bounding box设置的比较稀疏,所以训练出来后预测的准确率和召回率都不是很理想,后续的v2、v3版本还会改进。
四、损失函数
损失就是网络实际输出值与样本标签值之间的偏差。YOLO给出的损失函数由边界框的中心点的损失、边界框宽度和高度的损失、置信度的损失、类别的损失组成的。
具体公式如下:
网络输出与样本标签的各项内容的”误差平方和作“为一个样本的整体误差。
具体的含义看这幅图:
五、NMS(非极大值抑制)
前面说过一张图片,分为7*7的网格,假设每个网格都有物体,每个网格预测2个边界框,此时有7*7*2 = 98个框了;然后通过IOU对比,网格只取IOU较大的边界框,此时只剩48个框了,一个网格只留下一个边界框。(注意,这里是假设每个网格都有物体)
这里保留了这么多边界框,预测中一个物体可能被多个边界框包围;实际物体只对应一个边界框,如何解决个问题呢?使用非极大值抑制 可以解决。
看看众多边界框在图片中的效果: 密密麻麻的
NMS核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。
NMS算法的要点:
- 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对于剩余的边界框:
- 选择具有最高概率的边界框并将其作为输出预测;
- 计算”作为输出预测的边界框“,与其他边界框的相关联IoU值;舍去IoU大于阈值的边界框;其实就是舍弃与”作为输出预测的边界框“很相近的框框。
- 重复步骤2,直到所有边界框都被视为输出预测或被舍弃;
案例:如下图所示汽车不止一次被识别
NMS计算流程:
- 它首先查看与每次检测相关的概率并取最大的概率。在上图中,0.9是最高概率,因此首先选择概率为0.9的方框;
- 现在,它会查看图像中的所有其他框。与当前边界框较高的IoU的边界框将被抑制。因此,在示例中,0.6和0.7概率的边界框将被抑制。(此时面包车已经只剩一个边界框)
- 在部分边界框被抑制后,它会从概率最高的所有边界框中选择下一个,在例子中为0.8的边界框;
- 再次计算与该边界框相连边界框的IoU,去掉较高IoU值的边界框。
- 重复这些步骤,得到最后的边界框:
六、训练
概述:YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测。
技巧:训练中采用了drop out和数据增强(data augmentation)来防止过拟合。
设计:YOLO的最后一层采用线性激活函数;由于需要预测bounding box的位置(数值型) 和类别的概率,最后输出层用线性函数做激活函数。
其它层都是采用Leaky ReLU激活函数:
七、模型效果
能看到YOLOv1的精度并不高只有50多左右,但是它的检测速度很快;
YOLOv1目标检测效果:
大部分是能正确识别的,不过也有识别错误的地方(把人识别为一架飞机了)
八、YOLO优缺点
优点:快速;精度还可以。
缺点:
1) 由于每个格子只预测两个框,并且只属于一个类,对于小目标或者密集的目标检测效果不好。
2) 每个格子都是正规的矩形,如果遇到不均衡的不常见的长宽比形状目标,泛化能力比较差。
3) YOLO采用多个下采样层,学到的目标特征不精细,影响检测效果。
4) 大目标和小目标的IOU误差对总损失函数影响接近。
5) YOLO的定位准确率较差。
后面v2、v3、v4、v5版本,对这些缺点进行改进。
参考:https://zhuanlan.zhihu.com/p/46691043、https://zhuanlan.zhihu.com/p/94986199
以上是关于经典论文解读YOLO 目标检测的主要内容,如果未能解决你的问题,请参考以下文章