https://github.com/cvg/LightGlue

环境配置

网络结构

数据集、训练、测试

https://github.com/cvg/glue-factory

遇到的核心问题之一:Key名称不同

https://github.com/cvg/glue-factory/issues/49

问题描述:

  1. 训练流程正常,但是最后得到的点非常非常少,很多时候都没有,大大降低filter_threshold后才可以得到少数的点,但是这些点的错误率较高。
  2. 把官方权重Pth读取进来并且进行训练,发现loss很大,后续loss快速降低,但是推理后仍然得到1的问题。

成因:

可通过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

个人所修改的东西

  1. 为了方便在推理的时候读取本地权重,把网上的官方权重下载下来之后,修改lightglue/lightglue.py内容。