Open3Dの三次元再構成システムの解説
Open3Dの三次元再構成システムの解説
はじめに
私はOpen3Dの三次元再構成システムを詳しく勉強する機会がありました。Open3Dの三次元再構成システムについての公式ドキュメントは基本的な画像処理やSLAMの知識を前提に書かれているので、そのような背景知識が少ない人はその公式ドキュメントを読んでも理解するのが難しいと思います。そこで私は公式ドキュメントの中身を補足するような記事を書こうと思いました。それでは本編に移りたいと思います。
Open3Dと三次元再構成システムの関係
三次元再構成とはセンサーの出力を用いて三次元モデルを作成する技術のことである。Open3Dは3Dデータを処理するソフトウェアの高速な開発をサポートするオープンソフトソフトウェアである[1]。Open3D v0.15.1には三次元再構成システム(3D Reconstruction System)は2種類含まれている。Legacy 三次元再構成システムとTensor 三次元再構成システムである。Legacy 三次元再構成システム[2]でも言及されているOpen3Dが公開された当初から実装されている三次元再構成システムである。このシステムはloop closureを検知するが、GPU実装がされていないため、処理速度が遅い欠点がある([3]がGPU実装を提案しているが、Open3Dのmasterブランチに反映されているのは、scene integration processのみで、システム全体の高速化にはわずかにしか寄与しない)。一方でtensor 三次元再構成システム[4]は、GPU実装がされており、高速であるがloop closureが検知されない欠点がある。本記事ではlegacyの三次元再構成システムについて解説する。
三次元再構成システムの概要
Open3Dの三次元再構成システムはRGB-D動画から三次元モデルを生成する。RGB-D画像とは同一タイミングで撮影した色画像と深度画像の対からなる画像のことである。つまりRGB-D画像は色画像の画素それぞれに奥行きが付いたデータとなる。このRGB-D画像を時系列順に並べたものがRGB-D動画となる。このシステムのパイプラインは[5]を基に[6]のアイディアをいくつか導入して構築されている。
内部では以下の4つの工程を経てRGB-Dの動画から三次元モデルを作成する。
- Make Fragments
入力のRGB-D画像列(動画)から部分画像列を作成し、部分画像列内の画像の相対位置を推定し、部分画像列からfragmentと呼ばれる部分シーンを作成する。 - Register Fragments
fragmentをloop closureを検知するためにglobal空間に配置する。 - Refine Registration
大雑把な位置合わせをより密にする。 - Integrate Scene
RGB-D画像をシーンのメッシュモデルを生成するために統合する。
Figure1. システムの各工程と入出力の概要図
Open3Dの公式ドキュメントで利用されているサンプルのRGB-D動画はSceneNN 016と呼ばれるものである。
Figure2. SceneNN 016のRGB画像から作成したGIF
Make Fragments
この工程では入力のRGB-D動画から部分画像列を作成し、その部分画像列内の画像同士の位置推定をし、その推定結果を部分画像列ごとに保存し、部分画像列ごとにfragmentと呼ばれる部分的なシーンを作成する。この処理はBatch Processingによって部分画像列ごとに処理がなされ、並列化される。[5]は入力の画像列から部分画像列を作成するのは、信頼できる局所幾何を作成するためと言っている。
部分画像列の作成
具体的な処理として、まず入力の画像列を一定の枚数で分割し、部分画像列を作成する。画像列における
画像列の
部分画像列内の画像同士の位置推定
次に部分画像列ごとに、部分画像列
source画像とtarget画像が時間的に隣接する場合(compute_rgbd_odometry
で推定し、帰納的に計算することでカメラの軌跡を計算することができる。つまり
odometryは一般的に長い距離を推定すればするほど誤差が蓄積することが知られており、これをpose driftと呼ぶ。そこでカメラが一周して同じ点を観測することでpose driftを減らす[7]。これをloop closureと呼ぶ。loop closureの場合、wide baseline matchingで(実装ではOpenCV ORB特徴点を抽出し、5点RANSACで大雑把に位置合わせする)得られた状態を初期値とし、compute_rgbd_odmetry
で非隣接の画像同士の相対位置を推定する。source画像register_one_rgbd_pair
で推定することで、source画像をtarget画像に揃える移動行列(transformation matrix)
推定結果の保存
先の処理で得られた推定結果はmake_posegraph_for_fragment
で部分画像列ごとにpose graphというグラフに保存される。Open3Dの3次元再構成システムにおけるpose graphはある時刻ごとの物体(画像もしくはfragment)の位置をnodeとして、node間の相対位置を表す移動行列と情報行列をedgeとするグラフのことである。このMake Fragments工程ではnodeにはカメラの位置の逆行列fragment_[\d]{3}.json
(正規表現)が得られればoptimize_posegraph_for_fragment
を呼び、pose graphを最適化し、fragment_optimized_[\d]{3}.json
を得る。
fragmentの作成
部分画像列
Figure3. Make Fragments工程で得られたfragmentの例
Register Fragments
Make Fragments工程で得られたfragmentを1つのsceneのglobal空間に配置する。まず全てのfragmentの任意の2つの組み合わせでfragment対
目的関数
global空間を表すpose graphはnodeにfragmentの位置の逆行列global_pose_grpah.json
とglobal_pose_grpah_optimized.json
に保存される。
Refine Registration
Register Fragments工程で得られたglobal空間を表すpose graphをより正確にする。つまりglobal空間にあるfragmentの位置をより正確な位置に調整する。coarse-to-fine schemeによってfragmentの密度を徐々に上げながらfragment対の相対位置の精度を上げていく。fragmentの密度を
Refine Registration工程においてcoarse-to-fine schemeとは目的関数を最適化する際に既に求めてある相対位置
refined_global_pose_grpah.json
とrefined_global_pose_grpah_optimized.json
に保存される。
Integrate Scene
Make Fragments工程で得られたfragment空間における画像の位置
Figure4. SceneNN 016をOpen3Dの三次元再構成システムで再構成して得られた三次元モデルの様子
おわりに
この記事ではOpen3Dの公式ドキュメントに書かれいない内容や、実装について詳しく触れました。近いうちにOpen3Dの三次元再構成システムを実際に動かしてみる記事も書いてみたいと考えています。もし誤植や内容の間違いなどがあれば気軽にコメントをしてください。最後まで読んでいただきありがとうございました。この記事を参考にしてOpen3Dの三次元再構成システムのより良い理解が得られれば幸いです。
参考文献
[1] Open3D Official Cite http://www.open3d.org/
[2] Q.-Y. Zhou, J. Park, and V. Koltun, “Open3D: A modern library for 3D data processing,” arXiv preprint arXiv:1801.09847, 2018.
[3] W. Dong, J. Park, Y. Yang, and M. Kaess, “GPU Accelerated Robust Scene Reconstruction,” in 2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), Macau, China, Nov. 2019, pp. 7863–7870. doi: 10.1109/IROS40897.2019.8967693.
[4] W. Dong, Y. Lao, M. Kaess, and V. Koltun, “ASH: A Modern Framework for Parallel Spatial Hashing in 3D Perception,” arXiv preprint arXiv:2110.00511, 2021.
[5] S. Choi, Q.-Y. Zhou, and V. Koltun, “Robust reconstruction of indoor scenes,” in Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, 2015, pp. 5556–5565.
[6] J. Park, Q.-Y. Zhou, and V. Koltun, “Colored point cloud registration revisited,” in Proceedings of the IEEE international conference on computer vision, 2017, pp. 143–152.
[7] 移動ロボットの環境認識 地図構築と自己位置推定 https://www.jstage.jst.go.jp/article/isciesci/60/12/60_509/_pdf
[8] Q.-Y. Zhou, J. Park, and V. Koltun, “Fast global registration,” in European conference on computer vision, 2016, pp. 766–782.
[9] PCL FPFH estimation, https://github.com/PointCloudLibrary/pcl/blob/master/doc/tutorials/content/fpfh_estimation.rst
[10] R. B. Rusu, N. Blodow, and M. Beetz, “Fast Point Feature Histograms (FPFH) for 3D registration,” in 2009 IEEE International Conference on Robotics and Automation, Kobe, May 2009, pp. 3212–3217. doi: 10.1109/ROBOT.2009.5152473.
Discussion