相较于two-stage detectors ,one-stage detectors不需要提取region proposal的阶段,直接预测物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果,因此有着更快的检测速度。本篇博客将逐步按照YOLO →SSD →RetinaNet →YOLOv2 →YOLOv3 →YOLOv4的顺序,依次整理one-stage目标检测算法的改进点。除此之外,one-stage的anchor-free目标检测器在不断发展,包括CornerNet、ExtremeNet、FCOS、CenterNet等,在后续博客继续进行整理。下面将对算法进行一一讨论。
YOLO
YOLO是one-stage detectors的鼻祖,也达到了真正意义上的real-time。从2016年YOLO的提出到2018年的YOLOv3,YOLO系列独树一帜、自成一派,今年YOLOv4作为一个集大成者,在原有YOLO目标检测架构的基础上增加了近年CNN改进的众多技术,虽然没有理论创新,仍然做到了速度和效果的双提升。《You Only Look Once:Unified, Real-Time Object Detection》是由Joseph Redmon等人提出并发表在CVPR 2016上的论文。创新点:(1)将目标检测重构为一个单一的回归问题,快速实时,基础网络运行速率为45帧/秒,快速版本运行速率超过150帧/秒;(2)与滑窗的方法和区域建议的方法不同,利用了图像的全局信息进行训练和测试;(3)能学习到目标的通用表达,应用到新的领域时效果不会太差。
网络结构如下所示:
- 网络结构:网络中初始的卷积层从图像中提取特征,而全连接层用来预测输出概率和坐标。受到了图像识别模型GoogLeNet的启发,设置了24个卷积层接2个全连接层,然而,不同于GoogLeNet中使用的inception modules,而是简单地在1×1卷积层后面接上3×3卷积层。在ImageNet分类任务上使用一半的分辨率(224×224的输入图像)预训练了卷积层,然后使用一倍分辨率(448×448)用来训练检测,由于检测任务通常需要细粒度的视觉信息,因此将网络的输入像素从224×224增加到448×448。
- 全连接层的预测:使用整张图片的特征去预测每一个边界框的思路是,将输入图像分成S×S的网格,如果目标的中心落在某一个网格单元,这个网格单元将负责识别出这个物体。体现在上图全连接层的输出维度,每一个网格单元预测B(=2)个边界框( x , y , w , h x,y,w,h x,y,w,h)以及对应于每一个边界框的置信分数。置信分数,反映了这个模型预测该边界框包含某一物体的可能性以及对于这个边界框回归预测的准确率, c o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h confidence = Pr(Object)*IOU_{pred}^{truth} confidence=Pr(Object)∗IOUpredtruth。对于这个公式简单来说就是,如果在网格单元中没有目标,置信分数GT将为0;否则,置信分数为预测边界框和真实边界框的IOU(intersection over union),GT即为1。每一个网格单元同时也预测目标属于C(=20)个类别的条件概率, P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object)。因此,网络模型将图片分为一个一个的网格并且同时地预测边界框、置信分数以及类别概率,这些预测将被编码为S×S×(B*5+C)的张量。在测试的时候将类别概率和独立的边界框预测置信分数相乘,该分数编码了这个类出现在框中的概率以及预测框和目标框的匹配程度: P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_i|Object)*Pr(Object)*IOU_{pred}^{truth}=Pr(Class_i)*IOU_{pred}^{truth} Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
- 损失函数:训练前对数据做归一化处理,为了更好的进行回归。利用图像的宽高归一化GT框的宽高,从而使得宽和高数值落在0~1,坐标x和y为GT框中心在特定网络单元格位置的偏移量,即相对于单元格左上角的位移量,数值也在0~1之间。详细转换过程可以参考YOLO文章详细解读,下面附上其中的图。由于平方误差和容易优化,所以作者在该损失上进行了调整。首先,为了防止不包含目标的网格在损失上压过有目标的网格,导致模型不稳定,对定位误差和分类误差构造了不同的权重,增加了bounding box的损失,减少了不含目标的confidence损失,分别引入了 λ c o o r d = 5 , λ n o o b j = 0.5 \lambda_{coord}=5,\lambda_{noobj}=0.5 λcoord=5,λnoobj=0.5。其次,平方误差和对于大回归框和小回归框有着同等权重,但是小边界框的小偏差比大边界框的小偏差影响更为重要,因此预测边界框宽和高的平方根,而不是直接预测宽和高能缓解这个问题。Multi-part loss function,是由预测数据与GT数据之间的坐标误差、置信度误差和分类误差组成的:
![](https://i-blog.csdnimg.cn/blog_migrate/8c6d58111847c72037014a44517a7b7a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a1a5a1db0ded2364b4666eed6b28059c.png)
- 局限性:(1)每个网格单元只能预测两个边界框,并且只能有一个类,对邻近出现多个小目标时效果不佳;(2)图片进入网络之前进行了resize,卷积网络经过多次下采样,得到的特征图较为粗糙,定位不够准确;(3)通过数据集来学习预测边界框,所以很难推广到新的或者不常见的宽高比例或者不同属性的目标。
SSD
2016年由Wei Liu等人提出《SSD: Single Shot MultiBox Detector》,发表在ECCV 2016。动机:基于“proposal+classification”的two-stage目标检测方法会预先回归一次边框,精度较高但速度偏慢;YOLO只作一次边框回归预测,这种one-stage方法能达到实时效果,但是对小目标训练不够充分,对于目标的尺度比较敏感。创新点:沿用了one-stage的思想来提高检测速度,采用了不同尺度和长宽比的先验框(default bounding boxes,类似于Faster R-CNN中的Anchors)来适应不同尺度的目标,根据不同尺度的特征图生成不同尺度的预测来提高精度。算法性能对比如下:
![](https://i-blog.csdnimg.cn/blog_migrate/78c7e8e8316402e80535f7a9e885427e.png)
- 将多尺度特征图用于检测:将不同尺度的卷积特征层(如图所示,这些卷积层随着网络深入尺寸逐渐减小)添加到截取的backbone网络的末端,利用这些层在多个尺度上对检测结果进行预测。具体而言,