@torch.no_grad()
def forward(self, image: torch.Tensor) ->tuple[torch.Tensor, torch.Tensor, torch.Tensor,torch.Tensor,torch.Tensor]:
backbone_out = self.image_encoder(image) # {"vision_features","vision_pos_enc","backbone_fpn"}
backbone_out["backbone_fpn"][0] = self.model.sam_mask_decoder.conv_s0(backbone_out["backbone_fpn"][0])
backbone_out["backbone_fpn"][1] = self.model.sam_mask_decoder.conv_s1(backbone_out["backbone_fpn"][1])
vision_pos_enc = backbone_out["vision_pos_enc"] # 有3个tensor
backbone_fpn = backbone_out["backbone_fpn"] # 有3个tensor
pix_feat = backbone_out["vision_features"] # 有1个tensor
expanded_backbone_out = {
"backbone_fpn": backbone_fpn,
"vision_pos_enc": vision_pos_enc,
}
for i, feat in enumerate(expanded_backbone_out["backbone_fpn"]):
expanded_backbone_out["backbone_fpn"][i] = feat.expand(1, -1, -1, -1)
for i, pos in enumerate(expanded_backbone_out["vision_pos_enc"]):
expanded_backbone_out["vision_pos_enc"][i] = pos.expand(1, -1, -1, -1)
(_,current_vision_feats,current_vision_pos_embeds,_) = self.prepare_backbone_features(expanded_backbone_out)
current_vision_feat = current_vision_feats[-1] + self.no_mem_embed
current_vision_feat2 = current_vision_feat.reshape(64,64,1,256).permute(2, 3, 0, 1) # [1,256,64,64]
# flatten HWxNxC -> NxCxHxW
high_res_features_0 = current_vision_feats[0].reshape(256,256, 1, 32).permute(2, 3, 0, 1) # [1, 32, 256, 256]
high_res_features_1 = current_vision_feats[1].reshape(128,128, 1, 64).permute(2, 3, 0, 1) # [1, 64, 128, 128]
# pix_feat [1, 256, 64, 64]
# high_res_features_0 [1, 32, 256, 256]
# high_res_features_1 [1, 64, 128, 128]
# current_vision_feat [1, 256, 64, 64]
# current_vision_pos_embed2 [4096, 1, 256]
return pix_feat,high_res_features_0,high_res_features_1,current_vision_feat2,current_vision_pos_embeds[-1]
image_encoder模型的输出是7个参数,经过该函数调整后变成5个参数,但是这个python代码,导出的self.image_encoder模型不应该还是输出7个参数吗,但我去看导出的模型,输出还是5个参数,是在哪里更改的模型?
class ImageEncoder(nn.Module):
def init(self, sam_model: SAM2Base) -> None:
super().init()
self.model = sam_model
self.no_mem_embed = sam_model.no_mem_embed #[1,1,256]
self.image_encoder = sam_model.image_encoder
self.num_feature_levels = sam_model.num_feature_levels
self.prepare_backbone_features = sam_model. _prepare_backbone_features
image_encoder模型的输出是7个参数,经过该函数调整后变成5个参数,但是这个python代码,导出的self.image_encoder模型不应该还是输出7个参数吗,但我去看导出的模型,输出还是5个参数,是在哪里更改的模型?