yolov1论文地址:https://arxiv.org/abs/1506.02640
1. 基本介绍
(1)出发点
以往的目标检测要么有实时性,但是accuracy很低,如30Hz DPM、100Hz DPM;要么虽然有着较高的mAP值,但是不满足实时性要求,如RCNN系列;难以在高速场景下进行应用。yolo作者致力于推出既具有实时性又具有准确性的目标检测算法,最终发表了yolo目标检测算法,作为一篇one stage的目标检测论文,yolo的提出具有十分重大的意义。
(2)介绍
核心思想:将目标检测作为一个空间分离的bounding box和相关的类概率的回归问题。
YOLO之前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个滑窗(sliding window)在整张图像上均匀滑动,用分类器评估是否有物体。
Faster R-CNN通过 RPN 产生大量的可能包含待检测物体的 bounding box,再用分类器去判断每个 bounding box里是否包含有物体,以及物体所属类别的概率。
相较于其他的state-of-the-art 物体检测系统,YOLO在物体定位时更容易出错,但是在背景上预测false positives的情况会少一些。而且,YOLO比DPM、R-CNN等物体检测系统能够学到更加抽象的物体的特征。
(3)原理
如上图所示,使用YOLO来检测物体,其流程是非常简单明了的:
i、首先将输入图像resize到448 * 448作为卷积神经网络的输入;
ii、然后运行神经网络,得到一些bounding box坐标、bounding box中包含物体的置信度和class probabilities;
iii、对SxSx(B*5+C) 个向量进行非极大值抑制,过滤掉一些重叠的矩形框,筛选得到最终的box。
(4)成就
从上图我们可以看出,yolo目标检测算法能够达到45的FPS以及63.4的mAP,满足实时性和较高的精确性。
(5)创新点
yolo网络架构将物体检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box 的坐标、box中包含物体的置信度和物体的probabilities。因为YOLO的物体检测流程是在一个神经网络里完成的,所以可以end to end来优化物体检测性能。
2. 网络结构
(1)检测流程
YOLO将输入图像划分为S*S的栅格,每个grid cell负责检测中心落在该栅格中的物体。每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。这个 confidence scores反映了模型对于这个栅格的预测:该栅格是否含有物体,以及这个box的坐标预测的准确性。
- 其中confidence定义为目标存在概率×IOU(),即confidence要么为0要么为IOU。
- YOLO对每个bounding box有5个predictions:x, y, w, h,and confidence。(x, y)相对于gird cell,而w, h相对于全图。
- 类别C是相对于物体存在的条件概率(),每个gird cell设置一个C,与B-box的数量无关。
- 测试时,将类别C × confidence作为每个box的类存在的置信度分数,,这些分数编码了该类出现在方框中的概率,以及预测的方框与对象的匹配程度。
- 因此预测编码为 tensor,在VOC数据集上评估,B = 2,C = 20,最终预测框:7×7×30 tensor
(2)backbone
- 初始层backbone得到图像特征,全连接层输出概率和坐标。其中backbone:GoogLeNet modules,24conv、2fc,但是用1×1 reduction layers(减少前层的特征空间)紧跟 3×3 convolutional layers 取代GoogLeNet的inception modules。
- 论文使用的 S=7,即将一张图像分为7×7=49个栅格每一个栅格预测B=2个boxes(每个box有 x,y,w,h,confidence,5个预测值),同时C=20(PASCAL数据集中有20个类别)。因此,最后的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor。
3. 损失函数设计
YOLO的每个grid cell预测多(VOC中是2个)个bounding box。为了计算正阳性样本的损失,我们只要求它们之中的一个bbox对物体负责。因此,我们选取与真实标注(ground truth)有最高IOU的一个。这种策略导致bbox的的预测的特殊性,即每个预测在物体尺寸和比率上更准。
YOLO使用预测bbox和真实bbox的二次方差和来作为损失函数。损失函数由以下项组成
- 定位损失:预测得到的bounding box和真实bounding box之间的误差
- 置信度损失:bounding box包含物体的置信度
- 分类损失:gird cell各种类别的概率
(1)定位损失
我们更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为
,在pascal VOC训练中取5。对没有object的bbox的confidence loss,赋予小的loss weight,记为
,在pascal VOC训练中取0.5。有object的bbox的confidence loss 和类别的loss 的loss weight正常取1。
对不同大小的B-box预测中,相比于大B-box预测偏一点,小box预测偏一点更不能忍受。为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss比big box要大。
在YOLO看来大的bbox和小的bbox的2个像素的误差是相等的,为刻意强调这一点,YOLO没有直接预测bbox的宽和高,而是宽的二次方根和高的二次方根。除此之外,我们对此loss乘以一个权重λcoord以增加bbox的准确率。
(2)置信度损失
由于大部分box不包含任何物体,这会导致分类(正负样本)的不均衡,因此,我们降低了背景检测损失的权重,引入权重λnoobj默认值为0.5。
注意事项:
- s×s网格预测目标中心点,每个gird cell预测B个bounding-box和这些box的置信度confidence,其中confidence定义为目标存在概率×IOU(),即confidence要么为0要么为IOU。
- 测试时,将类别C × confidence作为每个box的类存在的置信度分数,,这些分数编码了该类出现在方框中的概率,以及预测的方框与对象的匹配程度。
(3)类别损失
如果检测到物体,每个grid cell的分类损失是每个分类的条件概率的平方误差和。
所以这个误差项我们可以这么理解:
- 首先,当前一共有 7×7个grid cell ,预测bbox中有物体的概率,此项有49×2(每个grid cell预测2个bbox)=98个
- 其次,这个物体分别属于20个分类的概率。
4. 训练与测试
(1)训练
- 训练时:
- 我们首先在ImageNet进行预训练(1000类)。
- 使用前20 卷积层 + 1 平均池化层 + 1 全连接层
- ImageNet上 a single crop top-5 accuracy of 88%,其中single crop表示:在测试过程中,将图像resize到某个尺度,选择其中的center crop(即图像正中间区域),作为CNN的输入,去评估该模型。
- 然后我们转换模型进行检测,在预先训练好的网络中同时添加卷积层和连接层可以提高性能。添加四个卷积层和两个权值随机初始化的完全连接层。检测通常需要细粒度的视觉信息,因此将网络的输入分辨率从224×224增加到448×448。
- 最后一层预测类别概率及坐标,并按照图像的w、h对B-box的w、h进行标准化,使之介于0和1之间。再将B-box的x、y坐标参数化为特定gird cell的偏移量,因此它们也被限定在0和1之间。
- 最后使用线性激活函数,其余层使用leaky relu:
(2)测试结果
这里贴上原文的检测结果,能够更好的评价yolo的实际性能。
5. 优缺点
(1)优点
- 实时目标检测,图片全局分析
- 区域候选的方法限制了分类器识别特定区域。YOLO在预测边框时可以遍历整个图像。使用相关信息时,YOLO在背景区域检测更少的假阳性。
- 使用单一结构网络,可以端到端地训练
(2)缺点
- 当训练一个近似检测性能的损失函数时,损失函数在小边界盒和大边界盒中对待误差是一样的。
- 当长宽比和B-box的默认长宽比差异比较大时,IOU会很小,会影响检测;
- YOLO对边界框的预测施加了很强的空间限制,因为每个网格单元格只能预测两个框,并且只能有一个类。
- 对小物体效果不好,虽然检测速度快,但在定位方面不够准确,并且召回率较低。
6. 总结
- 这里使用平方和误差是因为它易于优化,但它与实现平均精度最大化的目标并不完全一致。它对定位误差与分类误差的权重相等,这可能并不理想。此外,在每幅图像中,许多网格单元都不包含任何对象。这会将这些单元格的“置信度”得分推向零,通常会超过确实包含对象的单元格的梯度。这可能会导致模型不稳定,从而导致训练在早期就出现分歧。为了弥补这一点,增加了边界框坐标预测的损失,并减少了对不包含对象的框的置信度预测的损失, 使用两个参数、,分别为5、0.5。平方和误差对大box和小box的误差的权重也是相等的。而误差度量应该反映出小B-box里的小偏差比大B-box里的小偏差更重要。为了部分解决这个问题,我们预测边界框的宽度和高度的平方根,而不是直接的宽度和高度。
- YOLO预测有多个gird cell ,训练时,我们想要一个B-box预测每个目标,设置每个预测框去预测IOU最高的目标(指定一个预测框去预测一个物体),这样每个预测器都能更好地预测特定的大小、长宽比或对象的类别,从而提高整体的召回率。
7. 参考文献
https://tangh.github.io/articles/yolo-from-v1-to-v4/
https://shartoo.github.io/2019/03/12/yolo-v123/