| 673 | self.maskformer_num_feature_levels = num_feature_levels # always use 3 scales |
| 674 | |
| 675 | def forward(self, features): |
| 676 | x, m = features['backbone_output'].decompose() |
| 677 | backbone = self.backbone[0] |
| 678 | Hp, Wp = x.shape[-2:] |
| 679 | pos = backbone.pos_embed.reshape(1, backbone.patch_embed.patch_shape[0], |
| 680 | backbone.patch_embed.patch_shape[1], |
| 681 | backbone.pos_embed.size(2))[:, :Hp, :Wp, :].permute(0, 3, 1, 2) |
| 682 | |
| 683 | if self.pixel_decoder_cfg is None: |
| 684 | out = [op(x) for op in self.fpns][::-1] # [r4, r3, r2, r1] |
| 685 | num_cur_levels = 0 |
| 686 | multi_scale_features = [] |
| 687 | multi_scale_masks = [] |
| 688 | multi_scale_poss = [] |
| 689 | for o in out: |
| 690 | if num_cur_levels < self.maskformer_num_feature_levels: |
| 691 | mask_o = F.interpolate(m[None].float(), size=o.shape[-2:]).to(torch.bool)[0] |
| 692 | multi_scale_features.append(o) |
| 693 | multi_scale_masks.append(mask_o) |
| 694 | pos_l = F.interpolate(pos[None], size=o.shape[-3:], mode='trilinear', align_corners=False)[0] |
| 695 | multi_scale_poss.append(pos_l) |
| 696 | num_cur_levels += 1 |
| 697 | |
| 698 | features.update({'neck_output': {'mask_features': self.mask_features(out[-1]), |
| 699 | 'multi_scale_features': multi_scale_features, |
| 700 | 'multi_scale_masks': multi_scale_masks, |
| 701 | 'multi_scale_pos': multi_scale_poss}}) |
| 702 | else: |
| 703 | raise NotImplementedError |
| 704 | return features |
| 705 | |
| 706 | |
| 707 | class PedDetAlignedFPN(SimpleFPN): |