Learning to Find Good Correspondences (CVPR 2018)
This repository is a reference implementation for K. Yi*, E. Trulls*, Y. Ono, V. Lepetit, M. Salzmann, and P. Fua, "Learning to Find Good Correspondences", CVPR 2018 (* equal contributions). If you use this code in your research, please cite the paper.
Installation
This code base is based on Python3. For more details on the required libraries,
see requirements.txt
. You can also easily prepare this by doing
pip install -r requirements.txt
Preparing data
Download the
brown_bm
sequence and
st_peters
sequence and extract them in the datasets directory. For example, for
st_peters
you should have a directory looking like
./datasets/st_peters_square/train
. Also download
reichstag
dataset for testing, which is quite small!
Once the datasets are downloaded, run dump_data.py
to prepare the
datasets. The following commands should be run.
./dump_data.py --data_tr=st_peters --data_va=st_peters --data_te=st_peters
./dump_data.py --data_tr=brown_bm_3_05 --data_va=brown_bm_3_05 --data_te=brown_bm_3_05
./dump_data.py --data_tr=reichstag --data_va=reichstag --data_te=reichstag
Hang on tight, this would take a while.
Training
While we also provide our trained models, you can also easily train your own models. Simply run:
./main.py --run_mode=train
See config.py
for more options in running the software. Try it
yourself. Nearly all parameters that we changed in the paper should be
there.
For designating datasets, modify data_tr
, data_va
, and data_te
to your
liking. Also you can simply do something like st_peters.brown_bm_3_05
to
train with the combined datasets.
The default place to store the results is ./logs
. To change this, use
res_dir
to set the base directory, log_dir
for the suffix for the training
configurations. test_log_dir
is used to if you want to change the suffix for
storing results. For example, log_dir
can store the training configuration,
and test_log_dir
can store which training configuration is used on which
testing dataset.
Testing
Again, testing is quite simple. After training is done, run:
./main.py --run_mode=test
Or if you simply want to test the pretrained model on your dataset, you can:
./main.py --run_mode=test --res_dir="./" --log_dir="models" --test_log_dir="results" --data_tr="st_peters.brown_bm_3_05" --data_va="reichstag" --data_te="reichstag"
# Or use following command to save an additional numpy structured output (Thanks to GrumpyZhou)
./main.py --run_mode=test_simple --res_dir="./" --log_dir="models" --test_log_dir="results" --data_va="reichstag" --data_te="reichstag"
This time, it should only take about 30 seconds since reichstag
is tiny, but
depending on the dataset, this might take a while (roughly seven minutes on
st_peters
). This is because you are testing on the entire test dataset. One
thing to note is that, as written on the paper, most the computation is done in
the CPU, and GPU is not really necessary for testing.
Also, as of now, there is no stand-alone testing code for a single image pair. The current code-base also evaluates testing on the validation dataset as well, since the only validation performed while training is with the eight-point algorithm. We welcome contributions for untying this mess we have.
Once run, you'll find a TensorBoard log files and some txt files that contain the results of the expriments.
Notes on implementation
For the dataset generation, we used OpenCV SIFT with fast-math flag on. We've
noticed that when using opencv-contrib-python
package from pip, you get
different results, slightly different from the paper.