yolo-v1:
YOLO 就是使用回归这种做法的典型算法。
首先将图片 Resize 到固定尺寸,然后通过一套卷积神经网络,最后接上 FC 直接输出结果,这就他们整个网络的基本结构。
更具体地做法,是将输入图片划分成一个 SxS 的网格,每个网格负责检测网格里面的物体是啥,并输出 Bbox Info 和 置信度。这里的置信度指的是 该网格内含有什么物体 和 预测这个物体的准确度。
更具体的是如下定义:
我们可以从这个定义得知,当框中没有物体的时候,整个置信度都会变为 0 。
这个想法其实就是一个简单的分而治之想法,将图片卷积后提取的特征图分为 SxS 块,然后利用优秀的分类模型对每一块进行分类,将每个网格处理完使用 NMS (非极大值抑制)的算法去除重叠的框,最后得到我们的结果。
SSD:
YOLO 这样做的确非常快,但是问题就在于这个框有点大,就会变得粗糙——小物体就容易从这个大网中漏出去,因此对小物体的检测效果不好。
所以 SSD 就在 YOLO 的主意上添加了 Faster R-CNN 的 Anchor 概念,并融合不同卷积层的特征做出预测。
我们从上图就可以很明显的看出这是 YOLO 分治网络
和 Faster R-CNN Anchor
的融合,这就大大提高了对小物体的检测。这里作者做实验也提到和 Faster R-CNN
一样的结果,这个 Anchor
的数量和形状会对性能造成较大的影响。
除此之外,由于这个 Anchor
是规整形状的,但是有些物体的摆放位置是千奇百怪的,所以没有 数据增强
前的效果比增强后的效果差 7 个百分点。直观点理解,做轻微地角度扭曲让 Anchor
背后的神经元“看到”更多的信息。
还有一个重大的进步是结合了不同尺寸大小 Feature Maps 所提取的特征,然后进行预测。这是 FPN 网络提出前的第一次做 Feature Pyramid 的尝试,这个特征图金字塔结合了不同层的信息,从而结合了不同 尺寸
和 大小
的特征信息。
这个尝试就大大地提高了识别的精度,且高分辨率(尺寸大)的 Feature Map 中含有更多小物体的信息,也是因为这个原因 SSD 能够较好的识别小物体。
除此之外,和 YOLO 最大的区别是,SSD 没有接 FC 减少了大量的参数量、提高了速度。
DSSD:
DSSD检测算法的网络结构如下图所示,DSSD也是使用不同阶段不同分辨率的feature maps进行预测,在不考虑Backbone网络结构差别的情况下,可以发现DSSD相比于SSD多了一系列的后续上采样操作,SSD是使用下采样过程中的feature maps进行预测,而DSSD是使用上采样过程中的feature maps进行预测。显而易见的是,SSD用于检测的feature maps位于网络的较低层,表征能力较弱,而DSSD用于检测的feature maps位于网络的较高层,表征能力较强,同时DSSD在反卷积的过程中通过Skip-Connection引入了较低层的feature maps,实现了一定程度的特征融合。所以DSSD的效果要优于SSD检测算法。
FSSD:
FSSD检测算法的网络结构如下图所示,同样,FSSD也是使用不同阶段不同分辨率的feature maps进行预测,相比于SSD,FSSD多了一个特征融合处理,将网络较低层的特征引入到网络的较高层,在检测的时候能够同时考虑不同尺度的信息,使得检测更加准确。
YOLO9000:
到了 SSD ,回归方法的目标检测应该一统天下了,但是 YOLO 的作者不服气,升级做了一个 YOLO9000 ——号称可以同时识别 9000 类物体的实时监测算法。
讲道理,YOLO9000 更像是 SSD 加了一些 Trick ,而并没有什么本质上的进步:
- Batch Normalization
- High resolution classifier 448*448 pretrain
- Convolution with anchor boxes
- Dimension clusters
- Multi-Scale Training every 10 batch {320,…..608}
- Direct location prediction
- Fine-Grained Features
加了 BN 层,扩大输入维度,使用了 Anchor
,训练的时候数据增强…
所以强是强,但没啥新意,SSD 和 YOLO9000 可以归为一类。
yolo-v3:
yolo-v3主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用Logistic取代了softmax。
Yolo_v3使用了darknet-53的前面的52层(没有全连接层),yolo_v3这个网络是一个全卷积网络,大量使用残差的跳层连接,并且为了降低池化带来的梯度负面效果,作者直接摒弃了POOLing,用conv的stride来实现降采样。在这个网络结构中,使用的是步长为2的卷积来进行降采样。
为了加强算法对小目标检测的精确度,YOLO v3中采用类似FPN的upsample和融合做法(最后融合了3个scale,其他两个scale的大小分别是26×26和52×52),在多个scale的feature map上做检测。
作者在3条预测支路采用的也是全卷积的结构,其中最后一个卷积层的卷积核个数是255,是针对COCO数据集的80类:3*(80+4+1)=255,3表示一个grid cell包含3个bounding box,4表示框的4个坐标信息,1表示objectness score。
先验眶在特征图尺寸上的分配:
//填坑中。。。
参考文献:
SIGAI:目标检测最新进展总结与展望
小绿叶:一文看懂YOLO v3
Dave:基于深度学习的「目标检测」算法综述