SSD的主要思想:
1.全卷积网络
2.anchor设计
3.多尺度特征融合
#anchor设计:
ssd一共使用了6个不同尺度的特征,每个尺度产生6个不同形状的anchor
1.低维度的特征图尺度大,点比较密集,使用的anchor较小,适合检测小目标
2.高维度的特征图尺度小,点比较稀疏,使用的anchor较大,适合检测大目标
每个anchor的位置计算:
1.首先计算每个网格中心点,映射到原图上的位置
2.然后根据anchor的w h,计算anchor的形状
3.最后anchor归一化到[0,1]之间
anchor的使用:
对于每个特征图,分别计算坐标的回归和目标分类
比如,对于fc7层的特征图(1,1024,19,19)
1.首先,经过(1024 24 3 3)的卷积,pred_box的输出为(1 24 19 19),每个点预测6个box的坐标,经过flatten展平成一维的向量( 1 8664 )
2.其实,经过(1024 126 3 3)的卷积,pred_cof的输出位(1 12619 19),每个点预测21类的概率,经过flatten展平成一维的向量(1 45486)
3.最后,各个层的输出concate到一块,组成一维向量,计算loss的时候再解析出来
loss解析
1.首先是anchor与gt_box的预匹配,过程和RPN类似
对于每个gt_box,查找与其最匹配的anchor,标记为正样本
对于剩下的anchor,计算与每个gt_box的IOU,如果大于阈值,标记为正样本
对于剩下的anchor,计算与每个gt_box的IOU,如果小于阈值,标记为负样本
最后,设置正负样本比例1:3,如果负样本太多,取前k个,标准是:
计算此anchor 21类中最大的conf(一般是背景对应的那一类),然后按照从高到低取前k个
2.正负样本得到之后,坐标回归和分类:
正样本计算corrd回归的loss,同样,gt按照anchor编码
正负样本计算classfication的loss
输出解析
1.首先,根据pred_box和anchor恢复出box
2.其次,对每一类,筛选出conf大于阈值对应的前k个框,进行NMS
3.最后,得到所有输出box的个数,如果大于要输出的数目top_k,则根据conf截取
评估
目标是根据box和anchor,设置正确、错误样本
1.检测出的image_id,但是gt中没有,整个图像的box标记为false
2.检测出的label_id,但是gt中没有,整个label的box标记为false
3.检测出的每一个box,计算与gt的IOU,大于阈值,标记为true,小于阈值,标记为false
另外,SSD的data augment对小目标检测很重要,因为随机crop出来的patch,小目标有可能变成了大物体,但是SSD和YOLO还是不太适合小目标检测
YOLO的主要思想:
1.全卷积网络
2.多尺度特征
3.anchor设计
全卷积网络
类似于RPN,是在某个特征图上,每个点都输出:box coord,obj conf,class conf
多尺度特征
前一级的特征,通过隔点采样,增加channel数目,变成和下一级特征图大小相同
anchor设计:
yolo的anchor,是用所有的gt,归一化之后,聚类而成,相对于SSD更加合理
注意,anchor的大小要映射到检测所在的特征图上
Loss分析
首先,对于每个网格点,根据anchor恢复出每个pred_box
其次,每个pred_box和此图像所有gt_box计算IOU,得到最大值
如果IOU大于阈值,则认为有可能是目标
如果IOU小于阈值,则认为不是目标,计算no obj的梯度
然后,对于每个gt_box,计算其在特征图上的cell位置,
用此cell的每个anchor,与gt_box计算IOU,得到最匹配的anchor
此anchor认为是目标,计算coord的梯度、obj的梯度和分类的softmax
输出
首先,根据anchor恢复出每个cell的每个box,和每个box对应每一类的conf
如果conf大于阈值(0.5),则保留,小于阈值,清零
其次,对于每一类的box,做NMS,输出
评估
首先,同样要恢复出所有box和conf,但此处的conf阈值一般设为0.1
其次,对于每一类的box,做NMS
最后,与gt比较,判断检测正误:
对于每一个gt,在所有输出的box中查找与其最匹配的box
如果IOU大于阈值,此box标记为true,否则标记为false
其余的box标记为false