关于Inverted File的主要说明在这篇文章中:Get Out of My Lab:Large-scale, Real-Time Visual-Inertial Localization
文章说道:
- BOW的方法,针对超大量的描述符的时候,效果就不太好了。
- KD-Tree的方法,一个是速度比较慢,而且每当数据库有变化的时候,需要重新生成树结构
- 所以提出了Inverted File方法。
Inverted File结构:
- 一个word对应一个Inverted File
- 很多Inverted File由一个vector管理
- Inverted File里面存储了属于这个word的所有描述符和描述符的id。
- 描述符id是按照加入db的顺序生成的
- 还需要一个辅助的映射关系:word_id到Inverted File中对应这个word的序号
Inverted File方法说明:
- 使用聚类方法建立类似于BOW一样的vocabulary。vocabulary里面每个描述符叫做一个word,对应有一个id叫做word_id。
- 使用这些word的描述符建立一个kd树。
- 建立定位地图(Inverted File)
- 把定位地图里面每个描述符在knn树中找到最近的那个word
- 看下Inverted File里面有没有这个word
- 如果有这个word,就把这个描述符加入到这个word的Inverted File中
- 如果没有,新建一个这个word对应的Inverted File
- 使用Inverted File定位
- 把定位地图里面每个描述符在knn树中找到最近的那个word
- 和这个word对应Inverted File中所有的描述符比较,找出距离最近的
总结:
- kd树只用生成一次,有新的描述符加入的时候,只用更新Inverted File
- vocabulary中的word数量也是固定的