实例分割算法笔记:yolact网络结构代码详解(2)

297 阅读2分钟

3.代码细节

3.2anchor生成

这里以yolact_base_config为例详解介绍yolact的anchor生成。根据下边的内容可见,设置了五个尺度即scale,并遵循小的特征图上分配大目标的原则,在深层(比如5x5这一层特征图上)分配大尺度的边界框。即5x5特征图上分配384的anchor,9x9的特征图上分配192的anchor,依此类推。并且有三个不同缩放比例,分别是[1,0.5,2],这里采用了开平方对这一比例进行作用,即实际比例是sqrt([1,0.5,2]),最后利用如下公式计算得到prior的大小。 w = scale * ar / cfg.max_size(1)

h = scale / ar / cfg.max_size(2)

scale:'pred_scales': [[24], [48], [96], [192], [384]];

FPN输出的五个多尺度特征图:

(69, 69) (35, 35) (18, 18) (9, 9) (5, 5)

3.3 FPN模块

输入:convouts:List[torch.Tensor]

convouts是一个特征图列表,包含三个特征图分别是:torch.Size([1, 512, 69, 69]) torch.Size([1, 1024, 35, 35]) torch.Size([1, 2048, 18, 18])

深层的特征图经过上采样,达到和上一层一样大小的尺度(比如,一个[1x256x18x18]的特征图经过上采样变为[1x256x35x35]),然后将上采样的特征图和该层本身生成的特征图进行融合,一般是按位相加,特别需要注意,由于这两个层级的特征通道数目不一致,所以需要对原始特征层的特征再次进行卷积(保持大小尺度,但是通道数变为和上采样后的特征一样),最终得到三个多尺度的特征输出分别是torch.Size([1, 256, 69, 69]) torch.Size([1, 256, 35, 35]) torch.Size([1, 256, 18, 18])。