一、背景
两阶段目标检测流程繁琐,不易掌控,且速度慢,无法满足需要高度实时性的检测任务,如车道线检测,视频监控等。
二、特点
- 非常快。基础版本每秒处理45帧,快速版本可处理150帧。
- 基于全局上下文编码图像。给模型提供了更大的上下文信息,视野更开阔了,减少了对背景的误判数量。
- 泛化性更强。这使得yolo在不同领域、不同输入下能保持较高的精确度。
三、大一统的检测框架
YOLO将目标检测过程进行了极大的简化,训练过程不再需要候选区域,仅通过训练一个卷积网络便完成模型的构建,测试时输入图片,直接输出图片中含有对象的目标框以及所属类别,实现了端到端的快速检测。
在YOLO中,图片被分成 个格子,原文是
,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/f2d25ab8ed476c241a315be3591c654f.png)
如图,狗、自行车、轿车的标注框已给出,每个物体的中心点必然落在某个格子内部,由物体中心点所在的格子负责检测该物体,也就是一个格子负责检测一个物体。如图,红格子负责检测狗,蓝格子和黄格子分别负责检测自行车和轿车。另外,格子包含物体与否,要看物体的中心点是否落在格子内,如果落在格子内,则表示格子包含物体,否则格子不包含物体。
每个格子负责预测输出 个边界框,每个边界框的构成是
,分别表示边界框的中心点坐标、宽度、高度以及置信度,
是相对于格子左上角坐标的偏移,并且单位是相对于格子的大小,而
是相对于整个图片的宽与高的比例,这样4个元素的大小都在[0,1]范围内。
重点说下置信度。如果格子不包含物体,期望模型输出的边界框置信度是0,如果格子包含物体,期望模型输出的边界框置信度等于边界框实际的置信度 (格子包含的物体的真实标注框与格子预测输出的边界框的交并比),说白了,模型给出的分数要和实际计算的分数一致才行。
每个格子还负责预测输出 个类条件概率
,表示如果格子包含物体且包含的物体属于
的概率,总共有
个类别。注意:无论每个格子预测输出多少个边界框,每个格子仅预测输出
个类条件概率值。
在测试阶段,每个边界框会根据其对应格子输出的
个概率计算属于每个类的得分,即
,
是
个概率之一,这样每个边界框都会得到一个
的得分向量,图2给出了得分向量的计算过程。
![](https://i-blog.csdnimg.cn/blog_migrate/a470d3587a604b7475321b2af078a529.png)
整个图输出98个的得分向量(论文是
),如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/f63beb7b42d6e5b526f18c14fa35683f.png)
模型最终的输出维度是 : 。
四、NMS过程
引用自:YOLO系列算法详解
在测试阶段,每副图片输出98个边界框的得分向量,为了得到最可靠的边界框,YOLO使用了NMS,图4-6给出了详细流程。
![](https://i-blog.csdnimg.cn/blog_migrate/3ba764d33f962ebd451f70202fe2e52e.png)
NMS的第一步是对每个边界框进行标注,因为每个边界框的得分向量中必定存在一个最大值,对应了其内部最有可能的物体类别,标注完成后,进入NMS过程。
![](https://i-blog.csdnimg.cn/blog_migrate/cd4bfbf2e3bdc74d02971f99025cd094.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1c841a3904b06b2d39e3afd723ee6b8d.png)
如图5-6,对于图4中标注为狗的边界框集合中,将得分小于0.2的置0,再按照得分从高到低排序,然后使用NMS。NMS: 针对某个类别,例如狗这个类别,选择得分最高的边界框,然后计算它与其他边界框的IOU,如果IOU大于0.5,则说明重复率较大,将对应的边界框得分设置为0,否则不做处理,重复完之后,然后从未处理的边界框中选取一个得分最高的,重复上述步骤,直到没有边界框可以处理为止,这样便把所有可能包含狗并且得分较高的边界框过滤了出来。标注为其它类别的边界框的处理过程同上。
五、损失函数
YOLO的损失函数定义比较繁琐,其大致形式采用了均方误差,这比较容易优化。损失由定位损失、置信度损失、分类损失构成。
定位损失:
其中,开根号目的是均衡不同大小的预测边界框对坐标误差的敏感度,
是权重,目的是增加坐标损失的权重,定位不准确要比分类不准确糟糕的多,连位置都把握不准,何谈分类准确性。
表示第
个格子的第
个边界框负责检测中心点落在第
个格子的目标, 标准是第
个格子的第
个预测边界框与落在第
个格子的物体的真实标注框有最大的IOU值。前提是格子包含物体,对于图1,仅有三个格子包含物体的中心点,否则
。
![]()
图 7、格子的预测边界框 如图7,红色框是狗的标注框,中心点所在的格子输出了两个边界框,很明显,左侧的边界框与标注框的IOU大于右侧边界框与标注框的IOU,因此,左侧的边界框负责检测狗。
置信度(边界框得分)的损失:
分为包含物体的格子对应的损失项(左侧)和不包含物体的格子对应的损失项(右侧),对右侧损失项施加了权重0.5,因为不包含物体的格子远多于包含对象的格子,如果同等对待,右侧的损失项会主导BP过程,造成学习不稳定。对于包含物体的格子,期望预测输出的置信度
与实际的置信度
越接近越好,对于不包含物体的格子,期望预测输出的置信度
等于0。
分类损失:
其中,
表示第
个格子是否包含物体,包含物体为1,反之为0。如果包含物体,且格子的标注one-hot向量和预测得分向量距离很接近,则损失较小,反之损失较大。
六、优缺点
引用自:yolo算法详解。
优点:YOlO采用一个CNN网络来实现检测,是单管道策略,其训练与预测都是end-to-end,所以YOLO算法比较简洁且速度快。第二点由于是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。另外,YOLO的泛化能力强,在做迁移时,模型鲁棒性高。
缺点:YOLO各个单元格仅仅预测两个边界框,而且属于一个类别。对于小物体,YOLO的表现会不如人意。这方面的改进可以看SSD,其采用多尺度单元格。也可以看Faster R-CNN,其采用了anchor boxes。YOLO对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体。当然YOLO的定位不准确也是很大的问题。