1、SSD网络结构
SSD采用VGG16的基础网络结构,使用前面的前5层,然后利用astrous算法将fc6和fc7层转换成两个卷积层,并且对conv4_3输出做正则化处理。再额外增加3个卷积层,和一个average pool层。不同层次的feature map分别用于default box的偏移以及不同类别得分预测,最后通过NMS得到最终的检测结果。不同卷积层的feature map大小变化比较大,能够检测出不同尺度下的物体,在不同的feature map进行卷积,可以达到多尺度的目的。
横向流程图
2、分类和回归
这步主要完成三个操作:生成prior box、做卷积->定位(localization)、做卷积->分类(confidence)。(以5x5x256为例)
2.1、卷积->回归
对feature map做卷积,使用的卷积核都是3x3,回归得到每个预测框的x、y、w、h。输出的通道数为default box的个数4。
2.2、卷积->分类
卷积核的数目跟分类数目相关。对feature map做卷积,使用3x3的卷积核,输出的通道数(卷积核个数)为default box的个数分类数目。
2.3、生成prior box
区别于default box,default box有4个参数,而prior box是从位置回归的feature map中生成的,它有8个参数,4个location维度+4个偏置(回归所需的参数)。从代码看,default box输入重写的Keras层生成prior box。
2.4、如何生成default box
按照不同的scale和ratio生成s个default box,s默认是6,对于conv4_3,s的值为4。
scale:假设使用m个不同层的feature map来做预测,论文中最低层的feature map的scale的值 为0.2,最高层的值 为0.9,其他层通过下面的公式计算得到
当前网络使用了6个feature map,即m=6。
ratio:使用ratio的值 ,计算default box的宽度和高度, ,另外对ratio=1的情况,额外指定scale为 ,即生成6个不同的default box。
default box中心:每个default box的中心位置设置成 ,其中 表示第k个特征图的大小, 。
这些参数都是相对于原图的参数,不是最终值。
2.5、如何生成prior box
将原图切割成feature_map_width*feature_map_height个小矩形格,比如原图大小为300x300,feature map大小为5x5,那么每个小格的尺寸为60x60。获取每个小格的宽和高,获取每个小格的起始坐标。
首先,boxes_tensor=np.zeros((feature_map_height, feature_map_width, self.n_boxes, 4))创建一个四维矩阵,代表的是每个feature map的每个特征点有n_boxes个prior box,而每个prior box有x,y,w,h四个参数来定义一个prior box。接下来是把prior box超出原图边界的修正下. 然后再创建一个variances_tensor,它和上面的boxes_tensor维度一样,只不过它的值都为0加上variance.然后将variances_tensor和boxes_tensor做连接操作。所以生成的prior box 会变成
size= [feature_map_height,feature_map_width,n_boxes,8]。
2.6、转换特征矩阵
对【分类】步骤的结果reshape:[n_boxes_conv6_2n_classes,5,5]即[21x4,5,5])–>[-1,n_classes]
对【回归】步骤的结果reshape: [n_boxes_conv6_24,5,5] 即[4x4,5,5])–>[-1,4]
对【priorbox】步骤的结果reshape:[n_boxes_conv6_2*8,5,5]即[4x8,5,5])–>[-1,8]
2.7、连接
连接所有的分类,回归,prior box。从代码上来看,所有的分类走一条线,回归走一条线,生成prior box走一条线。回归和prior box所生成的结果是相互独立的,而分类的结果之间是相互影响的,最后做一个softmax实现多分类。
3、非极大值抑制NMS
将所有框的得分排序,选中最高分及其对应的框
遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除。
从未处理的框中继续选一个得分最高的,重复上述过程。
4、损失函数
损失函数定义为位置误差(locatization loss,loc)与置信度误差(confidence loss, conf)的加权和:
其中 是先验框的正样本数量。这里 为一个指示参数,当 时表示第 个先验框与第 个ground truth匹配,并且ground truth的类别为 。 为类别置信度预测值。 为先验框的所对应边界框的位置预测值,而 是ground truth的位置参数。对于位置误差,其采用Smooth L1 loss,定义如下:
由于 的存在,所以位置误差仅针对正样本进行计算。值得注意的是,要先对ground truth的 进行编码得到 ,因为预测值 也是编码值。对于置信度误差,其采用softmax loss:
权重系数 通过交叉验证设置为1。
5、Hard Negative Mining
用于预测的 feature map 上的每个点都对应有 6 个不同的 default box,绝大部分的 default box 都是负样本,导致了正负样本不平衡。在训练过程中,采用了 Hard Negative Mining 的策略(根据confidence loss对所有的box进行排序,使正负例的比例保持在1:3) 来平衡正负样本的比率。这样做能提高4%左右。
6、匹配策略
这里的匹配是指的ground truth和Default box的匹配。
主要是分为两步:第一步是根据最大的overlap将ground truth和default box进行匹配(根据ground truth找到default box中IOU最大的作为正样本)。
第二步是将default boxes与overlap大于某个阈值的ground truth进行匹配。
7、Data Augmentation
使用整张图像作为输入。
使用IOU和目标物体为0.1、0.3、0.5、0.7和0.9的patch,这些patch在原图的大小的[0.1, 1]之间,相应的宽高比在[1/2, 2]之间。
随机采取一个patch。
8、
VGG 16结构如下图所示:
为什么使用3x3的卷积核,设置步长=1: