0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

最新のステレオ計算をモジュール化してみた

Last updated at Posted at 2024-11-21

ここ数年で、ステレオ計算の性能が高くなってきている。
しかし、初心者が最初に使うモジュールはきっと、OpenCVのSGBMの実装だろう。

SGBM の実装は古く、近年の進展を反映していない。

やったこと

そこで、

  1. 最近のステレオ計測でGitHubで公開されている実装の1つをgit clone した。
  2. そのまま動作を確認した。
  3. 自分のほしいインタフェースを追加した
  4. モジュールとしてpip install できるように移植した。
  5. それを、GitHubに公開した。

以下は、その詳細についてのメモです。

論文調査:久しぶりにさわるステレオ計測分野はどう変わったのか

実装の1つを試してみる。git clone

  1. Docker環境で動作を確認する。
  2. 動作環境にJetson AGX Orinを利用した。
    1. GPUがないノートPCより、GPUのあるJetson(CUDAが使える)
  3. 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つの実装をし終えてみて、同様なインタフェースにすることができた。
だから、ステレオ視差計算をえるインターフェースとしては、おかしくない実装になったのではないかと期待している。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?