RetinaNet
https://zhuanlan.zhihu.com/p/346198300
什么是anchor
https://zhuanlan.zhihu.com/p/55824651
Head模块
路径mmdetection/mmdet/models/dense_heads/retina_head.py
head包含两个子网络 分类与锚框回归分支,两个分支不共享权重,但分支内五个FPN输出特征图权重是共享的。head中的卷积网络为五层,前四层的通道数均为256,最后一层的通道数量 分类为self.num_anchors * self.cls_out_channels
,回归为self.num_anchors * 4
1 | if self.use_sigmoid_cls: |
mmcv.cnn.conv_module
包含了卷积、norm、activate三个层。
BBox Assigner
RetinaNet属于anchor-based算法,在bbox分配前需要得到特征图每个位置的anchor列表
参数配置定义
1 | anchor_generator=dict( |
生成anchor_generator对象,对于生成的9个anchor,组内的大小为octave_base_scale * strides
在乘上相应的尺度因子。x坐标从左往右递增,y坐标从上往下递增,最左上方可见像素的坐标是(0,0)
Anchor Generator
代码位置mmdet/core/anchor/anchor_generator.py
核心函数gen_single_level_base_anchors
1 | def gen_single_level_base_anchors(self, |
生成9个anchor 分成三组,每组内的ratio高宽比相同。
_meshgrid
函数快速根据一维x,y坐标生成二维的索引坐标
1 | x = torch.tensor(np.array(range(2))) |
mmdetection中的Retinanet类
在mmdetection中并未对Retinanet做特殊实现,只是用参数初始化了父类SingleStageDetector
,实现文件为mmdet/models/detectors/single_stage.py
1 | class RetinaNet(SingleStageDetector): |