目标检测主要分两类:
One-stage:Yolo,SSD
均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,速度快,准确率低
但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡
Two-stage:R-CNN, Fast R-CNN, Faster R-CNN
先通过Selective Search或者RPN生成候选框,然后对box分类和回归,速度慢,准确率高
YoloV1的缺点:Yolo在CNN后的FC之后做检测,同时难以检测小目标,准确率低
SSD的改进:
直接在CNN里检测
SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为m*n*p的特征图,只需要采用3*3*p这样比较小的卷积核得到检测值
不同尺度的特征图做检测
大尺度特征图用于检测小物体,小尺度特征图用于检测大物体,它在增加运算量的同时可能会提高检测的精度
加入anchor机制
对于大小为M*N的特征图,相当于有MN个单元,每个单元设置K个anchor,而对于每个anchor还要预测(c-1类+1背景)的概率和anchor的四个偏移量,所以输出是MNK(c+4),由于SSD是卷积检测的,所以每个channel对应一个输出,共K(c+4)个卷积核
过程:
- 输入是300*300*3, 在VGG-16的基础上做改动
- 将FC6和FC7换成卷积层
- 去掉dropout和FC8
- 添加Atrous算法
- 将Pool5改成3*3-S1
- 抽取conv4-3,conv7,conv8-2,conv9-2,conv10-2,conv11-2,分别做anchor提取特征
- 将各层得到的box做NMS得到最终结果
贡献:
- 提出一个单阶段检测器,相对于yolo更快更准,并且不需要RPN和ROI pooling
- 使用小卷积核在不同尺度的FM上做预测和回归
- 相对于Faster R-CNN,对小目标检测效果更好
多尺度特征:
相对于传统方法使用某层特定FM做回归预测,SSD使用6层不同尺度的FM做回归预测
相对于Faster R-CNN在conv layers后的FM上生成anchor,SSD在这六层分别生成anchor,然后将这些anchor结合起来,最后做NMS
- 浅层卷积层对边缘更加感兴趣,可以获得一些细节信息,而深层网络对由浅层特征构成的复杂特征更感兴趣,可以获得一些语义信息,对于检测任务而言,一幅图像中的目标有复杂的有简单的,对于简单的patch我们利用浅层网络的特征就可以将其检测出来,对于复杂的patch我们利用深层网络的特征就可以将其检测出来。
- 低层的feature map,感受野比较小,高层的感受野比较大,在不同的feature map进行卷积,可以达到多尺度的目的
anchor:
数目:
SSD一共在六层FM上应用anchor机制,分别是
- Conv4-3: 38*38,K=4
- CONV7:19*19,K=6
- CONV8-2:10*10,K=6
- CONV9-2:5*5,K=6
- CONV10-2:3*3,K=4
- CONV11-2:1*1, K=4
所以总的anchor数是:
38*38*4 + 19*19*6 + 10*10*6 + 5*5*6 + 3*3*4 + 1*1*4 = 8732
Scale and ratio:
Scale:
假设一共在m层FM上提取anchor,SSD300中是6层,使用如下公式求scale,其中最底层smin=2,最高层smax=0.9
Ratio:
Ar={1, 2, 3,1/2, 1/3}
通过这五种比例,得到五个anchor,另外对于ar=1,添加一个anchor,
损失函数:
Lloc用的Smooth L1,Lconf用的多分类logloss
精度提升的原因
- 数据增强:SSD算法使用了多种数据增强的方法,包括水平翻转、裁剪、放大和缩小等。论文明确指出,数据增强可以明显的提高算法的性能
- OHEM:当box很多的时候,大多数负样本,这就造成正负样本的不均衡,文中依据confidience score对default box进行排序,挑选其中confidience高的box进行训练将正负样本比例设定为1:3,其他的负样本权重置0,发现这leads to faster optimization and a more stable training,不然会出现全是负样本的情况,从而影响模型性能。
如何重多个default box中找到和ground truth最接近的box?
首先,寻找与每一个ground truth有最大的IoU的default box
之后将剩余还没有配对的default box与任意一个ground truth尝试配对,只要两者之间的IoU大于阈值(SSD 300 阈值为0.5),就认为match;
配对到ground truth的default box就是positive,没有配对的default box就是negative
速度提升的原因
- 原因1:首先SSD是一个单阶段网络,只需要一个阶段就可以输出结果;而Faster-rcnn是一个双阶段网络,尽管Faster-rcnn的BB少很多,但是其需要大量的前向和反向推理(训练阶段),而且需要交替的训练两个网络;
- 原因2:Faster-rcnn中不仅需要训练RPN,而且需要训练Fast-rcnn,而SSD其实相当于一个优化了的RPN网络,不需要进行后面的检测,仅仅前向推理就会花费很多时间;
- 原因3:YOLO网络虽然比SSD网络看起来简单,但是YOLO网络中含有大量的全连接层,和FC层相比,CONV层具有更少的参数;同时YOLO获得候选BB的操作比较费时;
- 原因4:SSD算法中,调整了VGG网络的架构,将其中的FC层替换为CONV层,这一点会大大的提升速度,因为VGG中的FC层都需要大量的运算,有大量的参数,需要进行前向推理;
- 原因5:使用了atrous算法,具体的提速原理还不清楚,不过论文中明确提出该算法能够提速20%。
- 原因6:SSD设置了输入图片的大小,它会将不同大小的图片裁剪为300x300,或者512x512,和Faster-rcnn相比,在输入上就会少很多的计算
优缺点:
优点:
运行速度超过YOLO,精度超过Faster-rcnn(一定条件下,对于稀疏场景的大目标而言)。
缺点:
需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中default box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验。(相比之下,YOLO2使用聚类找出大部分的anchor box形状,这个思想能直接套在SSD上)
虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别