fasterrcnn+fpn代码总结

Fasterrcnn的backbone部分

以resnet50为backbone并且加入了fpn网络,关于fpn就是特征金字塔,简单来说就是融合不同尺度的特征进行检测,既加入底层卷积特征的位置信息对检测小目标很有用,又融合高层卷积特征的语义信息,关于具体实现过程可以看下面的代码分析。
fasterrcnn+fpn代码总结

fasterrcnn+fpn代码总结

transfrom部分

到这里就定义好了backbone部分。fasterrcnn再dataloader读入数据时仅仅做了to tensor转为张量的操作,因此读入的图像尺寸都是不一样的,在送入网络之前还要进行transfrom操作把数据打包成一个batch
fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结

fasterrcnn rpn网络生成建议框

anchorgenerator部分和rpn_head部分

fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结

fasterrcnn+fpn代码总结

rpn网络主体

fasterrcnn+fpn代码总结

fasterrcnn+fpn代码总结

fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结

计算rpn损失

fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结

roi_head部分

经过rpn网络之后每张图片得到了2000个建议框,并且得到了rpn网络的损失函数,然后把得到的2000个建议框送入后续的roihead部分进行roi_pooling到相同的特征大小,然后送入全连接层预测每个框的label和边界框回归参数,在训练阶段需要计算损失,如果是测试阶段则进行后处理,nms处理保留前几个框在原图绘制出来
fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结
fasterrcnn+fpn代码总结

得到class_logits和box_regression之后,需要来计算fasterrcnn roihead部分的损失,计算损失的fastrcnn_loss方法需要class_logits, box_regression, labels, regression_targets四个量,其中class_logits和box_regression是刚刚得到的,labels和regressison_targets是之前得到的。
其中:
labels:List[(512,), (512,), (512,), (512,)]
regression_targets:Tuple((512,4),(512,4),(512,4),(512,4))。
我们把labels和regression_targets在第0个维度上拼接一下得到分别得到2048和(2048,4)的形状
在训练阶段:
使用交叉熵损失函数根据class_logits和labels计算分类损失
使用smoothL1损失计算匹配到正样本处的边界框回归损失
在测试阶段进行后处理操作,通过nms留下需要的候选框