MMDetection 整体构建流程(一)
训练核心组件
训练部分一般包括 9 个核心组件,总体流程是:
- 任何一个 batch 的图片先输入到 backbone 中进行特征提取,典型的骨干网络是 ResNet
- 输出的单尺度或者多尺度特征图输入到 neck 模块中进行特征融合或者增强,典型的 neck 是 FPN
- 上述多尺度特征最终输入到 head 部分,一般都会包括分类和回归分支输出
- 在整个网络构建阶段都可以引入一些即插即用增强算子来增加提取提取能力,典型的例如 SPP、DCN 等等
- 目标检测 head 输出一般是特征图,对于分类任务存在严重的正负样本不平衡,可以通过正负样本属性分配和采样控制
- 为了方便收敛和平衡多分支,一般都会对 gt bbox 进行编码
- 最后一步是计算分类和回归 loss,进行训练
- 在训练过程中也包括非常多的 trick,例如优化器选择等,参数调节也非常关键
BackBone
特征提取网络,不用多说
Neck
特征融合和特征增强,特征金字塔
Head
目标检测算法输出一般包括分类和框坐标回归两个分支,不同算法 head 模块复杂程度不一样,灵活度比较高。在网络构建方面,理解目标检测算法主要是要理解 head 模块。
MMDetection 中 head 模块又划分为 two-stage 所需的 RoIHead 和 one-stage 所需的 DenseHead,也就是说所有的 one-stage 算法的 head 模块都在mmdet/models/dense_heads
中,而 two-stage 算法还包括额外的mmdet/models/roi_heads
。
一言以蔽之,Head就是为了输出分类和坐标回归的分支
Enhance
缝合模块,即插即用算子,ex SPP,attention机制
BBox Assigner
正负样本划分策略
BBox Sampler
用于正负样本平衡,解决负样本数量过多的策略
BBox Encoder
gt box编码策略
Loss
不必多说,包括box loss和cls loss
Training tricks
训练技巧非常多,常说的调参很大一部分工作都是在设置这部分超参。
测试核心组件
BBox Decoder
gt box解码
训练测试代码示例
class SingleStageDetector(---): def __init__(...): # 构建骨架、neck和head self.backbone = build_backbone(backbone) if neck is not None: self.neck = build_neck(neck) self.bbox_head = build_head(bbox_head) def forward_train(---): # 先运行backbone+neck进行特征提取 x = self.extract_feat(img) # 对head进行forward train,输出loss losses = self.bbox_head.forward_train(x, img_metas, gt_bboxes, gt_labels, gt_bboxes_ignore) return losses def simple_test(---): # 先运行backbone+neck进行特征提取 x = self.extract_feat(img) # head输出预测特征图 outs = self.bbox_head(x) # bbox解码和还原 bbox_list = self.bbox_head.get_bboxes( *outs, img_metas, rescale=rescale) # 重组结果返回 bbox_results = [ bbox2result(det_bboxes, det_labels, self.bbox_head.num_classes) for det_bboxes, det_labels in bbox_list ] return bbox_results