本文目的是为了更加详细的学习通用的回环检测算法 中的DBoW2库,了解其代码构成。
- 回环检测
- DBOW2介绍
- DBOW3介绍
回环的评价指标
一个回环的结果,可能有以下四种情况出现:
算法结果事实 | 是回环 | 不是回环 |
---|---|---|
是回环 | 真阳性 | 假阳性 |
不是回环 | 假阴性 | 真阴性 |
回环检测算法可以输出以下结果:四种结果的数量分别为
$$
准确率=N_{TP}/{N_{TP}+N_{FP}}
$$
$$
Recall = N_{TP}/{N_{TP}+N_{FN}}
$$
准确率描述了检测到的回环中真回环的个数。
Recall描述了真回环中有多少个被检测出来了。
根据准确率和召回率可以得到ROC曲线.
ROC曲线越靠右上方越好,但是通常这两者是矛盾的。
回环检测
闭环检测算法指的是通过检测算法检测出之前访问过的场景。
如图1所示,当机器人在移动过程中,特别是在探索大面积的场景时,由于模型的不确定性以及设备的噪声,不确定性会逐渐增长。通过引入闭环检测技术,识别出历史访问过的场景以增加位姿之间的约束,可以很好的减少这种不确定性。
主要方法
一、关键帧匹配
最简单的闭环检测算法是将新检测出来的关键帧和过去所有的关键帧一一进行比较,虽然这种方法能比较好的检测出当前场景是否在之前出现过,但是在大规模场景下,机器人往往有成千上万个关键帧,这种方法检测效率及其底下,不能再实际场景中使用。
二、将特征与路标对应
通过将图像中的特征和整个地图中的路标对应起来,然后建立一个所有路标的数据库,通过使用路标分类器来加快场景识别速度。比如讲所有路标构建成一棵KD-Tree,当新添加一帧关键帧时,将关键帧在KD-Tree中进行检索,从中检索之前出现过的场景。
三、视觉词袋方法
基于视觉词袋的闭环检测方法,这种方法通过将特征描述子抽象成词汇,通过TF-IDF方法识别出现过的场景。如图2所示,是闭环检测中基于词袋模型流程图。使用视觉词袋的方法效率很高,可用在大规模地图的创建上。
DBoW2视觉词袋库
介绍
DBoW2是DBow库的改进版本,DBow库是一个开放源代码的C ++库,用于根据图像建立索引,并将其转换成词袋表示。它实现了一个层次树,用于近似图像特征空间中的最近邻居并创建视觉词汇。 DBoW2还使用反向和直接文件来实现图像数据库,以索引图像并支持快速查询和功能比较。与以前的DBow库的主要区别在于:
- DBoW2类是模板化的,因此它可以与任何类型的描述符一起使用。
- DBoW2附带了可直接与ORB或Brief描述符一起使用的类。
- DBoW2将直接文件添加到图像数据库以进行快速功能比较。 DLoopDetector使用它。
- DBoW2不再使用二进制格式。另一方面,它使用OpenCV存储系统来保存词汇表和数据库。这意味着这些文件可以YAML格式存储为纯文本,从而使兼容性更容易,也可以将其压缩为gunzip格式(.gz)以减少磁盘使用。
- 一些代码已被重写以优化速度。 DBoW2的界面已简化。
- 出于性能原因,DBoW2不支持停用词。
DBoW2需要OpenCV和Boost :: dynamic_bitset类才能使用Brief版本。
DBoW2与DLoopDetector一起在多个真实数据集上进行了测试,执行时间为3毫秒,将图像的Brief特征转换为词袋矢量,执行时间为5毫秒,以在数据库中查找图像匹配项。超过19000张图像。
使用说明
加权和计分
DBoW2实现与DBow相同的加权和计分机制。在这里检查。唯一的区别是DBoW2将所有分数缩放到[0..1],因此不再使用缩放标志。
保存并加载
可以使用保存和加载成员功能将所有词汇表和数据库保存到磁盘或从磁盘加载。保存数据库时,与之关联的词汇表也嵌入到文件中,因此词汇表和数据库文件是完全独立的。
您还可以将词汇表或数据库数据添加到使用cv :: FileStorage结构打开的任何文件中。
您可以使用任何文件扩展名保存词汇表或数据库。如果使用.gz,则文件将自动压缩(OpenCV行为)。
应用说明
类参数
DBoW2有两个主要的类:TemplatedVocabulary
和TemplatedDatabase
。这些工具实现了视觉词汇,可将图像转换成词袋矢量,并将数据库转换成索引图像。这些类是模板化的:
template<class TDescriptor, class F>
class TemplatedVocabulary
{
...
};
template<class TDescriptor, class F>
class TemplatedDatabase
{
...
};
两个类必须被提供:TDescriptor
是单个描述符向量的数据类型,而F
是具有从FClass
派生的具有操作描述符功能的类。
例如,要使用ORB
描述符,TDescriptor
定义为cv :: Mat
(类型为CV_8UC1
),它是包含32个8位值的单行。从图像中提取特征时,必须获取std :: vector <TDescriptor>
。对于BRIEF
描述子,TDescriptor
被定义为boost :: dynamic_bitset <>
。F
参数是实现FClass
中定义的函数的类的名称。这些函数获取TDescriptor
数据并计算一些结果。 DBoW2
中已经包含了处理ORB
和Brief
描述符的类。 (FORB
,FBrief
)。
预定义的词汇表和数据库
为了便于使用,DBoW2
定义了两种词汇表和数据库:OrbVocabulary
,OrbDatabase
,BriefVocabulary
,BriefDatabase
。请检查演示应用程序,以了解如何创建和使用它们。
DBoW3视觉词袋库
介绍
DBoW3是DBow2库的改进版本,DBow2库是一个开放源C ++库,用于将图像索引并将其转换为词袋表示。它实现了一个层次树,用于近似图像特征空间中的最近邻居并创建视觉词汇。 DBoW3还使用反向和直接文件来实现图像数据库,以索引图像并支持快速查询和功能比较。与以前的DBow2库的主要区别是:
- DBoW3仅需要OpenCV。 DLIB的DBoW2依赖性已删除。
- DBoW3可以立即使用二进制和浮点描述符。无需为任何描述符重新实现任何类。
- DBoW3可以在linux和Windows中进行编译。
- 一些代码已被重写以优化速度。 DBoW3的界面已简化。
- 使用二进制文件的可能性。二进制文件的加载/保存速度比yml快4-5倍。同样,它们可以被压缩。
- 兼容DBoW2 yml文件
安装说明
DBoW3
仅需要OpenCV
。
要编译utils / demo_general.cpp
,必须针对OpenCV 3
进行编译。如果已安装contrib_modules
,请使用cmake
选项-DUSE_CONTRIB = ON
启用SURF
。
如何使用
检查utils/demo_general.cpp
类
DBoW3主要有两个类: Vocabulary
和Database
。这些工具实现了视觉词汇,可将图像转换成词袋矢量,并将数据库转换成索引图像。有关示例,请参见utils / demo_general.cpp
。
读取/存储 词汇
文件orbvoc.dbow3
是ORBSLAM2
中的ORB
词汇,但采用DBoW3
的二进制格式: