0.バンドル調整 〜 目次

 ご無沙汰しております!社長です!「月に1本のブログアップ」といった新年の誓いもなんのその(笑),更新せずに半年たっちゃいましたが,せっかくの自粛GWを活かして勉強したことまとめ書きします!ということで,以下,エントリです∠(`・ω・´)


 春だ,桜だ,バンドル調整だ~.ということで,牛歩のように進めている一人SFMプロジェクト,やっとこさバンドル調整まで来ました(笑)仕事でも最適化が使いこなせるようになりたいと思っていたことも有り,少しずつ勉強していたのですが,ちょうどいい機会なのでバンドル調整の文脈で最適化のエントリを書いてみたいと思います.このページは目次として書いていますが,個々のページが書き終わった段階でここにリンクを貼りたいと思います.心が折れなければ,,,,最後まで書ききれると思います!

 ちなみに,どの文献をよんでも「ヘッシアンの計算は大変なので,,,」とあったので,力ずくで計算してみました.どろんこになりながら実装したので,少しは最適化を身近に感じるようになりました(笑)

X.モデル化,及び問題設定

 バンドル調整の簡単な説明,モデル化,最小化する数式を説明します.
daily-tech.hatenablog.com

X.回転のパラメータ化

 回転行列のエントリは9つ(3x3)ありますが,回転の自由度は3なので,回転行列以外の方法でパラメータ化しなければいけません.今回は,Angle-Axisを用いてパラメータ化しています.
daily-tech.hatenablog.com

X.Sympy を使った微分計算

 ヤコビアン,ヘッシアンともに近似をつかわず(!)計算しています(笑)さすがに手計算はむりだったので,Sympyを使っています.
daily-tech.hatenablog.com

X.勾配ベクトルとヘッシアンの作成

 バンドル調整における典型的なヘッシアンの構造を踏まえて,勾配ベクトル/ヘッシアンを作ります.
daily-tech.hatenablog.com

X.直線探索

 最急降下法ニュートン法を実行する上で必要となる直線探索のアルゴリズムを調べています.
daily-tech.hatenablog.com

X.最急降下法を用いた解法

 まずは一番シンプルに,最急降下法です.収束の遅さを実感します.

X.共役勾配法用いた解法

 次に,ヘッシアンを使わない共役勾配法がどの程度実用的なのか,やってみます.

X.ニュートン法を用いた解法

 力ずくで計算したヘッシアンを使って,最適化をやってみました.ただ,簡単には収束せず...

X.レベンバーグ・マルカート法を用いた解法

 非線形最小二乗法のデファクトスタンダードである,レベンバーグマルカート法を試しました.

X.Ceres-Solver を用いた解法

 最後に,,,同じ問題設定を Ceres-Solver を用いて解きました.ヤコビアンもヘッシアンも計算せず,あっという間ですね...

X.参考文献

Bundle Adjustment – A Modern Synthesis

SBA: A software package for generic sparse bundle adjustment

X.実験に使ったソースコード

 ソースコードはまだちょっと整理中でして,個々のエントリのアップする時には間に合わせるようにします.
github.com