#参考太阳花的小绿豆
1.model总体部分
model即FasterRCNN,其中FasterRCNN主要由transform,resnet50_fpn_backbone(backbone),rpn和roi_heads组成。
transform是将图片进行预处理以及后处理
rpn
roi_heads由transform(采样proposals)box_roi_pool(将rpn映射成相同大小的特征向量),box_head(两层全连接层),box_predictor(预测类别和回归参数层)组成
代码中FasterRCNN继承了FasterRCNNBase,FasterRCNN将backbone, rpn, roi_heads, transform放入FasterRCNNBase,最终由FasterRCNNBase进行forward。
特别模块(训练阶段):
1.rpn模块
rpn由RPNHead,AnchorsGenerator,concat_box_prediction_layers,filter_proposals,assign_targets_to_anchors,encode,compute_loss等组成
RPNHead:如图所示,由cls_logits(仅预测是哪种anchor的可能性更大,所以只有3个),box_pred分别预测分数和回归参数
AnchorsGenerator:根据特征图在原图位置上生成锚框模板
rpn的anchor,预测的参数和gtbox相当于后续的roihead中的proposal,预测的参数和gtbox,rpn的proposal只是将anchor和预测参数结合起来的
concat_box_prediction_layers:将objectness和pred_bbox_deltas打包成b个数1和b个数4
filter_proposals:筛除prososals的小boxes框,nms处理,根据预测概率(cls_logits)获取前post_nms_top_n个目标
decode:将预测的回归参数与生成的anchor进行结合得到最终的proposals,注意预测公式的变换比如xyxy到xywh
_get_top_n_idx:将cls_logits前多少的proposal取出
assign_targets_to_anchors:计算每个anchors最匹配的gt,并将anchors进行分类,前景,背景以及废弃的anchors
encode:结合anchors以及对应的gt,计算regression参数
compute_loss:将
有待完善
2.roihead中的正采样模块(select_training_samples)
首先进行预处理(将targets模块的类别与位置读出并存储),用add_gt_proposals函数将proposals对应的目标也纳入proposals,后assign_targets_to_proposals函数将proposals匹配对应的gtbox
assign_targets_to_proposals:将每张图片的proposals与gtbox做iou,生成gtbox * proposals的矩阵,然后选出每个proposals的iou最大的gtbox,形成proposals * 1矩阵,并将负样本置为0
并用subsample划分正负样本
subsample:将proposals采样一部分样本
接着获取经过采样后的proposals对应的gtbox的边界框和标签,以及计算这时候的proposals与gtbox的边界框的差值(边框回归参数),以便于后续将这个差值与box_pred的进行损失计算
题外话:yolov5是在每个特征层上的像素点生成锚框,然后正采样是根据gtbox的大小选出anchor模板,再根据自己和自己上方和左方的三个grid_cell得到相应的正样本
fcos与yolov5有异曲同工之妙,也是在像素点上预测4个位置,经过正采样后计算损失
3.损失模块
note:box_pred是n * c * 4(对每个类别进行预测回归参数),而不是n * 4,因此计算loss时需要取出proposal对应的类别的回归参数。计算类别损失是将正负样本都计算进去,而计算回归参数的损失则只使用了正样本。