问题1 todaygan那篇文章中没有提到retrieval(image retrieval),只是说了我们使用的图像特征化工具是DenseVLAD,我看它那个论文的意思是用densevlad来提取描述子并放弃检测阶段。应该是对应着Localization的第一部分。
然后那个retrieval_list,是不是就是那个database_pairs_list.txt?
2 用d2net的局部描述子。我看好像没有提供d2的局部描述子,应该是要自己创建。好像是我用哪个方法创建的局部描述子,就是评估的哪个方法。
上一篇写了Benchmarking 6DOF Outdoor Visual Localization in Changing Conditions这篇论文的介绍,下面试试来实现这篇论文的评估方法
论文作者给出的代码在 https://github.com/tsattler/visuallocalizationbenchmark 但是作者给出的代码之适用于Aachen Day-Night dataset,不适用于我要用的 RobotCar 数据集,因此这里记录下如何实现评估RobotCar 数据集。
该存储库提供了一个代码,作为长期视觉本地化基准测试的一部分,可在长期视觉本地化的情况下评估局部特征。给定为图像提取的特征,代码提供了匹配它们的功能。然后,将这些匹配用于首先根据一组数据库图像对场景的3D结构进行三角剖分。然后,一组查询图像和数据库图像之间的匹配会提供一组2D-3D匹配,用于估计查询图像的相机姿态。输出是一个提交文件,可以直接将其上传到基准网站。
重建流程的步骤如下:
- 使用数据库映像的参数生成空的重建,
- 将要素导入数据库,
- 匹配要素并将匹配项导入数据库,
- 从几何上验证匹配项,
- 在3D模型中以固定的内在函数对数据库观测值进行三角剖分,
- 以固定的内在函数注册查询图像。
我们提供了一个在PyTorch中实现的相互最接近的邻居匹配器-您可以用自己喜欢的匹配方法(例如,最接近的邻居+比率测试的一种方法)替换它。
除匹配器外,请保持管道的其余部分完整,以便尽可能公平地进行比较
使用COLMAP进行具有自定义功能的可视化本地化(标红色的表示还不太清楚如何是实现)
一:先决条件
(1)安装 COLMAP,
colmap的官方网站:https://colmap.github.io/
安装说明:https://blog.csdn.net/X_kh_2001/article/details/82591978
(2)Conda可用于安装缺少的软件包:
conda install numpy tqdm conda
install pytorch cudatoolkit = 9.0 -c pytorch #提供的相互NN匹配器必需
(3)使用COLMAP获得retrieval_list.txt / database_pairs_list.txt
我们假设图像检索其它地方执行,例如,使用DenseVLAD或NetVLAD,并含有对查询文件名和数据库文件名(每行一对,看到图像对COLMAP的“自定义匹配”格式的文本文件在这里)可用。在下文中,我们将该文件称为retrieval_list.txt
。
https://colmap.github.io/tutorial.html#feature-matching-and-geometric-verification
(4) 获得db.db数据库
db.db
包含数据库和查询图像及其内在函数的COLMAP数据库(例如db.db)。该数据库可以通过提取SIFT特征来构建。重要提示:确保用于查询图像的姿势估计的正确的相机内部函数存储在数据库中。
(5)数据库一致的COLMAP稀疏重构
与数据库一致的COLMAP稀疏重构,即images.bin
/images.txt
中存储的IMAGE_ID与/中存储的IMAGE_ID一致。稀疏模型可以是完整的重建(例如,从SIFT功能获得的3D模型),也可以是“空”重建,即,仅包含摄像头姿势和摄像头本征但不包含3D点的模型。
二:Localization
1 Extract custom features提取自定义特征
运行特征提取器并以上述本地特征格式存储特征。您应该提取数据库和查询功能的功能。
我们的脚本尝试从文件中为每个图像加载本地功能。创建这些文件是您的责任。
本地要素应npz
以两个字段的格式存储:
-
keypoints
-N x 2
矩阵,x, y
其中每个关键点的坐标为COLMAP格式(X
轴指向右侧,Y
轴指向底部) -
descriptors
-N x D
带有描述符的矩阵(如果计划使用提供的相互最近的邻居匹配器,则将L2标准化)
而且,应该将它们与对应的图像一起保存,并带有与对应的扩展名method_name
(例如,如果method_name = d2-net
图像的特征/local/aachen/images/images_upright/db/1000.jpg
应在文件中/local/aachen/images/images_upright/db/1000.jpg.d2-net
)。
重要信息:为了正常工作,我们的脚本要求以原始图像分辨率提取局部特征。如果在特征提取之前缩小图像的比例,则需要将关键点的位置缩放为原始分辨率。否则,相机姿态估计阶段将失败。
2 导入所有特征并匹配数据库图像
这是通过使用modify_database_with_custom_features_and_matches.py
完成的:
提供的方法假设存在一个data_directory/
包含图像的目录,一个现有的COLMAP数据库(例如db.db
)和包含要匹配的图像名称对的文本文件(例如match_list.txt
)。可以通过对数据库中的图像运行COLMAP的特征检测来创建数据库(不能为空)。为了使用自定义的本地功能,.npz
包含这些功能的文件(采用上述格式)需要与它们对应的图像一起保存,并带有与对应的扩展名method_name
。
在满足这些先决条件的前提下,modify_database_with_custom_features_and_matches.py
可用于将要素导入数据库,匹配图像并运行几何验证。然后,可以将所得数据库与COLMAP一起使用以重建场景。
python modify_database_with_custom_features_and_matches.py
--dataset_path data_directory/
--colmap_path /local/colmap/build/src/exe
--method_name your_feature_name
--database_name db.db
--image_path images/
--match_list database_pairs_list.txt
在这里,data_directory/
是包含所有数据的目录,并且db.db
是现有数据库的名称(即,data_directory/db.db
此文件的路径)。your_feature_name
是功能的名称(请参见上文),目录data_directory/images/
包含查询和数据库映像(可能在子目录中)。假定database_pairs_list.txt
位于data_directory/
,即文件为data_directory/database_pairs_list.txt
。此调用data_directory/your_feature_name.db
将从db.db
(不更改db.db
)创建一个新数据库,将自定义功能导入到中your_feature_name.db
,匹配中指定的数据库图像对database_pairs_list.txt
,执行空间验证,并将匹配项存储在中your_feature_name.db
。此步骤可能需要很长时间。重要提示:请确保data_directory/your_feature_name.db
在运行之前不能先存在。
该调用假定存在一个data_directory/
包含现有COLMAP数据库db.db
的目录,一个images/
包含所有图像的文件夹(对于每个具有name的图像,XX.jpg
假定都有一个XX.jpg.d2-net
包含该图像的D2-Net功能的文件)和一个文本文件match_list.txt
包含要匹配的图像对。该调用将d2-net.db
在data_directory/
目录中创建一个新的数据库文件。
3 构建数据库3D模型:
在下一步中,我们将从用于本地化的自定义功能和匹配项中构建3D模型。这是通过调用
colmap point_triangulator --database_path data_directory/your_feature_name.db --image_path data_directory/images/ --input_path data_directory/existing_model/ --output_path data_directory/model_your_feature_name/ --clear_points 1
这data_directory/existing_model/
是上述先决条件中提到的现有3D模型。生成的3D模型将存储在中data_directory/model_your_feature_name/
。请确保该目录在调用之前存在。请注意,此调用不会从头开始运行“结构自运动”,而只是根据数据库图像的已知姿势对场景的3D结构进行三角剖分。数据库映像的姿势和内在函数不变。
4. 在查询图像和检索到的数据库图像之间执行特征匹配:这可以通过调用
python modify_database_with_custom_features_and_matches.py
--dataset_path data_directory/
--colmap_path /local/colmap/build/src/exe
--method_name your_feature_name
--database_name db.db
--image_path images/
--match_list retrieval_list.txt
--matching_only True
这将在查询图像和检索到的前k个数据库图像(由中的对指定retrieval_list.txt
)之间进行特征匹配,并将几何验证后的结果导入data_directory/your_feature_name.db
。重要说明:实际的自定义功能描述符未存储在COLMAP数据库中。为了匹配,将从步骤1中生成的文件中加载功能,因此请确保在此步骤之前没有删除它们。完成此步骤后,您可以删除它们。
5. 估计查询图像的相机姿态:
此最后一步使用步骤3中的模型构建和来自步骤4的匹配,以在COLMAP中进行相机姿态估计。这是通过调用
colmap image_registrator --database_path data_directory/your_feature_name.db --input_path data_directory/model_your_feature_name/ --output_path data_directory/model_your_feature_name_with_queries/
这会将图像注册到3D模型中,而不会对其进行更改。结果是一个3D模型,其中包含原始3D结构和数据库姿态data_directory/model_your_feature_name/
以及可以本地化的查询图像的姿态(及其内部2D-3D匹配)。结果存储为COLMAP二进制模型data_directory/model_your_feature_name_with_queries/
(路径必须在调用之前存在)。之后,您可以从中提取相机的姿势data_directory/model_your_feature_name_with_queries/images.bin
(有关详细信息,请参见此处)。可能需要调整一些COLMAP的参数以提高性能。