Learning Open3D→Tutorial→上級編→高速グローバル位置合わせ
ANSACベースのグローバル位置合わせは、無数のモデルの提案とその評価のために時間がかかる場合がある。 Zhou et al. (2016)は、少ない通信のラインプロセスの重みを迅速に最適化する、高速なアプローチを提案した。 それぞれの反復にモデル提案と評価が含まれないため、Zhou et al. (2016)が提案したアプローチは計算時間をかなり節約できる。
このコードは、Zhou et al. (2016)の実装と、ANSACベースのグローバル位置合わせとの実行時間を比較するためのものである。
Zhou, Q-Y., Park, J., & Koltun, V. (2016). Fast Global Registration. In ECCV 2016.
注意: コードを走らせる環境に注意すること。カレント(作業)ディレクトリを(Open3Dの)examples/Python/Advanced
にすること(global_registration.py
をインポートするため)
# examples/Python/Advanced/fast_global_registration.py
import open3d as o3d
from global_registration import *
import numpy as np
import copy
import time
def execute_fast_global_registration(source_down, target_down, source_fpfh,
target_fpfh, voxel_size):
distance_threshold = voxel_size * 0.5
print(":: Apply fast global registration with distance threshold %.3f" \
% distance_threshold)
result = o3d.registration.registration_fast_based_on_feature_matching(
source_down, target_down, source_fpfh, target_fpfh,
o3d.registration.FastGlobalRegistrationOption(
maximum_correspondence_distance=distance_threshold))
return result
if __name__ == "__main__":
# (1) Input
voxel_size = 0.05 # means 5cm for the dataset
source, target, source_down, target_down, source_fpfh, target_fpfh = \
prepare_dataset(voxel_size)
# (2) Baseline
start = time.time()
result_ransac = execute_global_registration(source_down, target_down,
source_fpfh, target_fpfh,
voxel_size)
print("Global registration took %.3f sec.\n" % (time.time() - start))
print(result_ransac)
draw_registration_result(source_down, target_down,
result_ransac.transformation)
start = time.time()
result_fast = execute_fast_global_registration(source_down, target_down,
source_fpfh, target_fpfh,
voxel_size)
print("Fast global registration took %.3f sec.\n" % (time.time() - start))
print(result_fast)
draw_registration_result(source_down, target_down,
result_fast.transformation)
examples/Python/Advanced/fast_global_registration.py
の最初の部分コード:
voxel_size = 0.05 # means 5cm for the dataset
source, target, source_down, target_down, source_fpfh, target_fpfh = \
prepare_dataset(voxel_size)
2つの手法の比較のため、このコードではグローバル位置合わせで定義したprepare_dataset
関数を再利用する。 ダウンサンプリングした点群とFPFH特徴量のペアを生成する。
examples/Python/Advanced/fast_global_registration.py
の2番目の部分コード:
start = time.time()
result_ransac = execute_global_registration(source_down, target_down,
source_fpfh, target_fpfh,
voxel_size)
print("Global registration took %.3f sec.\n" % (time.time() - start))
print(result_ransac)
draw_registration_result(source_down, target_down,
result_ransac.transformation)
このコードは、ベースラインとしてRANSACベースのグローバル位置合わせを呼び出す。 位置合わせ後、次の結果が表示される。
RANSACベースのグローバル位置合わせでは 0.830 秒かかっている。(クロック3.47GHzのXeon X5677,を2個、32GBメモリ搭載したマシン、OSはUbuntu18.04)
ベースラインと同じ入力を与え、Zhou et al. (2016)の実装を用いたものが次である(examples/Python/Advanced/fast_global_registration.py
の最初の関数):
def execute_fast_global_registration(source_down, target_down, source_fpfh,
target_fpfh, voxel_size):
distance_threshold = voxel_size * 0.5
print(":: Apply fast global registration with distance threshold %.3f" \
% distance_threshold)
result = o3d.registration.registration_fast_based_on_feature_matching(
source_down, target_down, source_fpfh, target_fpfh,
o3d.registration.FastGlobalRegistrationOption(
maximum_correspondence_distance=distance_threshold))
return result
これにより次の結果が表示される:
Fast global registraionは 0.149 秒かかった(ベースラインと同じコンピュータを使用)
構成を適切に行えば、高速グローバル位置合わせの精度はICPにすら匹敵する。 実験結果については、Zhou et al. (2016)を参照されたい。