SSD的理解,为PyramidBox做准备
目标检测主流方法有两大类
two-stage,以rcnn系列为主,采用建议框的方式对目标进行预测,过程首先要经过网络生成候选框,分类背景前景与进行第一次回归,之后再进行一次精细回归。
优点是准确率高,但速度较one-stage慢
one-stage,以yolo 、sdd等为主,通过事先制定先验框(对图像均匀进行选取先验框),直接回归出目标的坐标来检测。
优点是速度快,但精度稍微低(均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡,导致模型准确度稍低)
SSD的主要特点:
1.采用多尺度预测,对图像的整体信息提取的比较完整
2.速度与精确度都比较高;
3.利用卷积进行检测;
4.设置先验框,这个与yolo的先验框类似但不同;类似fast rcnn中的anchor机制,尺度与长宽比不同。
另外,再yolo3中已经对先验框的设置进行了改进,采用了ssd的多尺度方法,设置了9中先验框,最后达到的准确率与速度都是比较好的。
SSD的网络结构
下面这张图是ssd的网络结构,网络的基础cnn网络是用vgg16_atros版本,在vgg16的基础上进行了改进,首先是使用卷积层来代替全连接层,对应图中的Conv6,Conv7,原来是FC6和FC7,
改为卷积是因为后面还需要添加新的卷积层;
第二个改进是采用deeplab中的带洞卷积(不增加参数与模型复杂度的条件下指数级扩大卷积的视野,代替pooling操作,可以使特征图的大小保持不变)的操作,使卷积核的感受野变大,在池化的同时对图片信息没有丧失很多信息。
可以看出,检测过程不仅在填加特征图(conv8_2, conv9_2, conv_10_2, pool_11)上进行,为了保证网络对小目标有很好检测效果,检测过程也在基础网络特征图(conv4_3, conv_7)上进行。小物体在高层特征图上保留很少的信息,
通过增加输入图像的尺寸能够解决对小物体检测效果。
对于每个特征图有不同的先验框,先验框的设置,包括尺度(或者说大小)和长宽比两个方面。其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加。
对于第一个特征图Conv4_3,因为比较大,所以后面加了一个l2 normlization,这个与batch normlization有所不同,l2 normlization仅仅对每个像素点在channels维度上进行归一化,batch normlization是在(batch_size,wight,height )上同时进行
归一化的。
接下来是卷积检测的过程,对应图中的倒数第二个框(Detectiongs:8732 class) ,8732指的是所有特征图得到的先验框个数;不同的特征图所对应的先验框的个数也不一样;
每个特征图对应的框数如下:
38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4=8732
一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异
SSD训练的过程
对于每个ground truth来说,第一个原则是选取一个先验框与之iou最大的来匹配,但是这种方法会使得正负样本变得不均衡,所以需要第二种原则,
第二种原则即:对于剩下的先验框,若iou大于某个阈值(0.5),也将之与ground truth匹配,因为一个ground truth可以匹配多个先验框,但是一个
先验框只能匹配一个ground truth,
即使这样,负样本还是很多,为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,
抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
训练的损失函数:
损失函数有两部分构成:定位的损失,以及置信度函数的损失;
N是样本个数,xij这个值是一个指示参数,代表的是第i个先验框与第j个ground truth关于类别k是否匹配,值为0和1;
Lloc是位置的损失函数,位置损失函数采用smmothl1来计算,
Lconf是置信度损失函数,前半部分是关于类别p匹配的概率预测,后半部分是背景概率预测;计算采用softmax loss;
图片转自:https://www.cnblogs.com/fariver/p/7347197.html
SSD的预测过程:
预测过程首先根据类别置信度确定其类别,过滤掉背景的先验框,然后根据置信度值过滤低于阈值的先验框,
对于这些先验框计算其位置信息,
再把置信度按降序排列,通过NMS,最后得出预测目标框。