One Stage_SSD 算法

Faster R-CNN 的问题

对小目标检测结果较差:首先他只在一个特征层上进行预测(图片通过backbone 得到的)

由于一张图片通过back bone,经过很多层的卷积 池化得到的特征层,他已经被抽样到很高层次了,而我们抽样层次越高,细节信息的保留就越少,检测小目标通常需要检测这些细节信息,我们在一个高层去预测一个小目标检测效果肯定就没有那么好(高层次的每个像素感受野太大)

模型大,检测速度较慢: 主要原因:分成两步走 先是再RPN结构上进行一次预测,在fast R-CNN又进行了一次预测

SSD 算法的特色

注意 当 布局 stride = 2 时 padding = 1 当 stride = 1 时 padding = 0

这个算法的精彩部分是 整个网络一共有6个预测特征层,我们会在这6个预测特征层上预测不同大小的目标,这样就使得小目标检测变得更为精确,也是比Faster R-CNN的优势 比如在第一层我们会预测相对较小的目标,随着我们抽象程度不断加深,让它检测相对较大的目标

论文指出 改变MaxPool5 从 size 2*2 stride = 2 改为 size 3*3 stride = 1 之前的VGG会在Conv4_3 之后进行一次池化 size 减半 之后 Conv5_3之后再进行一次stride = 2 的池化,只是把最后一次池化的stride , size 改为 1 和 3*3 

 

 (b)的抽象程度会更低一些,会保留的细节信息会更多一些,会在相对底层的特征矩阵上,去预测相对较小的目标,比如说:我们在8*8的feature map 上进行预测这只猫的目标边界框,在[3,3]位置上生成的连个蓝色的default box能够很好的与我们标注的grand truth 匹配 而 4*4的feature map  更适合预测相对更大一点的目标---狗,这就实现了再不同的特征层上预测不同尺度的目标

为什么会生成8732个default box

一共6个预测特征层(Conv4_3,Conv7,Conv8_2,Conv9_2,Conv10_2.Conv11_2),这6个预测特征层每一层的scale(框的面积),以及比例系数如下,一般由如下表中的数值实现,与原论文的实现略有不同

 

其中Conv4_3,Conv10_2,Conv11_2 这三个层用4个default box ,并没有1:3,3;1的比例

Conv7,Conv8_2,Conv9_2 这三个层有6个default box,有1:3 和 3:1的比例,

对于这6个层 都会有一个比例为1的大小为

对于第一个预测特征层(Conv4_3)而言, 就会存在一个比例为1:1 大小为

下表为每个预测特征层的default box的默认大小,比例和数量的汇总

预测特征层1 每个点在原图的位置只有4个default box

预测特整层4 每个点映射到原图上在原图的位置有 6个default box (明显能看到1:3 和3:1的红色框)

如何在这6个预测特征矩阵上,进行预测

对于 size = m*n channel = p 的特征层,我们直接使用卷积核大小为3*3 channel = p的卷积核来进行实现,来生成概率分数,以及边界框偏移量(回归参数)

显然,对于我们特征图上的每一个位置,我们会计算k个default box 我们对每个default box 计算 c个类别分数(包括背景),以及4个坐标偏移量,也就是需要(C+4)*k个卷积核 进行卷积处理,对于大小为m*n的特征层 就会生成 (C+4)*kmn个输出

正负样本的选取

正样本策略 :匹配与grand turth IoU最大的default box,对于任意的一个default box 与任何一个IoU大于0.5

负样本策略(选取背景策略):我们6个特征预测层一共生成了 8732 default box 而default box 匹配到 grand truth 又很少正样本个数几个到十几个,显然把剩下的所有default box 都作为负样本用来训练 这会导致及其不平衡的情况. 首先将剩下的所有负样本计算置信损失进行排序,置信损失越大就代表网络将他预测为目标的概率就越大,这是我们不想看到的状况,将他们选取做负样本进行训练,一般负样本和正样本的数量比例在3:1.(IU :损失越大 说明网络不认识这类特征 就越需要训练)

损失计算

SSD网络搭建

与原论文(backbone:VGG)不同的是基于resnet50的backbone,原论文的预测特征层分别是:

