SuperPoint: Self-Supervised Interest Point Detection and Description
被本科毕设支配的恐惧……已经有一周多没有复习复试了
源代码来自于:github。是一个非官方复现,但使用起来非常方便。
首先环境必须匹配,尤其CUDA和CUDNN都要严格一致
OS:Ubuntu18.04
GPU:Cuda 9.0、CuDNN 7.0.5
GCC:5.5
储备知识:单应性变换(Homographic Adaptation),在论文中经常见到这个名词。
具体操作,rpautrat大神已经介绍的很清晰了,我记录一下每一步的结果。
step 0
执行每一步时需要在superpoint目录下运行一个sh文件。而下面这三行要像头文件一样加在sh的首部。
#!/bin/sh
export TMPDIR=/tmp/
export CUDA_VISIBLE_DEVICES=0
step 1 Training MagicPoint on Synthetic Shapes
第一步是使用超级简单的形状来训练magicPoint网络。比如线段,长方形,正方体等。因为对于特征点这种东西,生活场景中的图片人类是无法标注的,每个人标注出来的可能都不一样,那还怎么训练呢,所以作者提出先使用最简单的图案来训练magicPoint,使其有一个最初步的寻找feature的能力。
python3 experiment.py train configs/magic-point_shapes.yaml magic-point_synth
我这里50000轮后的结果:
但此时的SuperPoint的特征提取能力还很差,用DeTone的原话说就是 “However, when compared to classical interest point detectors on a diverse set of image textures and patterns, MagicPoint misses many potential interest point locations.”
所以“To bridge this gap in performance on real images, we developed a multi-scale, multi-transform technique − Homographic Adaptation.”
所以还需通过一个Homographic Adaptation,这也是论文的核心贡献,使得真正的自监督训练成为可能。
step 2 Exporting detections on MS-COCO
此时的magicPoint已经具备一定寻找特征点的能力,虽然看上去准确度还并不高。作者让magicPoint对COCO2014的数据集进行标注,将结果保存在$EXPER_DIR/outputs/magic-point_coco-export1/
中。自监督训练的第一步。
python3 export_detections.py configs/magic-point_coco_export.yaml magic-point_synth --pred_only --batch_size=5 --export_name=magic-point_coco-export1
我特意在自己电脑上又下了一份COCO train2014,图片有8万多张,解压后12.5G大小,训练起来奇慢。跑了14个小时仍没有结果时被我 Ctrl+C 了,然后欲哭无泪……我会不会被怀疑用学校服务器挖矿啊。。。
(2020.4.5更)在第二次手欠中断了之后(这次已经跑了23个小时)我终于机智了一点,因为不会改训练代码,我想到可以将COCO/train2014
目录下已经产生了标签文件的图片先弄走,它不是就不会重复训练了吗!说干就干
# -*- coding: utf-8 -*-
#!/usr/bin/python
dst = "~/super/exper/outputs/magic-point_coco-export1"
import os,shutil
def movefile(srcfile,dstfile):
remain = 0
dirs = os.listdir(srcfile) #遍历
for file in dirs:
name, _ = os.path.splitext(file)
name = os.path.join(dst,name+".npz") # 找到在magic-point_coco-export1目录下对应的npz文件
if os.path.exists(name):
shutil.move(file,dstfile)
else:
remain++
print(remain)
#在COCO/train2014下执行,将已产生标签的图片先放到../tmp下暂存
movefile(".","../tmp")
当然训练完后还要move回去,一行指令就不写了。
最后的总训练时间是将近32个小时。
我使用GPU为:NVIDIA Tesla P100 PCI-E 16GB,不过注意到在这一步时只能达到20%的负载,并没有发挥出学校土豪显卡的全部功力
step 3 Training MagicPoint on MS-COCO
用刚刚标注过的COCO来进行训练,这一步要用到上一步存储在$EXPER/outputs/magic-point_coco-export1
里面的全部标签,所以上一步必须全部执行完才行。
python3 experiment.py train configs/magic-point_coco_train.yaml magic-point_coco
step 4 Evaluating the repeatability on HPatches
评估magicPoint效果,这里主要指重复度。如果没达到论文效果的话需要重复进行3、4步。
python3 export_detections_repeatability.py configs/magic-point_repeatability.yaml magic-point_coco --export_name=magic-point_hpatches-repeatability-v
具体再补充吧……
Matching Features Demo with Pretrained Weights
这是用作者提供的一个预训练的权重直接测试,想用自己的图片的话需要先转化成ppm(linux下的一种图片格式)
tar -xzvf pretrained_models/sp_v6.tgz $EXPER_PATH/saved_models/sp_v6
python3 match_features_demo.py sp_v6 image1.ppm image2.ppm
提取的特征点多(红点)的是SIFT:
少的是SuperPoint:
随便扔进去的深度图,效果不如SIFT。(训练集和测试集类型都不一样当然可以理解
SuperPoint:
SIFT: