Swin Transformer测试过程

整体结构由四部分构成:backbone、neck、rpn_head、roi_head。可以选择Mask-Rcnn和cascade-cnn两种结构,如图1左上角

1.backbone

由四个BasicLayer组成,包含blocks和downsample两个结构。blocks中包含若干个基本transformer模块,downsample负责下采样。以输入图象(3,800,1216)为例,首先经过patch_embed变成(96,200,304),依次输入4个BasicLayer。输出out依次为:(1,96,200,304)(1,192,100,152)(1,384,50,76)(1,768,25,38)。将输出out送进FPN
在这里插入图片描述
在这里插入图片描述

2.neck

如上图所示,先将输出通道变成256维(通过4个全连接),然后上层特征图通过双线性插值(F.interpolate)加到下一层特征图中。是典型的金字塔结构。最后最上层特征图(25,38,256)直接maxpool生成第五层特征图(13,19,256).

3.rpn_head

如上图第4部分,用三个卷积,把5层特征图—>分类和回归。3通道代表3个anchor(2:1,1:1,1:2),12通道代表:(4个坐标值*3 anchor)
具体运算细节为:根据score(如200,308,3)分数得到每层前1000个目标,然后加一起,得到bbox:(4751,5)(因为第五层只有13 *19 *3,不足1000个目标)。最后送入nms得到1426个目标,只选1000个得到最后输出的Rois:(1000,5)
在这里插入图片描述

4.roi_head

输入为5层特征图(均为256通道)和rois(1000,5)

4.1。通过计算rois中目标的面积,将其分配到5层特征图(计算公式见下图蓝色)

在这里插入图片描述

4.2。通过函数,将特征图归一化为7*7

# 循环54层特征图i:
roi_feats_t = self.roi_layers[i](feats[i],rois)
# self.roi_layers:RoIAlign(out=(7,7,scale=0.25)
                   RoIAlign(out=(7,7,scale=0.125)
                   RoIAlign(out=(7,7,scale=0.0625) 
                   RoIAlign(out=(7,7,scale=0.03175)

以第一层特征图为例,feats[i]为(1,200,304,256),rois为(689,5)。689是从1000个感兴趣区域中计算出的属于第一层特征图的目标。
输出roi_feats_t维度为(689,256,7,7)。
最终输出roi_feats维度为(1000,256,7,7)

4.3。将特征图(1000,256,7,7,):分类+回归

cls_score,bbox_pred = self.bbox_head(bbox_feats)
# (1000,81)  (1000,320)
det_bbox,det_label = multiclass_nms(bbox,score)
# (57,5) (57) 

到此预测结束。

猜你喜欢

转载自blog.csdn.net/qq_45752541/article/details/119978260