1024*38*38,512*19*19,512*10*10,256*5*5,256*3*3,256*1*1 这六组参数与原论文相同,得到default box 与原论文个数相同

SSD网络有6个预测特征层 分别是Conv4_x的输出,以及后面的5个层的输出

Input 3*300*300(Conv1)--->64*150*150(Conv2_x)--->256*75*75(Conv3_x)--->512*38*38

(Conv4_x)--->1024*38*38(Additional layer1)--->512*19*19(Additional layer2)--->512*10*10

(Additional layer3)--->256*5*5(Additional layer4)--->256*3*3(Additional layer5)--->256*1*1

Conv2_x: 64*150*150(MaxPool1)--->64*75*75(Conv2_1)[64*1*1->64*3*3->256*1*1]

--->256*75*75(Conv2_2......Conv2_3)--->256*75*75

Conv3_x: 256*75*75(Conv3_1)[128*1*1->128*3*3->512*1*1]

--->38*512*512(Conv3_2......Conv3_4)--->38*512*512

# 这里需要指出与Resnet50网络中的Conv4_1不同 虚框残差结构的stride 从2变化为1,也就是输入和输出的size 是一样的,只有channel个数发生变化

Conv4_x: 38*512*512(Conv4_1)[256*1*1->256*3*3->1024*1*1]

--->38*1024*1024(Conv4_2......Conv4_6)--->38*1024*1024

Additional layer1,2,3: 经过两次卷积 每次卷积之后经过BN层和 Relu层

Conv1: 1*1 stride = 1 Conv2: 3*3 stride = 2 padding = 1

Additional layer4,5  经过两次卷积 每次卷积之后经过BN层和 Relu层

Conv1: 1*1 stride = 1 Conv2 3*3 stride - 1 padding = 0

负样本的选取

取前3*pos_num个最大值的算法 通过取降序排列之后的索引,之后对索引进行升序排列,得到升序排列的索引,在对其索引进行pan'duan

Batch:NMS 

蓝色的是类别0 黄色的是类别1

offsets = 类别*(最大值+1) 

offsets = [0, 0, 1.6, 1.6]

偏移之后的坐标

[ [0.1,0.1,0.3,0.3], [0.25,0.25,0.5,0.5],[2.0,1.7,2.1,1.8],[2.05,1.75,2.2,2.0] ]

这样就可以使得不同类别的目标边界框隔离开 这样就可以一次性对所有类别执行nms

计算 gtbox,default box 的 IoU算法

def box_area(boxes):
    return (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])


def calc_iou_tensor(boxes1, boxes2):

# Arguments:
#        boxes1 (Tensor[N, 4])
#        boxes2 (Tensor[M, 4])

    area1 = box_area(boxes1)
    area2 = box_area(boxes2)

    lt = torch.max(boxes1[:, None, :2], boxes2[:, :2])  # left-top [N,M,2]
    rb = torch.min(boxes1[:, None, 2:], boxes2[:, 2:])  # right-bottom [N,M,2]

    wh = (rb - lt).clamp(min=0)  # [N,M,2]
    inter = wh[:, :, 0] * wh[:, :, 1]  # [N,M]

    iou = inter / (area1[:, None] + area2 - inter)
    return iou

想自己总结一个书面的解释:

前提是 计算每个boxes1与boxes2的IoU,IoU指的是交并比,当然boxes1之间的IoU, 以及boxes2之间的IoU不在我们的考虑范围

首先先计算每个框的面积, 公式: S =  (Xmax-Xmin)*(Ymax-Ymin)

之后计算boxes1 与 boxes2 之间的交集面积:

从数学的角度来讲,在二维平面中任意两个框的重叠面积为:不妨设两个框的坐标为(X1min,Y1min,X1max,Y1max),(X2min,Y2min,X2max,Y2max)  必须同时满足x域有重叠,y域有重叠

即[X1min,X1max]∩[X2min,X2max] 非空集 即[X1min,X2min]max < [X1max,X2max]min 才会有重叠,同理Y域也是相同的

正样本的选取

正样本策略 :匹配与grand turth IoU最大的default box,对于任意的一个default box 与任何一个bbox IoU大于0.5



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值