ここ数年で、ステレオ計算の性能が高くなってきている。
しかし、初心者が最初に使うモジュールはきっと、OpenCVのSGBMの実装だろう。
SGBM の実装は古く、近年の進展を反映していない。
やったこと
そこで、
- 最近のステレオ計測でGitHubで公開されている実装の1つをgit clone した。
- そのまま動作を確認した。
- 自分のほしいインタフェースを追加した
- モジュールとしてpip install できるように移植した。
- それを、GitHubに公開した。
以下は、その詳細についてのメモです。
論文調査:久しぶりにさわるステレオ計測分野はどう変わったのか
- サーベイ論文を見つけて読む。
- そのなかで、GitHubに公開しているもので、商業利用してもいいライセンスのものをみつける。
- そのときの調査結果
ステレオ計算ライブラリを調査中 2024年版
実装の1つを試してみる。git clone
- Docker環境で動作を確認する。
- 動作環境にJetson AGX Orinを利用した。
- GPUがないノートPCより、GPUのあるJetson(CUDAが使える)
- Jetson 用のPyTorchのDocker Imageを用意する。
NVIDIA L4T PyTorch
それを元にして、インストール手順をDockerfileに記述していく。
それをdocker build でdocker環境構築する。
雛形となる例題をまねていけば、Dockerfileを書き直していくのは難しくない。
ライブラリ化するためのリポジトリを作る。
- 参照した元のコードのライセンスを確認すること
- README.mdに元のリポジトリが何なのかを記載しておく。
自分のほしい使い方に書き換えてみる。
もとになった実装は、ファイル入力、ファイル出力だろう。
でも、ステレオ計測は、左カメラ画像、右カメラ画像に対して実行したいだろう。
OpenCVを経由でcv2.VideoCapture()からread()している場合には、
カメラ画像はnp.ndarray型だろう。
そうすると、ファイル名を引数としている関数では使い勝手が悪い。
np.ndarray型を引数とする関数を抽出する。
モジュールファイルに抜き出す。
ステレオ処理を実行する上で必須の部分と、そうでない部分を切り分ける。
画像データをnp.ndarray型で扱うことを決めたときに、
def predict(left: np.ndarray, right: np.ndarray) -> np.ndarray:
このようなインタフェースになる。
ファイル名を引数とするインタフェースは、モジュールファイルに含めないという選択ができる。
関数として実装するのか、クラスとメソッドとして実装するのか
- ステレオ計測のときに、引数に画像データだけをpredict()するタイミング与えたい。
- それ以外の設定パラメータは、predict()するタイミングには意識しなくてよくしたい。
- 学習済みのモデルを事前に読み込んでおきたい。
こういう理由のため、ステレオ計測処理の実装は、クラスとして実装してpredict()はメソッドとして実装するのがよいと考える。
視差表示ライブラリとの連動を試してみる
視差を可視化するモジュールを作ってみたで紹介したモジュールを使って表示を行うようにした。
https://github.com/katsunori-waragai/disparity-view
pyproject.tomlを書く
python3 -m pip install .
でモジュールをインストールできるように、pyproject.tomlを書く。
その状況で、モジュールを利用したスクリプトの動作を検証する。
pytest用のテストスクリプトを書く。
pytest test*.py
でテストできるように、テストスクリプトを書く。
モジュールの実装が壊れたら、きちんと見つけられるようにテストを作っておく。
少しだけ異なる環境でインストールしてみる
OSのバージョンが違うとか、pythonのバージョンが異なるとか、少し違う環境で動作させてみる。
そうすると、環境の違いによってpipで入るライブラリのバージョンが異なってくることで、想定した動作をしなくなることがある。
動作しない理由を解析して、対策を実施する。
USBカメラ入力でのステレオ計測の結果を表示を動作させる。
- StereoLabs のZED2iカメラでは、左画像と右画像を連結した画像をUSBカメラとして出力できる。
- そこで、そのUSBカメラ画像をCv2.VideoCapture(0) を用いて、取り込みステレオ計測するサンプルプログラムを作った。
- このスクリプトではZED SDKをインストールしていないUbuntuマシンでも動作した。
そのAPI設計は妥当なのか
せっかくだから、StereoSGBMを類似のメソッドで利用できるように、ライブラリ化をしてみた。
やったことは、インタフェースを変更したwrapperを書いただけで、アルゴリズムの根幹の部分はいっさい手を加えていない。
libstereosgbm
異なるアルゴリズムであっても、目的な同じアルゴリズムであれば、同様なインタフェースで利用できるゔぇきだと考える。
だから、2つの実装をし終えてみて、同様なインタフェースにすることができた。
だから、ステレオ視差計算をえるインターフェースとしては、おかしくない実装になったのではないかと期待している。