SSD学习小结

首先记录一下什么是卷积神经网络CNN
卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。
SSD学习小结_第1张图片
一张图片里的图像可以表示为像素值的矩阵。
利用卷积从图像矩阵中提取特征,从而得到特征图(Feature map)。
特征图的不同由以下三个卷积核/滤波器/特征检测器参数控制:
1. 深度(Depth)
卷积操作所需的特征检测器个数
2. 步长(Stride)
在输入矩阵上滑动滤波矩阵的像素数
3. 零填充(Zero-padding)
在输入矩阵的边缘使用零值进行填充,可以对输入图像矩阵的边缘进行滤波。零填充的一大好处是可以控制特征图的大小。
一般会有一个线性修正单元ReLU,应用到各个像素,将特征图中的所有小于0 的像素值设置为零。目的:在 ConvNet 中引入非线性。因为在大部分时候希望 ConvNet 学习的实际数据是非线性的。
池化函数可以逐渐降低输入表示的空间尺度。空间池化(Spatial Pooling)(下采样)降低了各个特征图的维度,但可以保持大部分重要的信息。使输入表示(特征维度)变得更小,并且网络中的参数和计算的数量更加可控的减小,防止过拟合;使网络对于输入图像中更小的变化、冗余和变换变得不变性(输入的微小冗余将不会改变池化的输出——因为在局部邻域中使用了最大化/平均值的操作);帮助获取图像最大程度上的尺度不变性(准确的词是“不变性”)。可以检测图像中的物体,无论位置在哪里。
空间池化有下面几种方式:最大化、平均化、加和等等。对于最大池化(Max Pooling),我们定义一个空间邻域(比如,2x2 的窗口),并从窗口内的修正特征图中取出最大的元素。
“全连接(Fully Connected)”表明前面层的所有神经元都与下一层的所有神经元连接。全连接层是传统的多层感知器,在输出层使用的是 softmax 激活函数(也可使用像 SVM 的分类器)。
卷积和池化层的输出表示了输入图像的高级特征。
全连接层的目的是为了使用这些特征把输入图像基于训练数据集进行分类
CNN介绍完了,接下来说一下SSD(Single Shot MultiBox Detector)
SSD算法是在原来VGG16的后面添加了几个卷积层来预测offset和confidence(相比之下YOLO算法是采用全连接层),算法的输入是300*300*3,采用conv4_3(得到特征图大小38*38),conv7(19),conv8_2(10),conv9_2(5),conv10_2(3)和conv11_2(1)的输出来预测location和confidence。
SSD网络前面得到的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小(1、为了减少计算与内存的需求;2、最后提取的 feature map 有某种程度上的平移与尺度不变性),不同尺度的特征图都用来做检测。
比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。直接采用卷积对不同的特征图来进行提取检测结果。

SSD学习小结_第2张图片
SSD借鉴了Faster R-CNN中anchor的理念,将 feature map 切分为一个个格子feature map cell,对于每一个格子,设置的一系列固定大小的 default box(先验框) ,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。
SSD学习小结_第3张图片
在特征图的每个cell预测K个box。对于每个box,预测C个类别得分,以及相对于default bounding box的4个偏移值,这样需要(C+4)*k个预测器,在m*n的特征图上将产生(C+4)*k*m*n个预测值。
在SSD结构中,default box不需要和每一层的感受野相对应,特定的特征图负责处理图像中特定尺度的物体。在每个特征图上,default box的尺度计算如下:
SSD学习小结_第4张图片
SSD学习小结_第5张图片
训练过程:

1.先验框匹配
通常称与ground truth匹配的先验框为正样本(其实应该是先验框对应的预测box,不过由于是一一对应的就这样称呼了),反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。一个图片中ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。第二个原则是:对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU最大的那个先验框进行匹配。
首先要确保某个ground truth一定有一个先验框与之匹配。
尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
2.损失函数
损失函数定义为位置误差(locatization loss, loc)与置信度误差(confidence loss, conf)的加权和。位置误差仅针对正样本进行计算。具体计算公式详见论文(偷个懒)。
3.数据扩增
采用数据扩增(Data Augmentation)可以提升SSD的性能,主要采用的技术有水平翻转(horizontal flip),随机裁剪加颜色扭曲(random crop & color distortion),随机采集块域(Randomly sample a patch)(获取小目标训练样本)。
预测过程
预测过程比较简单,对于每个预测框,首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数(解码后一般还需要做clip,防止预测框位置超出图片)。解码之后,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。
NMS算法:
将所有框的得分排序,选中最高分及其对应的框
遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,就将框删除
从剩下未处理的框中继续选一个得分最高的,重复上述过程。

你可能感兴趣的:(SSD学习小结)