大域的目標
KellerらのRGB-D SLAM[1]が実装したい!と思い立ったので実装していく,というモチベーションの記録.ちょっとずつ実装している.今回が7回目.
前回(以下,参照)に,一応の完成したように見えた.いくつかの課題を残したまま,そこからだいぶ経ってしまった.
http://mugichoko.hatenablog.com/entry/2017/09/29/045310mugichoko.hatenablog.com
実行速度の向上
前回に書いた通り,GPUを使ったICPの実装が悪かったので,そこを改善した.
問題の確認
下図の「これまでの実装」にあるように,C++で実装されているSolve関数を実行するために,必要なデータをGPUからCPU側のメインメモリにダウンロードしないといけない.「不要要素削除」にある部分をGPUで並列処理する実装がややこしいと思っていたので,これまでは,CPU側で行列を構成していた.
ただ,この方法では,VGA(640×480画素)分のデータをGPUメモリからメインメモリにダウンロードする必要がある.更には,行列Aとbは1画素辺りに合わせて7要素持ち,ICPの一回のループでこのダウンロードが一回必要であるため,合計で640×480×7×ループ回数の情報をGPUメモリからダウンロードしないといけない.実際,画像ピラミッドを使っているので,640×480の部分は少し減るのだが,それでも大量のデータだ.
改善
「今回の実装」では,行列を構成する処理をGPUで行った.「不要要素削除」の処理が,SLAM用グローバルマップの処理で使ったAtomic Counter(前回記事参照)を用いると,この処理も比較的容易だと分かったからだ.具体的には,グローバルマップからの不要点の削除と同じ処理で実現できる.KinectFusion[2]で引用されている方法[3]を使えば,もっと効率的な処理ができる様子だが,これはまだ実装していない.
実行結果
この動画は,私のノートPC (CPU: Intel Core i7-6567U 3.30Ghz + GPU: Intel Iris Graphics 550) 上で実装したRGB-D SLAMを実行し,それをBandicamで撮影したものだ.なので,実行速度はこのくらいだ.各処理の実行速度をコマンドプロンプトに出力しながらの撮影だったので,これをなくせば気持ちばかり速くなる.だが,大体10fps程度だ.
GitHubへの公開
色々と迷ったけれど,GitHubに現状のコードを公開しました.皆さんからのご指摘や改善案等を頂ければこれ幸いと思ったからです.ちなみに,まだCMakeFileも作っていない段階です.
参考文献
- M. Keller, D. Lefloch, M. Lambers, S. Izadi, T. Weyrich, and A. Kolb, ``Real-Time 3D Reconstruction in Dynamic Scenes Using Point-Based Fusion,'' Proc. Int. Conf. on 3D Vision, pp. 1 - 8, 2013.
- R. A. Newcombe, [tex:{\textit et al}] ``KinectFusion: Real-time Dense Surface Mapping and Tracking,'' Proc. Int. Conf. on Mixed and Augmented Reality, 2011.
- M. Harris, S. Sengupta, and J. D. Owens. Parallel prefix sum (scan) with CUDA. In H. Nguyen, editor, GPU Gems 3, chapter 39, pages 851–876. AddisonWesley, 2007.