Skip to content

image_encoder模型的输出是7个参数,是在哪里修改的模型变成5个参数的? #3

Description

@eakey

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

@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个参数,是在哪里更改的模型?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions