Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?


Failed to load latest commit information.
Latest commit message
Commit time

HardNet model implementation

HardNet model implementation in PyTorch for NIPS 2017 paper "Working hard to know your neighbor's margins: Local descriptor learning loss" poster, slides

An example how to compile HardNet to Torchscript to be used in C++ code


Update April 06 2018

We have added small shift and rot augmentation, which improves results up to 1mAP point on HPatches. It is in, turn on by --augmentation=True. All the weight will be updated soon. Version, which is trained on Brown + HPatches + PS datasets is in progress, stay tuned :)

Re: popular question about BoW retrieval engine

Unfortunately, it is proprietary and we cannot release it. But you can try the following open source repos, both Matlab-based:

Benchmark on HPatches, mAP


Retrieval on Oxford5k, mAP, Hessian-Affine detector

Descriptor BoW BoW + SV BoW + SV + QE HQE + MA
TFeatLib 46.7 55.6 72.2 n/a
RootSIFT 55.1 63.0 78.4 88.0
L2NetLib+ 59.8 67.7 80.4 n/a
HardNetLibNIPS+ 59.8 68.6 83.0 88.2
HardNet++ 60.8 69.6 84.5 88.3
HesAffNet + HardNet++ 68.3 77.8 89.0 89.5


Please use Python 2.7, install OpenCV and additional libraries from requirements.txt

Datasets and Training

To download datasets and start learning descriptor:

git clone

Logs are stored in tensorboard format in directory logs/

Pre-trained models

Pre-trained models can be found in folder pretrained.

3rd party pre-trained models

Rahul Mitra presented new large-scale patch PS-dataset and trained even better HardNet on it. Original weights in torch format are here.

Converted PyTorch version is here.


Which weights should I use?

For practical applications, we recommend HardNet++.

For comparison with other descriptors, which are trained on Liberty Brown dataset, we recommend HardNetLib+.

For the best descriptor, which is NOT trained on HPatches dataset, we recommend model by Mitra, link in section above.

Usage example

We provide an example, how to describe patches with HardNet. Script expects patches in HPatches format, i.e. grayscale image with w = patch_size and h = n_patches * patch_size

cd examples
python imgs/ref.png out.txt

or with Caffe:

cd examples/caffe
python ../imgs/ref.png hardnet_caffe.txt

Projects, which use HardNet

AffNet -- learned local affine shape estimator.


Please cite us if you use this code:

 author = {Anastasiya Mishchuk, Dmytro Mishkin, Filip Radenovic, Jiri Matas},
 title = "{Working hard to know your neighbor's margins: Local descriptor learning loss}",
 booktitle = {Proceedings of NeurIPS},
 year = 2017,
 month = dec


Hardnet descriptor model - "Working hard to know your neighbor's margins: Local descriptor learning loss"








No releases published


No packages published