https://github.com/cvg/LightGlue
https://github.com/cvg/glue-factory
https://github.com/cvg/glue-factory/issues/49
问题描述:
成因:
可通过keys()命令手动查看权重中各个层的名称。发现:官方给出的PTH权重;自己训练得到的权重;推理时的模型结构。三者的名称是不一样的
解决办法:
作者在lightglue.py的470行左右写了名称转换代码。
if state_dict:
# rename old state dict entries
for i in range(self.conf.n_layers):
pattern = f"matcher.transformers.{i}.self_attn", f"transformers.{i}.self_attn"
state_dict = {k.replace(*pattern): v for k, v in state_dict.items()}
pattern = f"matcher.transformers.{i}.cross_attn", f"transformers.{i}.cross_attn"
state_dict = {k.replace(*pattern): v for k, v in state_dict.items()}
self.load_state_dict(state_dict, strict=False)
可见,此处主要是把matcher.transformers.{i}.self_attn的格式转化为了transformers.{i}.self_attn。
| 官方PTH to 推理 | matcher.transformers.{i}.self_attn | transformers.{i}.self_attn |
|---|---|---|
| matcher.transformers.{i}.cross_attn | transformers.{i}.cross_attn | |
| 自己训练 to 推理 | self_attn.{i} | transformers.{i}.self_attn |
| cross_attn.{i} | transformers.{i}.cross_attn | |
| 官方PTH to 自己训练* | self_attn.{i} | matcher.transformers.{i}.self_attn |
| 此处添加于train.py | cross_attn.{i} | matcher.transformers.{i}.cross_attn |