整个网络结构采用resnet作为backbone,resnet整个网络结构如下:
1 FPN结构,采用conv3_x,conv4_x,conv5_x的结果作为feature pyramid,自上而下进行上采样特征叠加,具体步骤举例:假设输入图片大小为
224
∗
224
224*224
224∗224,对于conv5_x的feature大小为
7
∗
7
7*7
7∗7,采用上采样nn.Upsample(scale_factor=2, mode=‘nearest’),得到
14
∗
14
14*14
14∗14,然后与conv4_x的特征相加,得到最终的conv4_x特征。对于最终conv3_x,conv4_x,conv5_x 特征,在用一层卷积nn.Conv2d(feature_size, feature_size, kernel_size=3, stride=1, padding=1),保持size不变;最后对于conv5_x,采用nn.Conv2d(C5_size, feature_size, kernel_size=3, stride=2, padding=1)两次,分别得到conv6_x,conv7_x(conv5_x,conv6_x,conv7_x不叠加特征), 得到所有conv3_x,conv4_x,conv5_x,conv6_x,conv7_x特征size分别为
28
∗
28
,
14
∗
14
,
7
∗
7
,
4
∗
4
,
2
∗
2
28*28,14*14,7*7,4*4,2*2
28∗28,14∗14,7∗7,4∗4,2∗2
2 生成anchor,对于P3到P7所有的feature,每一层对应的base areas分别为
32
∗
32
32*32
32∗32到
512
∗
512
512*512
512∗512,对应的stride为8到112,aspect ratio为(0.5,1,2.0),又增加三个areas,scales(
2
0
2^0
20,
2
1
/
3
2^{1/3}
21/3,
2
2
/
3
2^{2/3}
22/3),相对于FPN未增加areas scales,Faster Rcnn采用的是(0.5,1,2),最终每一层一个点对应9个anchor,一共有9441个anchor
3 对每一层的anchor,分别计算框偏移,及得分,并未采用roi_pooling, 对于regression和classification,采用相同的网络结构,都是用5层卷积(nn.Conv2d(num_features_in, feature_size, kernel_size=3, padding=1)),但是两个不共享参数,单独分开的。
4 如果是test阶段,根据得到的regression(得到的regression需要减去均值除以标准差),classification利用nms得到最后结果,对于训练阶段,每个anchor只保留与所有框最大IOU结果,然后对于IOU小于0.4的设为背景,大于0.5的认为是前景,然后计算focal loss,具体focal loss参见https://zhuanlan.zhihu.com/p/28527749
5 本文一些tricks,第一 模型初始化对于classification,将最后一个卷积层,权重设为0,bias设为-log((1-pi)/pi),这样在第一个迭代中,可以使得大部分anchor都被分类为背景,那样loss就会小很多(主要处理类别不均衡问题,因为检测大部分都是背景),训练更稳定;采用resnet imagenet预训练模型,会冻结bn层,是因为训练内存问题,本身训练的batch设置很小,而bn层需要很大的batch才有效。
RetinaNet
最新推荐文章于 2025-04-07 22:20:05 发布