前言
图像数据库、视觉字典和视觉词袋向量是SLAM、计算机视觉、3D物体识别和卷积神经网络图像处理的重要基础工具。所谓“万丈高楼平地起”,在深刻理解这些基本工具的基础之上,根据开源项目构建自己的工程就可以做到游刃有余了。在工程实践中,开源代码往往不能满足业务需求,而对计算机视觉的应用直接上来裁剪代码是一件非常困难的事情。本文的初衷是用最浅显易懂的语言,帮助大家理解并不那么普及的技术,更重要是能够根据这些原理快速构建代码和应用。
无奈,本文作者码力有限,若要对算法上手即来,直接形成代码还是一件非常困难的事情。代码的实践性非常强,大量的工程实践是光明大道。纸上得来终觉浅,绝知此事要躬行。
DBoW3库介绍
DBoW3是DBoW2的增强版,这是一个开源的C++库,用于给图像特征排序,并将图像转化成视觉词袋表示。它采用层级树状结构将相近的图像特征在物理存储上聚集在一起,创建一个视觉词典。DBoW3还生成一个图像数据库,带有顺序索引和逆序索引,可以使图像特征的检索和对比非常快。
DBoW3与DBoW2的主要差别:
1、DBoW3依赖项只有OpenCV,DBoW2依赖项DLIB被移除;
2、DBoW3可以直接使用二值和浮点特征描述子,不需要再为这些特征描述子重写新类;
3、DBoW3可以在Linux和Windows下编译;
4、为了优化执行速度,重写了部分代码(特征的操作都写入类DescManip);DBoW3的接口也被简化了;
5、可以使用二进制视觉词典文件;二进制文件在加载和保存上比.yml文件快4-5倍;而且,二进制文件还能被压缩;
6、仍然和DBoW2yml文件兼容。
DBoW3有两个主要的类:Vocabulary和Database。视觉词典将图像转化成视觉词袋向量,图像数据库对图像进行索引。
ORB-SLAM2中的ORBVocabulary保存在文件orbvoc.dbow3中,二进制文件在Github上:https://github.com/raulmur/ORB_SLAM2/tree/master/Vocabulary
逆序指针指向一个数据对<图像It, 视觉词袋向量vti>,可以快速获取图像上的视觉单词的权重。当新的图像It加入到图像数据库中的时候,逆序指针就会更新,也方便在数据库中查找图像。逆序索引用于提取与给定图像相似的图像。这个结构用于存储视觉单词,视觉单词组成视觉字典,视觉字典形成图像。检索图像、做比较操作时,就不会对比图像中相同的视觉单词,这对检索图像数据库非常有用。顺序索引有效地获取图像间的云点匹配,加快图像确认中的几何特征检验。顺序指针可以方便地存储每幅图像的特征。视觉字典中的节点是分层存储的,假如树一共有L层,从叶子开始为0层,即L=0,到根结束,l=Lw。对于每幅图像It,将l层的节点存储在顺序指针中,而l层的这些节点是图像It的视觉单词的父节点,局部特征ftj列表与每个节点关联。用顺序指针和词袋模型树估算BRIEF向量描述子空间中的最邻近的节点。对于那些特征属于相同的单词或具有第l层相同父节点的单词,计算特征的对应关系时,这些顺序指针可以加快几何验证过程。当获取一个将要匹配的候选特征时,几何验证非常必要,新图像加进数据库,顺序指针就会更新。
权重计算Weighting
单词在视觉字典和词袋向量中都有权重。
视觉单词有4种权重计算方法:
1. 词频Term Frequency (tf):其中,
是单词 在图像d中出现的次数;
是图像d中单词的数量;
2. 逆向文件频率Inverse documentfrequency (idf):N是图像数量;Ni是图像包含单词的数量;
3. 词频-逆向文件频率Term frequency -inverse document frequency (tf-idf):