Learning Open3DTutorial上級編→高速グローバル位置合わせ

Fast Global Registration

高速グローバル位置合わせ

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をインポートするため)

In [6]:
# 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)
:: Load two point clouds and disturb initial pose.
:: Downsample with a voxel size 0.050.
:: Estimate normal with search radius 0.100.
:: Compute FPFH feature with search radius 0.250.
:: Downsample with a voxel size 0.050.
:: Estimate normal with search radius 0.100.
:: Compute FPFH feature with search radius 0.250.
:: RANSAC registration on downsampled point clouds.
   Since the downsampling voxel size is 0.050,
   we use a liberal distance threshold 0.075.
Global registration took 0.830 sec.

registration::RegistrationResult with fitness=6.779412e-01, inlier_rmse=3.316474e-02, and correspondence_set size of 3227
Access transformation to get result.
:: Apply fast global registration with distance threshold 0.025
Fast global registration took 0.149 sec.

registration::RegistrationResult with fitness=5.031513e-01, inlier_rmse=1.741805e-02, and correspondence_set size of 2395
Access transformation to get result.

Input

examples/Python/Advanced/fast_global_registration.pyの最初の部分コード:

In [ ]:
    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特徴量のペアを生成する。

Baseline

examples/Python/Advanced/fast_global_registration.pyの2番目の部分コード:

In [ ]:
    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ベースのグローバル位置合わせを呼び出す。 位置合わせ後、次の結果が表示される。

http://www.open3d.org/docs/release/_images/ransac.png

RANSACベースのグローバル位置合わせでは 0.830 秒かかっている。(クロック3.47GHzのXeon X5677,を2個、32GBメモリ搭載したマシン、OSはUbuntu18.04)

Fast global registration

ベースラインと同じ入力を与え、Zhou et al. (2016)の実装を用いたものが次である(examples/Python/Advanced/fast_global_registration.pyの最初の関数):

In [ ]:
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

これにより次の結果が表示される:

http://www.open3d.org/docs/release/_images/fgr.png

Fast global registraionは 0.149 秒かかった(ベースラインと同じコンピュータを使用)

構成を適切に行えば、高速グローバル位置合わせの精度はICPにすら匹敵する。 実験結果については、Zhou et al. (2016)を参照されたい。