LiYunfengLYF / LightFC

MIT License
27 stars 2 forks source link

tinyvit版本中的ecm中的PWCorr_SE_SCF31_IAB11_Concat_Release是否为更新? #6

Open Hgg12 opened 4 months ago

Hgg12 commented 4 months ago

您好,请问tinyvit版本中的ecm模块中的PWCorr_SE_SCF31_IAB11_Concat_Release是否未更新在代码库中,现在的ecm模块中还是mobilnetv2版本中的pwcorr_se_scf_sc_iab_sc_concat。

LiYunfengLYF commented 4 months ago

tinyvit中使用的PWCorr_SE_SCF31_IAB11_Concat_Release和mobilnetv2版本中的pwcorr_se_scf_sc_iab_sc_concat是一样结构,直接在yaml文件里面改一下名就能使用的,然后我将会后续的更新中修复这些小问题的

Hgg12 commented 4 months ago

def forward(self, z, x): if self.training: z = self.backbone(z) x = self.backbone(x)

        opt = self.fusion(z, x)

        out = self.head(opt)
    else:
        z = self.backbone(z)  #这行是我自己加的  
        return self.forward_tracking(z, x)
    return out

#
def forward_backbone(self, z):
    z = self.backbone(z)
    return z

def forward_tracking(self, z_feat, x):
    x = self.backbone(x)
    opt = self.fusion(z_feat, x)
    out = self.head(opt)
    return out

训练过程中训练到验证集时会报错,为了使训练继续进行在tracker_model.py中我加了一行代码z = self.backbone(z),似乎是验证集走的是和训练集一样的模块,z需要先经过主干,不知是否是代码上传错误?

LiYunfengLYF commented 4 months ago

我找到了问题,这个是我之前为了方便部署,然后修改了一些模型,导致在评估时,传入ECM模块的是原始的图像信息而不是提取的特征,具体修改如下 class LightFC(nn.Module): def init(self, cfg, env_num=0, training=False, ): super(LightFC, self).init()

if cfg.MODEL.BACKBONE.TYPE == 'MobileNetV2':
    self.backbone = MobileNetV2()
elif cfg.MODEL.BACKBONE.TYPE == 'tiny_vit_5m_224':
    self.backbone = tiny_vit_5m_224()
self.training = training
if self.train:
    load_pretrain(self.backbone, env_num=env_num, training=training, cfg=cfg, mode=cfg.MODEL.BACKBONE.LOAD_MODE)

self.fusion = pwcorr_se_scf_sc_iab_sc_concat(num_kernel=cfg.MODEL.FUSION.PARAMS.num_kernel,
                                             adj_channel=cfg.MODEL.FUSION.PARAMS.adj_channel
                                             )

self.head = repn33_se_center_concat(inplanes=cfg.MODEL.HEAD.PARAMS.inplanes,
                                    channel=cfg.MODEL.HEAD.PARAMS.channel,
                                    feat_sz=cfg.MODEL.HEAD.PARAMS.feat_sz,
                                    stride=cfg.MODEL.HEAD.PARAMS.stride,
                                    freeze_bn=cfg.MODEL.HEAD.PARAMS.freeze_bn,
                                    )

def forward(self, z, x): if self.training: z = self.backbone(z) x = self.backbone(x) opt = self.fusion(z, x) out = self.head(opt) else: z = self.backbone(z) # 这里是要修改的地方 return self.forward_tracking(z, x) return out

# def forward_backbone(self, z): z = self.backbone(z) return z

def forward_tracking(self, z_feat, x): x = self.backbone(x) opt = self.fusion(z_feat, x) out = self.head(opt) return out

Hgg12 commented 4 months ago

好的,感谢!我还有一个疑问,就是代码推理时所走ecm模块跟训练时一样,并不是论文中所说的推理时ecm模块中scf变为conv3x3

LiYunfengLYF commented 4 months ago

是的,推理时候不需要再额外转换,实际上转换后的模型也节省不了多少参数

Yinkuan commented 3 months ago

为什么我训练默认是在CPU上进行的,按照说明设置的参数。但测试就是在gpu上跑的