2013年12月7日土曜日

Ceres Solverのコンパイル方法 on Windows

Ceres Solverとは?

Ceres SolverはGoogleが開発した非線形最適化のためのC++ライブラリ。 何ができるのかというと、定義した誤差関数を最小化するパラメータを求めることができる。 非線形最適化のための定番アルゴリズムLevenberg–Marquardt法(LM法)などは実装済みで利用者は殆ど意識すること無く使用することができる。 何よりも、Automatic Differentiationという機能がすごい。 誤差関数の微分を数値的にではなくて、解析的に(数式的に)自動的に解いてLM法に組み込んでくれる。 つまり誤差関数そのものを実装するだけで良い。

誤差関数の微分の計算がなくなっただけでそんなに楽になるのだろうか? 例えば、ある誤差関数$f(x,y)$を作成し、これを最小化したいとする。 効率よく計算するためには、この関数の解析的な偏導関数$\frac{\partial f(x,y)}{\partial x}$と$\frac{\partial f(x,y)}{\partial y}$が必要になる。 この場合変数は$x$と$y$の2つだけど、変数が増えると必要な偏導関数の数が増える。 画像自体を推定する場合は、全ての画素の輝度がパラメータになる。 for文などで自動化出来ても$\sin$、$\cos$関数などが含まれている場合は、個々の偏導関数自体が非常に複雜になる場合もある。 誤差関数が複雜な場合、手で計算するのには限界がある。 Mathmaticaのような数式処理ソフトを使う方法もあるが、実装もなかなか面倒だった。

こうした実装をC言語でかつ安直な方法でやろうとすると、 読みづらいマクロと関数ポインタ、グローバル変数を使いまくる実装になってしまう。 Ceres SolverはC++の継承と関数オブジェクトを使って非常に美しく、使いやすい形でまとまっている。 現在のところ日本語の解説は、LinuxのみだったのでWindowsでの動作実績をまとめる。

インストール手順

  1. 必要なファイルライブラリをダウンロード、ビルド
    1. eigen-eigen-ffa86ffb5570.zipをダウンロード(3.1以上)する。ビルドの必要はない。
    2. glog-0.3.3.tar.gzをダウンロードする。
    3. 解凍し、oogle-glog.slnを叩いてビルドする。バッチビルドで全てを選んでビルドする。エラーが出るがビルドは成功。
    4. gflags-2.0-no-svn-files.tar.gzをダウンロード。問題無くビルド成功。
    5. 解凍してgflags.slnの読み取り専用設定を解除。
    6. gflags.slnを叩いてビルドする。
  2. ceresのダウンロード、フォルダ作成
    1. ceres-solver-1.8.0.tar.gzをダウンロードする。
    2. ceres\ceres-install、ceres\ceres-buildフォルダを作成する。
  3. cmakeによるVisual Studioのソリューションファイル作成
    1. cmakeを起動する。
    2. 「Where is the source code」にceres/ceres-solver-1.8.0設定する。
    3. 「Where to build the binaries」にC:/library/ceres/ceres-buildを設定する。
    4. 一度configureする。エラーが出て止まる。
    5. GroupedとAdvancedにチェックを入れると全てのオプションが見えるようになる。
    6. CMAKE_INSTALL_PREFIXにceres\ceres-installへの絶対パスを入れる。
    7. EIGEN_INCLUDE_DIRにeigen3.2への絶対パスを入れる。
    8. 再度configureする。エラーが出て止まる。
    9. GLOG_INCLUDE_DIRにglog-0.3.3\src\windowsへの絶対パスを入れる。
    10. GLOG_LIBRARYにglog-0.3.\Release3\libglog.libへの絶対パスを入れる。
    11. GFLAGS_INCLUDE_DIRにgflags-2.0\src\windowsへの絶対パスを入れる。
    12. GFLAGS_LIBRARYにgflags-2.0\Release\libgflags.libへの絶対パスを入れる。
    13. CX_SPARSE_INCLUDE_DIRにCXSparse\Includeの絶対パスを入れる。
    14. CX_SPARSE_LIBにCXSparse\Lib\CXSparse.libの絶対パスを入れる。
    15. 再度configureする。
    16. generateするとceres\ceres-buildにCERES.slnが生成されている。
  4. CERES.slnを叩いてビルドする。バッチビルドでALL_BUILDとINSTALLのチェックを全て付けてビルドする。

テスト環境

  • Visual Studio 2010 sp1
  • Windows 7 Pro

参考