一、基础网络结构(预训练好的ResNet101).
conv1 | conv(7x7),BN,ReLU,maxpool(3x3) |
conv2(3) | 1:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(1x1),BN 相加,ReLU 2-3:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN 相加,ReLU |
conv3(4) | 1:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(1x1),BN 相加,ReLU 2-4:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN 相加,ReLU |
conv4(23) | 1:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(1x1),BN 相加,ReLU 2-23:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN 相加,ReLU |
conv5(3) | (这里dilation取值与前面不同) 1:conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, 相加,ReLU |
二、额外添加的特征提取层
add1 | conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(3x3),BN 相加,ReLU |
add2 | conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(3x3),BN 相加,ReLU |
add3 | conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(3x3),BN 相加,ReLU |
add4 | conv(1x1),BN,ReLU,conv(3x3),BN.ReLU,conv(1x1),BN, downsample:conv(3x3),BN 相加,ReLU |
至此,该网络可以获得原始的6个尺度不一的特征图(从conv3,conv5,add1,add2,add3,add4获得)
尺寸分别为[40,20,10,5,3,1]。【但是不是本文最终获取的特征图】
三、反卷积层
采用反卷积层的好处:1.可以提高检测精度;
2.可以获得上下文的信息,提高特征图的分辨率
具体操作:两个尺度不一的特征图分别通过普通卷积和反卷积进行特征融合。
1.普通卷积:conv(3x3),BN,ReLU,conv(3x3),BN
2.反卷积:deconv(2x2),conv(3x3),BN
3.拼接:元素求积 ,BN。
四、预测模块(其实是由残差模块组成)
1.卷积:conv(1x1),conv(1x1),conv(1x1)
2.shortcut:conv(1x1)
3.拼接:元素求和
五、LOC,CLS
经过主干网络以及反卷积操作后,得到6个尺度不一的特征图,尺度分别为[40,20,10,5,3,1];将所获得的特征图经过预测模块,分为预测cls与loc两个分支,将其分别进行3x3卷积,得到预测的最终输出。
六、关于锚框生成问题,代码没怎么看明白,所以弄不清楚与原SSD的锚框设置是否相同
七、损失函数。
求解损失函数前,得先弄清楚锚框。
首先选择正样本,根据iou值以及匹配原则,筛选出正样本;对于不满足条件的均设为负样本。
但是,如果不对所得的负样本进行筛选的话,会出现正负样本比例不均衡的问题。
所以采用HNM策略,将正负样本的比例控制在1:3左右。
然后,再根据论文中所给的损失函数公式进行计算,得到loc损失,cls损失。
八、NMS
这一步是对检测结果进行进一步的精确。
代码已跑成功,精度77.08(论文77.6)
安排一张图