本文最后更新于89 天前,其中的信息可能已经过时,如有错误请发送邮件到c550129432@163.com
原文作者明确表示不会发布训练和评估代码,本篇文章使用的代码为非官方版本。
环境配置
作者提供了具体的makefile,并且推荐使用Python
3.6.1版本。然而,安装后通过conda环境启动时,犯病无法检测到pip(pip3)工具。为了解决这个问题,需要对makefile进行调整。需要注意的是,在编辑makefile时,要使用Tab键作为缩进符号,因为某些编辑器(如vscode)可能会自动将Tab转换为空格。可以通过在编辑器右下角选择“缩进”并点击“convert
indentation to Tabs”来修复此问题。
install:
python -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python -m pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple
sh setup.sh
然后,运行相应指令进行配置。需要注意的是,在配置过程中,系统会要求输入data根目录(Path of the directory where datasets are stored and
read)和logs保存路径(Path of the directory where experiments data (logs, checkpoints, configs) are written)。
由于主包的服务器CUDA环境与要求不完全匹配,缺少libcublas.so.9.0文件。最简单的解决方法是直接使用Conda安装与GPU兼容的TensorFlow版本。
直接运行代码时会报错
KeyError: 'CUDA_VISIBLE_DEVICES',因此需要提前指定GPU。由于实习公司的服务器只为主包分配了较低配置的设备(8张NVIDIA TITAN
Xp,12GB),主包决定选择使用其中的四个GPU。可以通过以下命令指定使用的GPU:
export CUDA_VISIBLE_DEVICES=0,1,2,3,在训练时可能对应输入不匹配,记得去yaml配置文件中去修改eval_batch_size使得分配GPU依然匹配输入,如果显存爆了,可以降低batch_size。
conda install tensorflow-gpu==1.12 cudatoolkit=9.0 cudnn=7.1 -c anaconda
模型准备
1) MagicPoint
MagicPoint特征检测器需要使用合成形状数据集(Synthetic Shapes
Dataset)进行训练,该数据集包含9种不同的形状(包括椭圆和高斯噪声,作为负样本),并且提供.npy文件记录特征点坐标作为标签进行训练。
作者已经准备了自动生成合成数据集的代码,我们只需直接运行训练即可。
在使用PyYAML≥5.1时,yaml.load需要显式指定Loader,否则会抛出如下错误:
TypeError: load() missing 1 required positional argument: 'Loader'。
为了避免此错误,我们需要将第153行改为使用 yaml.safe_load(f)。
在生成合成图形数据时,代码会访问 os.environ['TMPDIR'],因此需要配置该环境变量。可以通过以下命令设置:export TMPDIR=""
python experiment.py train configs/magic-point_shapes.yaml magic-point_synth(模型)
训练代码如上,其中
magic-point_synth 是实验名称,可以根据需要更改为任何名称。训练过程可以随时通过按 Ctrl+C 中断,训练权重将保存在
EXPER_PATH/magic-point_synth/ 目录中,其中也包括了TensorBoard的记录文件。
在第一次训练时,系统将生成合成形状数据集,并将数据保存在指定文件夹中。
magic-point_shapes.yaml 文件中包含了各种可修改的训练参数和数据配置。如果训练有困难,可以选择直接使用预训练的模型,将其放置到设置好的logs目录下。
2) 自标注
得到训练后的MagicPoint检测器后,我们可以使用它对真实图像数据集进行标注,获得伪真实(pseudo-ground truth)的数据和标签。在这一过程中,进行了一个名为Homographic Adaptation的图像处理操作。此操作可以在
首先,修改图像的尺寸和位置,如:
yaml 文件中进行配置,选择是否开启或关闭该功能。在这一步,我们便可以替换成自己的数据集,进行标注。原文使用的是 COCO 数据集,所以需要对 coco.py 进行一些修改。
首先,修改图像的尺寸和位置,如:
'resize': [], data_path。要注意代码需要路径下直接是图像数据,可以根据需求进行修改,标签保存也同样需要进行修改。如果想修改数据集的名称,可以修改 name:'',然后将文件和类名也进行相应修改。
python export_detections.py configs/magic-point_coco_export.yaml magic-point_synth --pred_only --batch_size=5 --export_name=magic-point_coco-export1
训练
1) 重训练 MagicPoint
训练完成后,我们可以重复进行上一步骤和此步骤,以达到较好的效果。
重训练
在第一步中训练得到的 MagicPoint
检测器虽然能够检测出一些特征点,但由于其使用的是合成形状数据集进行训练,检测性能仍有所不足。因此,在第二步中,我们通过自标注数据,并使用标注好的真实图像进行训练,最终得到增强版的检测器。
修改 labels 路径,将第二步得到的 npz 文件夹路径替换到
修改 labels 路径,将第二步得到的 npz 文件夹路径替换到
magic-point_coco_train.yaml 中。
微调
这里是可以选择直接使用在coco数据集上预训练好的模型来进行微调训练的。python experiment.py train configs/magic-point_coco_train.yaml magic-point_coco(模型)
python experiment.py train configs/magic-point_coco_train.yaml magic-point_finetuned(模型) --pretrained_model mp_synth-v11_ha1_trained(预训练模型)
2) 训练 Superpoint
训练(从头训练)
将「最后导出的标签(labels)」用于 SuperPoint 训练。需要在
superpoint_coco.yaml 中把 data/label(或同等字段)指向你的标签目录。
确保 resize 参数对齐:训练时的 resize / 输入分辨率必须与标签生成(导出)时的 resize 保持一致,否则关键点坐标会错位
微调
SuperPoint 也支持直接在已有权重上进行微调。
python experiment.py train configs/superpoint_coco.yaml superpoint_coco(模型)
python experiment.py train configs/superpoint_coco.yaml superpoint_coco__finetuned(模型) --pretrained_model sp_v6(预训练模型)
