今更ながらInfiniTAM v3を動かしてみたい,と思い立ちビルド&実行してみた.自分の動作環境ではCUDA絡みで引っかかるところがあったので,そのことについて記しておくことにした.
ソリューションファイルの生成とビルド
現在の動作環境
とりあえず,今持っている環境でビルドできるか試す.
- OS: Windows 10 64-bit
- Libraries
- CUDA: v10
- freeglut: 3.0.0
- OpenNI2
- IDE: Visual Studio 2017 Community
- CMake: 3.12
CMakeを使ってソリューションファイルを生成
必須の項目以外は無理に導入しないことにした.ただ,RealSenseは試してみようかと思い,チェックを入れた.
VS2017でInfiniTAM.slnをビルド
ビルドエラー(CUDAのバージョン違い)
まず,VS2017でビルドしようとすると,このIssueと同じ状況に陥った.InfiniTAM v3のGitHubにあるREADME.mdにも書いてあるが,CUDAとVSのバージョンを適切なものを選ばないといけない様子.著者の直接の返信を読むと,CUDA 9での動作確認はしているように思えるので,CUDA 9を入れて試すことに.
ビルドエラー(VSのバージョン違い)
ということで,CUDA 10を9に変更して再度CMakeを実行.すると今度はCUDA/v9.0/include/crt/host_config.h
にある,以下の部分で引っかかった.
#if _MSC_VER < 1600 || _MSC_VER > 1911 #error -- unsupported Microsoft Visual Studio version! Only the versions 2012, 2013, 2015 and 2017 are supported!
VS2017を使っているのだが... と思い,_MSC_VERとバージョンの対応表を確認したところ,私のVS2017は1916
の様で_MSC_VER > 1911
で引っかかってしまう.ちなみに,ここまでの情報から,先の著者の返答にある「VS2017はRTMのみ」というのは間違っていると思う.
VS2017にVS2015のコンパイラを入れることもできると思うのだが,個人的な嗜好で,ソリューションファイルを開く段階でバージョンを分けたかったのでVS2015を導入することに.ただ,やってみて分かったこととして,2019年現在,VS2015を入れるのもひと手間.インストーラが見つからない... 結局,このStackOverflowの回答にあるリンクからインストーラを手に入れた.尚,VS2015をインストールした後,結局,自分で明示的にC++コンパイラをインストールしなければならなかった...
CMakeがVS2015のC++コンパイラを見つけられない
困った.このStackOverflowにある内容とと同じエラーが発生.結果,CMakeを入れなおしたら解決した.この際,新しいバージョン (3.14) に更新したりもしたので詳しい原因は不明だが,解決できたので良しとする.
最終的に成功したCMakeの設定は以下の通り.
ビルドエラー(RealSense SDK2関連)
RealSense2Engine.h
にて,std::unique_ptr
に関するエラーが出ている.詳しくはこのStackOverflowの内容と同じなので割愛するとして,最終的に,#include <memory>
を追記することで解決した.
DLLに関するリンカエラー
このStackOverflowの内容によると,ランタイムライブラリへのリンクの設定がちぐはぐになっている様子.ひとまず何も考えず,全プロジェクトファイルを以下の様に設定したところようやく動作し始めた.
追記 先日,もう一度,CMakeからやり直したらこのエラーが出なかったので,何等か別の問題があったのかもしれない.
最終的な動作環境
- OS: Windows 10 64-bit
- Libraries
- CUDA: v9.0
- freeglut: 3.0.0
- OpenNI2
- IDE: Visual Studio 2015 Community
- CMake: 3.14
動作確認
ビルドが完了するとInfiniTAM-master\build\Apps\InfiniTAM\Release
以下にInfiniTAM.exeが生成されるのでこれを実行する.以下の構成のPCを使った.CUDAが必要なので,NVIDIA製のGPUは必須.
Voxel
初期設定ではVoxel空間の3次元復元がされる様子.また,OpenNI2の仕様で画像がミラーリングされている.右下の数字がフレームレートを表しているにしては遅すぎるので,何なのかと不思議に思っている.
Surfel
Surfelでの3次元復元に切り替えたい.SurfelとVoxelを切り替えるには,ITMLibSettings.cpp
にある45行目と46行目で切り替えられる.LIBMODE_BASIC_SURFELS
を選べばSurfelに切り替わる.
//libMode = LIBMODE_BASIC;
libMode = LIBMODE_BASIC_SURFELS;
Voxelの場合,一度復元された物体がKinectに映らなくなった場合,Voxel空間からじんわりと消えていくのだが,Surfelの場合は消えない.上のスクリーンショットを見ると,私の足が消えない.元になっている本来の実装では消えるはずで,私の実装でも消えるので,単にInfiniTAMでは未実装なのかと理解している.
ちなみに,RealSenseのSR300で動作確認をしようとしたところ,何等かエラーが出てRGBDフレームが得られない様子なのでまたの機会に試すことにした.
所感
最終的に動作した環境は以下の通り.今回のインストールを通して感じたのは,CUDAはバージョンの更新が早く,新しい機能が早期にアクセスできる分,すぐにバージョン遅れになって長期的な保守が難しいという印象.