投稿

2月, 2021の投稿を表示しています

NeRF--: Neural Radiance Fields Without Known Camera Parameters

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis (ECCV2020) の発展版でNeRFと異なりカメラの内部、外部パラメータも推定する手法の提案。NeRFに関する説明は、既に色々とあるのでそちらを参照。 [解説スライド] NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis 三次元空間のニューラルな表現とNeRF 基本的には、NeRFなどの新視点画像を生成の研究では、多くの場合、前処理としてStructure-from-Motionなどによって撮影画像のカメラの内部パラメータ(焦点距離や画像中心座標など)および外部パラメータ(回転、併進)を推定しておくことが必要となっている。これに対して、 NeRF--: Neural Radiance Fields Without Known Camera Parameters では新視点画像を生成するためのネットワークの学習時にカメラの内部、外部パラメータも推定してしまおうという研究。 アイデアは単純でカメラの内部、外部パラメータも推定対象としてネットワークを学習するというもの。ただし、内部パラメータは歪無し、光学中心と画像中心の座標は一致している、というもので内部パラメータは焦点距離fx,fyの2パラメータで表現されている。また、全てのフレームにおいて内部パラメータは共通(Shared Intrinsics)を仮定している。 推定処理は多段階になっており、各ステップでNeRFのモデルとカメラの内部、外部パラメータを推定する。ステップを進める際には、カメラのパラメータのみ推定値を保持し、NeRFのモデルについては初期化して学習を行う。これにより、カメラのパラメータが徐々に最適化される仕組みになっており、NeRFのモデルを各ステップで初期化して用いることで局所解の問題をできるだけ回避するようにしているらしい。 実験結果を見ると上手くパラメータの推定が出来ており、COLMAPの推定結果と比較しても同等の結果が得られていることが分かる。ただし、以下のような制約が現状はある模様。 カメラの運動に関しては、姿勢はあまり変化せず、併進が主で同一平面状を運動してい

vcpkg: C++ パッケージ マネージャー

イメージ
これまでは、C++の開発をする際にOpenCVなどのライブラリを自前でビルドして準備し、リンクして使っていた。ただ、このやり方だと、バージョンやビルドオプションの問題が度々起き、時間を溶かすことが多かった。 今回、vcpkgというC++のパッケージマネージャーを使って開発環境を整えることをやってみた。vcpkgで提供されているライブラリは全てVisual Studio 2015、Visual Studio 2017、Visual Studio 2019 との互換性がテストされているそうで、Visual Studioを使って開発している自分にとってはとても都合が良い。 vcpkgを使うための手順は以下の通り。 vcpkgを以下より取得する。 https://github.com/Microsoft/vcpkg 取得したディレクトリにある"bootstrap-vcpkg.bat"を実行する。実行後に"vcpkg.exe"が生成される。 必要なライブラリをインストールする。以下はOpenCVの場合。 vcpkg install opencv4[cuda,world,openmp]:x64-windows Visual Studioに統合するために、コマンドプロンプトで以下を実行する。 vcpkg.exe integrate install Visual Studioで適当なプロジェクトを作成し、プロジェクトのプロパティを開くと以下のようにvcpkgの項目が見えるようになる。また、ヘッダのパスやライブラリのパスなどを手動で設定することなく、#include<opencv2/opencv.hpp>すると自動でヘッダが見つかりOpenCVが利用できるようになっていることが確認できる。 簡単に開発環境の準備が出来てとても良い。ただ、今回OpenCVをインストールしてみたけれど、かなり時間がかかった。(計測していないけれど1時間以上はかかる) また、バカみたいに容量が増えていくので、定期的にvcpkgのディレクトリにあるdownloadsやbuildtreesを削除した方が良いかも。

Photogrammetry (COLMAP + OpenMVS)

