Ubuntu14.04へのCPD(Coherent Point Drift)ライブラリのインストール
こちらの仕事でComputer visionやらパターン認識の世界でおなじみのPoint set registration - Wikipedia, the free encyclopedia、特に非剛体レジストレーションを取得する必要に迫られていますが、なかなか良い教科書が見つからず困っているところです。
二点群間のマッチング手法としては、剛体レジストレーションでよければICPアルゴリズムが鉄板のようですが、非剛体レジストレーションとなると一気に説明が厄介に。
とはいえ、やり方としてはだいたいどの手法も共通していて、最尤推定法(これさえちゃんと理解してるとは言い難い)がベースと考えてよさそうです。剛体レジストレーションやアフィン変換においては適当な尤度関数を使用して、尤度を最大にするように点群の位置を決定します。
一方、非剛体レジストレーションだと点群の移動自由度が大きくなりすぎて解が安定しないため、尤度関数にTikhonovの正則化項を付け足した汎関数を作り、変分問題として対処するようです。このときの汎関数の形をどうするかが難しいところのようで、Tikonovの正則化項の重みも結果に大きく影響するし、そのへんの変数のハンドリングが問題依存で難しいというのもあるようです。
で、まじめに勉強しようと思うと時間がかかりそうだし、別に新手法を開発しようという気もないので、適当なライブラリを物色してみました。結果、前述のWikipediaの一番最後に紹介されていた、比較的新しい手法であるらしいCoherent point driftについてC++ライブラリを見つけたので、せっかくだからインストールしてみました。
手順はほとんど下記ページでわかります。
https://github.com/gadomski/cpd
armadilloとgflagsのインストールについて、sudo apt-get installで抜けようとしたらダメだったので、これだけ手動でそれぞれのページに行き、ソースコードからコンパイルしてインストールしました。
cmakeでのソフトウェアのインストール手順がわかってないとまごつくかもしれませんが、まあ知れています。わざわざ書いておいて何ですが。
コマンドラインから
cpd file1.txt file2.txt > output.txt
だけでcpdが扱えるので中々お手軽です。
また、cpdアルゴリズムの開発者であるMyronenkoさんはMatlabコードを公開してくれてます。
Point Set Registration - Andriy Myronenko
matlabユーザーはこっちのほうが楽ですかね。
追記<20151207>
ちゃんと確認できていないが、C++とmatlabのコードで同じ問題を解いてみると解が異なる。パラメータやアルゴリズムが統一されていないのは予想していたので変ではないが、研究開発で使うためにはちょっと困る。まじめに使いたい人はちゃんとソースを読まないと危険な感。作成者のMatlabコードを使うのが無難かも。