はじめに
アルゴリズムを調査し、比較し、実装したりするとき、表示用のツールが毎回異なっていて、不便さを感じる。
この文章が主張すること
表示目的のコードはアルゴリズム用のコードとは別々のリポジトリとして管理する。
表示用のツールをアルゴリズムの開発用のリポジトリから除外することで、
アルゴリズムの実装を変えても共通のツールで表示できる。
ステレオ計測の例
- ステレオ計測は、歴史ある画像認識タスクだ。
- ステレオカメラからどうやってカメラパラメータを決定するタスク
- カメラパラメータを使ってステレオ平行化する作業
- ステレオ平行化済みのleft画像, right画像から視差を算出するタスク
- 視差から点群を算出するタスク
- 透明物体や反射物体を適切に処理をするというタスク
これらに分解される。
いま、残っている中心なタスクはステレオ平行化済みのleft画像, right画像から視差を算出するタスクである。
そのため、いまでも視差を計算する部分を中心に多数の論文が発表されている。
個別のアルゴリズム実装が、表示コードを持っていることの不都合
- それぞれの方法で可視化された結果は、同じ土俵で比較することができない。
- 自分がよいと思う表示方法で、異なるアルゴリズムの結果に対して共通に比較することができない。
アルゴリズム自体を利用するとき
モジュールとしての書き換え
論文に書かれた実装は、論文に示したデータセットで、既存の実装をよりもよい結果をでていることを主張するためのものです。
そのため、そのライブラリを実機で組み込んで使うためのものになっていません。
- ロボティクス分野でステレオ計測を使うときは、完全に組み込み目的で自律的に動くときには、表示は不要になるはずである。
- せいぜい人が目視で確認したり、ログやバッチ処理の結果を表示するときである。
- 表示用のコードでは、matplotlibなどの巨大なライブラリを必要としてしまうことがある。
- そのため、最小限のインストールには、表示用のコードを含めない方がのぞましい。
python3 -m pip install .[dev]
などとして、[dev]を追加で指定したときにだけ、表示用のライブラリをインストールするようにできるだろう。
リポジトリを小さく作る理由
- 多くの処理をすればするほど、依存ライブラリの数が増えてしまう。
依存ライブラリの数が増えていけば、いくほど、依存ライブラリのバージョンの
conflictも生じてしまう。
例:numpy, opencv, matplotlib, sckit-learn, onnruntime, pytorch, tensorflow など
類例:結果の通信用のコードも別にする。
結果を他のプロセスと通信する必要があるとき、
そのコードをアルゴリズムに依存しないように作ろう。
dataclasses-jsonを使うと、
@dataclass として定義してあるclass のインスタンスを簡単にserialize, deserialize できる。
https://pypi.org/project/dataclasses-json/
そのため、結果の受け渡し方へのアルゴリズムの依存性は減らしやすくなっている。
参考
ここでもModel, view を分離することを主張している。
アルゴリズムは、モデルに相当するだろう。