Hierarchical-Localization示例运行
小锋学长生活大爆炸

Hierarchical-Localization示例运行

hualala
2022-01-18 / 0 评论 / 301 阅读
温馨提示:
本文最后更新于2022年09月08日,已超过807天没有更新,若内容或图片失效,请留言反馈。

源码地址:https://github.com/cvg/Hierarchical-Localization/


在本笔记本中,我们将从一小组图像建立一个场景的3D地图,然后本地化从互联网下载的图像。 本演示由Philipp Lindenberger贡献。

%load_ext autoreload
%autoreload 2
import tqdm, tqdm.notebook
tqdm.tqdm = tqdm.notebook.tqdm  # notebook-friendly progress bars
from pathlib import Path

from hloc import extract_features, match_features, reconstruction, visualization, pairs_from_exhaustive
from hloc.visualization import plot_images, read_image
from hloc.utils import viz_3d

设置

这里我们定义了一些输出路径。

images = Path('datasets/sacre_coeur')
outputs = Path('outputs/demo/')
!rm -rf $outputs
sfm_pairs = outputs / 'pairs-sfm.txt'
loc_pairs = outputs / 'pairs-loc.txt'
sfm_dir = outputs / 'sfm'
features = outputs / 'features.h5'
matches = outputs / 'matches.h5'

feature_conf = extract_features.confs['superpoint_aachen']
matcher_conf = match_features.confs['superglue']

3D映射

首先,我们列出用于映射的图像。 这些都是白天拍摄的圣心大教堂。

references = [str(p.relative_to(images)) for p in (images / 'mapping/').iterdir()]
print(len(references), "mapping images")
plot_images([read_image(images / r) for r in references[:4]], dpi=50)

然后我们提取特征并在图像对之间进行匹配。 由于我们处理的图像很少,所以我们只是竭尽所能地匹配所有对。 对于更大的场景,我们将使用图像检索,正如在其他笔记本中演示的那样。

extract_features.main(feature_conf, images, image_list=references, feature_path=features)
pairs_from_exhaustive.main(sfm_pairs, image_list=references)
match_features.main(matcher_conf, sfm_pairs, features=features, matches=matches);


在此基础上,进行Structure-From-Motion和显示重建的三维模型。

model = reconstruction.main(sfm_dir, images, sfm_pairs, features, matches, image_list=references)
fig = viz_3d.init_figure()
viz_3d.plot_reconstruction(fig, model, color='rgba(255,0,0,0.5)', name="mapping")
fig.show()



我们还可视化那些被三角化到3D模型中的关键点。

visualization.visualize_sfm_2d(model, images, color_by='visibility', n=2)

定位

现在我们有了场景的3D地图,我们可以定位任何图像。 为了证明这一点,我们从维基媒体下载了一张夜间图片(https://commons.wikimedia.org/wiki/File:Paris_-_Basilique_du_Sacr%C3%A9_Coeur,_Montmartre_-_panoramio.jpg)。

url = "https://upload.wikimedia.org/wikipedia/commons/5/53/Paris_-_Basilique_du_Sacr%C3%A9_Coeur%2C_Montmartre_-_panoramio.jpg"
# try other queries by uncommenting their url
# url = "https://upload.wikimedia.org/wikipedia/commons/5/59/Basilique_du_Sacr%C3%A9-C%C5%93ur_%285430392880%29.jpg"
# url = "https://upload.wikimedia.org/wikipedia/commons/8/8e/Sacr%C3%A9_C%C5%93ur_at_night%21_%285865355326%29.jpg"
query = 'query/night.jpg'
#!mkdir -p $images/query && wget $url -O $images/$query -q
plot_images([read_image(images / query)], dpi=75)

同样,我们为查询提取特征并全力匹配它们。

extract_features.main(feature_conf, images, image_list=[query], feature_path=features, overwrite=True)
pairs_from_exhaustive.main(loc_pairs, image_list=[query], ref_list=references)
match_features.main(matcher_conf, loc_pairs, features=features, matches=matches, overwrite=True);

我们读取query的EXIF数据来推断相机参数(如焦距)的粗略初始估计。 然后利用PnP+RANSAC估计相机的绝对位姿,并对相机参数进行优化。

import pycolmap
from hloc.localize_sfm import QueryLocalizer, pose_from_cluster

camera = pycolmap.infer_camera_from_image(images / query)
ref_ids = [model.find_image_with_name(r).image_id for r in references]
conf = {
    'estimation': {'ransac': {'max_error': 12}},
    'refinement': {'refine_focal_length': True, 'refine_extra_params': True},
}
localizer = QueryLocalizer(model, conf)
ret, log = pose_from_cluster(localizer, query, camera, ref_ids, features, matches)

print(f'found {ret["num_inliers"]}/{len(ret["inliers"])} inlier correspondences.')
visualization.visualize_loc_from_log(images, query, log, model)

我们将查询图像和一些映射图像之间的对应关系可视化。 我们也可以在3D地图中可视化估计的相机姿态。

pose = pycolmap.Image(tvec=ret['tvec'], qvec=ret['qvec'])
viz_3d.plot_camera_colmap(fig, pose, camera, color='rgba(0,255,0,0.5)', name=query)
fig.show()

0

评论 (0)

取消