http://www.liuxiao.org/2019/02/%E8%AE%BA%E6%96%87%E7%AC%94%E8%AE%B0%EF%BC%9Anetvlad-cnn-architecture-for-weakly-supervised-place-recognition/
https://zhuanlan.zhihu.com/p/237602816
传统方法来讲,这里讲最经典最经典的几个方法:
- [VLAD] - https://github.com/jorjasso/VLAD
- [DBoW2] - https://github.com/dorian3d/DBoW2
- [libhaloc]- https://github.com/srv/libhaloc
- [HBST] - https://gitlab.com/srrg-software/srrg_hbst
- [iBow] - https://github.com/emiliofidalgo/ibow-lcd
- ...
无论以何种方式实现,其输入是一张图,输出是database中的query对象。
当然以神经网络对图像的强大表达能力,近些年深度学习的方法比较流行,核心思路应该理解为对图像提取特征,这种特征能够描述这个场景,相似场景特征之间的距离要近,不同场景对应的特征向量的距离应该尽量远,这样才有区分度,这里也列举近些年一些基于深度学习的算法。
- [NetVLAD] - https://github.com/Relja/netvlad
- [DIR] - https://github.com/almazan/deep-image-retrieval
- [GeM,DAME] - https://github.com/scape-research/DAME-WEB
- [DELF] - https://github.com/tensorflow/models/tree/master/research/delf
- [HF-NET] - https://github.com/ethz-asl/hfnet
- [UR2KID] - https://arxiv.org/abs/2001.07252
- ...
上述DL的方法基本上输入是图像,输出是一个N(1024/2048/4096...)维度的向量,即描述子。如果两张图很接近,那么其描述子之间的距离会比较接近,反之则比较距离较远,另外近年也有与语义信息结合的工作,但目前(2020.09)还没有看到比较好的开源工作。
这里推荐一个CVPR2017的一个Tutorial,:
Tutorial : Large-Scale Visual Place Recognition and Image-Based Localization Part 1
Tutorial : Large-Scale Visual Place Recognition and Image-Based Localization Part 2
如果说像把上面的工作集成到自己的SLAM系统或者框架中,一般还需要考虑实时性以及是否需要模型加速或者说转换成C++的问题,可以从NetVLAD入手,譬如大佬们把它修改成了tensorflow版本的
NetVLAD: CNN architecture for weakly supervised place recognition
论文笔记:NetVLAD: CNN architecture for weakly supervised place recognition
文章目录
NetVLAD1是一个较早的使用 CNN 来进行图像检索或者视频检索的工作,后续在此工作的基础上陆续出了很多例如 NetRVLAD、NetFV、NetDBoW 等等的论文,思想都是大同小异。
一、图像检索
VLAD 和 BoW、Fisher Vector 等都是图像检索领域的经典方法,这里仅简介下图像检索和 VLAD 的基本思想。
图像检索(实例搜索)是这样的一个经典问题:
1、我们有一个图像数据库 I_iIi 通过函数可以得到每一个图像的特征 f(I_i)f(Ii);
2、我们有一个待查询图像 qq 通过函数得到它的特征 f(q)f(q);
3、则我们获得的欧氏距离 d(q, I) = \parallel f(q) - f(I)\paralleld(q,I)=∥ f(q)−f(I)∥ 应该满足越相近的图像 d(q, I)d(q,I) 越小。
二、VLAD (Vector of Locally Aggregated Descriptors)
NetVLAD
经典 VLAD 公式的可微化