1.Faster rcnn
1.1.概述
- anchor本身的设置是基于各层输出分辨率上的各点,由各点回归出anchor的偏移量,预测anchor的类别;故anchor的布局需要和各层输出分辨率对应。
- 输出分辨率各点anchor的数量和尺寸是可以调整的,其设置的合理与否,决定了网络的训练难易程度和模型的精度。
- anchor大小的设置是对应到输入分辨率【即训练分辨率】大小,和原图大小和输出分辨率无关。
1.2.anchor生成步骤
a) 在rpn网络初始化的同时,完成基础anchor的构建
class RPNHead(AnchorHead):
def __init__(self, in_channels,
......
seperable=False,
**kwargs):
......
super(RPNHead, self).__init__(2, in_channels, **kwargs)
class AnchorHead(nn.Module):
def __init__(self,
num_classes,
.......
anchor_scales=[8, 16, 32],
anchor_ratios=[0.5, 1.0, 2.0],
anchor_strides=[4, 8, 16, 32, 64],
anchor_base_sizes=None,
......
super(AnchorHead, self).__init__()
self.num_classes = num_classes
self.anchor_scales = anchor_scales
self.anchor_ratios = anchor_ratios
self.anchor_strides = anchor_strides
self.anchor_base_sizes = list(
anchor_strides) if anchor_base_sizes is None else anchor_base_sizes
self.anchor_generators = []
for anchor_base in self.anchor_base_sizes:
self.anchor_generators.append(
AnchorGenerator(anchor_base, anchor_scales, anchor_ratios))
self.num_anchors = len(self.anchor_ratios) * len(self.anchor_scales)
#对于fpn的网络结构,如果各层设置多个self.anchor_scales,参考方案如下:
# self.anchor_generators = []
# if len(self.anchor_scales)>1:
# assert len(self.anchor_base_sizes) == len(self.anchor_scales)
# for i, anchor_base in enumerate(self.anchor_base_sizes):
# self.anchor_generators.append(
# AnchorGenerator(anchor_base,self.anchor_scales[i],anchor_ratios)
# )
# self.num_anchors = len(self.anchor_ratios) * len(self.anchor_scales[0])
# else:
# for anchor_base in self.anchor_base_sizes:
# self.anchor_generators.append(
# AnchorGenerator(anchor_base, anchor_scales, anchor_ratios))
# self.num_anchors = len(self.anchor_ratios) * len(self.anchor_scales)
相关参数解释:
#anchor基础尺寸的缩放比例,是控制anchor大小最重要的参数
self.anchor_scales = anchor_scales
#anchor的长宽比例设置
self.anchor_ratios = anchor_ratios
#anchor步长设置【和下采样倍数对应,如果不对应将导致图片部分区域没有anchor或anchor的设置超过图片边缘】
self.anchor_strides = anchor_strides
#anchor基础尺寸,可以设置多个,一般等于各层下采样倍数【anchor_stride】即可,anchor的尺寸可以通过self.anchor_scales进行设置
self.anchor_base_sizes = list(anchor_strides