イメージ
 以前、Meshroomを使って複数枚の画像から三次元復元を行うPhotogrammetryを行った。 Photogrammetry:  https://moitkfm.blogspot.com/2019/08/photogrammetry.html 今回は、COLMAPとOpenMVSを使ってPhotogrammetryを行ってみる。というのも、以下の記事にあるように、カメラポーズの復元と疎な復元をCOLMAPで行い、密な復元をOpenMVSで行うという組み合わせが復元されるモデルの品質を向上させるためにはよさそうなため。これは、COLMAPはStructure-from-Motionのライブラリであり、疎な復元に特化しており、逆にOpenMVSは既知のカメラポーズを入力としたMulti-View Stereoに特化したライブラリだからだと思う。 COLMAP、OpenMVSはどちらもビルド済みの実行ファイルが公開されているので、上記のパイプラインを試すのはとても簡単。 COLMAPの実行ファイル:  https://github.com/colmap/colmap/releases OpenMVSの実行ファイル: https://github.com/cdcseacave/openMVS_sample/releases/tag/v0.7a また、COLMAPとOpenMVSを使ったパイプラインについては、以下のページにバッチファイルが公開されている。 COLMAP + OpenMVS scripts: https://peterfalkingham.com/2018/04/01/colmap-openmvs-scripts-updated/ ただし、27行目の"--export_path"となっている部分は"--output_path"と修正する必要がある。修正したスクリプトは以下の通り。12行目、15行目、18行目のCOLMAPとOpenMVSへのパス、作業ディレクトリへのパスは各自の環境に併せて修正する必要がある。 ::These parameters are specific to computer ::Store current Directory: set   currDir = %CD% ::get folde

COLMAP開発環境の準備

イメージ
これまでVisualSfMを使っていたが、SfMツールのデファクトスタンダードとなりつつあるCOLMAPに乗り換えてみることにした。ちなみに、COLMAPはECCV2020で PAMI Mark Everingham Prize を受賞している。 COLMAP:  https://colmap.github.io/index.html COLMAPは比較的最近のアルゴリズムも実装されており、聞く話によるとVisualSfMよりも安定した復元が可能らしい。 COLMAPはビルド済みの実行ファイルも公開されているため、すぐに試すこともできる。 COLMAP binaries: https://github.com/colmap/colmap/releases ただ、色々とカスタマイズして利用したいので、今回はVisual StudioでCOLMAPライブラリを利用できるようにすることを目指す。 開発環境(Windows10, Visual Studio 2019)の構築手順は以下の通りとなっている。基本的には、COLMAPのDocumentにあるvcpkgを使ったインストール手順に従えば良い( https://colmap.github.io/install.html )。(vcpkgを使わずにビルドしようとしたが色々と依存関係を解決するのが難しく断念した) vcpkgのインストール git clone https://github.com/microsoft/vcpkg cd vcpkg bootstrap-vcpkg.bat vcpkg integrate install vcpkg install yasm-tool:x86-windows COLMAPのインストール vcpkg install colmap[cuda]:x64-windows COLMAPのDocumentには手順1の"vcpkg install yasm-tool:x86-windows"が無いが、自分の環境ではこれが無いとビルドエラー(Error: Building package gmp:x64-windows failed with: BUILD_FAILED)でインストールが正常に完了しなかった。また、手順2は結構時間がかかるので、完了するまで気長に待つ必要がある。

Differentiable Renderer (Mitsuba2)

イメージ
ここ数年、(主観ではあるが)微分可能レンダリング(Differentiable Rendering)の研究が流行っているように思う。有名どころだと、以下のものがあるかと思う。(専門家ではないので色々と取りこぼしがあると思う) Neural 3D Mesh Renderer (CVPR2018) Differentiable Monte Carlo Ray Tracing through Edge Sampling (ACM ToG2018) Soft Rasterizer: A Differentiable Renderer for Image-based 3D Reasoning (ICCV2019) Mitsuba 2: A Retargetable Forward and Inverse Renderer (ACM ToG2019) SDFDiff: Differentiable Rendering of Signed Distance Fields for 3D Shape Optimization (CVPR2020) Modular Primitives for High-Performance Differentiable Rendering (ACM ToG2020) また、Neural 3D Mesh Rendererの著者がDifferentiable Renderingに関するサーベイ論文をarXivにアップしている。 Differentiable Rendering: A Survey さらに、Modular Primitives for High-Performance Differentiable Rendering (nvdiffrast)の論文では、いくつかのアルゴリズムの特徴を分かりやすい表でまとめてあるのでとても参考になる。 Modular Primitives for High-Performance Differentiable Renderingより引用 Differentiable Renderingを用いることで、パラメータで表現されるシーンから2Dの画像を生成し、生成された画像と目標とする画像との差分を取り、誤差を逆伝搬させることでパラメータを更新する、といったことが可能となる。ただ、画像からレンダリングのパラメータを