深度認識のためのカスタム埋め込みステレオシステムの構築方法

カメラ付きステレオビジョン、ライダー、飛行時間センサーなど、深度認識システムの開発にはさまざまな3Dセンサーオプションがあります。各オプションには長所と短所があります。ステレオ・システムは、通常、低コストで屋外での使用に十分な堅牢性を備え、高解像度のカラー・ポイント・クラウドを提供できます。

現在、市場ではさまざまなステレオシステムが市販されています。精度、ベースライン、視野、解像度などの要因によっては、システムエンジニアが特定のアプリケーション要件に対応するためにカスタムシステムを構築する必要がある場合があります。

この記事では、まずステレオビジョンシステムの主な部分について説明し、その後、既製のハードウェアコンポーネントとオープンソースソフトウェアを使用して、独自のカスタムステレオカメラを作成する方法を説明します。このセットアップは埋め込みに焦点を当てているため、ホストコンピューターを必要とせずに、あらゆるシーンの深度マップをリアルタイムで計算します。別の記事では、スペースが制約の少ないホストコンピューターで使用するカスタムステレオシステムを構築する方法について説明します。

このようなオンボード処理システムから大きな恩恵を受けることができる別のアプリケーションは、オブジェクト検出です。ディープラーニングの進歩により、オブジェクト検出をアプリケーションに追加することは比較的簡単になりましたが、専用の GPU リソースが必要なため、多くのユーザーにとって法外なものになっています。この記事では、高価なホスト GPU を必要とせずにステレオ ビジョン アプリケーションにディープ ラーニングを追加する方法についても説明します。この記事のサンプル コードとセクションをステレオ ビジョンとディープ ラーニングに分けましたので、アプリケーションでディープ ラーニングが必要ない場合は、ディープ ラーニングのセクションをスキップしてください。

ステレオビジョンの概要

ステレオビジョンとは、2つの視点からシーン内の情報を比較し、デジタル画像から3D情報を抽出することです。2つの画像平面におけるオブジェクトの相対位置は、 からのオブジェクトの深度に関する情報を提供します。

ステレオビジョンシステムの概要を図1に示しています。このシステムは、以下のように重要なステップで構成されています。

  1. キャリブレーション:カメラキャリブレーションとは、内因性外因性の両方を指します。内因性キャリブレーションは、画像の中心、焦点距離、歪みパラメーターを決定します。一方、外因性キャリブレーションは、カメラの3D位置を決定します。これは、多くのコンピュータービジョンアプリケーションにおいて、特に深度などのシーンに関するメトリック情報が必要な場合には、重要なステップです。キャリブレーションのステップについては、以下のセクション5で詳しく説明します。
  2. 整流:ステレオ整流とは、カメラセンター間の線に平行な共通の平面上に画像平面を再投影するプロセスを指します。整流化後、対応する点は同じ行に置かれ、これにより、マッチングのコストおよび曖昧さが大幅に減少します。このステップは、独自のシステムを構築するために提供されたコードで行われます。
  3. ステレオのマッチング:これは、左右の画像間でピクセルを一致させるプロセスを意味し、これにより異なる画像が生成されます。セミグローバルマッチング(SGM)アルゴリズムは、独自のシステムを構築するために提供されるコードで使用されます。
  4. 三角測量:三角測量とは、3D空間内の点が2つの画像上に投影されることを考慮して、その点を決定するプロセスを指します。視差画像は3D点群に変換されます。

ステレオ_パイプライン.jpg

図1:ステレオビジョンシステムの概要

ディープラーニングの概要

ディープラーニングは、脳の構造と機能に触発されたアルゴリズムを扱う機械学習のサブフィールドです。それは人間の脳の学習能力を模倣しようとします。ディープラーニングアルゴリズムは、物体認識、分類、セグメンテーションなどの複雑な操作を効率的に実行できます。とりわけ、ディープラーニングにより、機械はそれに供給された画像内の人や物体を認識できます。私たちが興味を持っている特定のアプリケーションは、人の検出です。独自のディープラーニングアルゴリズムをトレーニングするには、ラベル付けされた大量のトレーニングデータが必要ですが、オープンソースの事前トレーニング済みモデルを使用すると、誰でも簡単にこれらのアプリケーションを開発できます。

ディープラーニングにも高性能 GPU が必要ですが、TX2 用の Quartet ソリューションには、フォームファクターと消費電力のほんの一部で、より大きな GPU のすべての機能が付属しています。TX2 でディープラーニングモデルを実行することには、モビリティの追加の利点もあり、人を検出して人を避ける必要があるモバイルロボットの完璧な候補です。

設計例

ステレオシステムの設計例を見てみましょう。動きの速い物体による動的な環境での移動ロボットアプリケーションの要件は次のとおりです。対象のシーンのサイズは2m、カメラからシーンまでの距離は3 m、求められる精度は3mで1cmです。

ステレオ精度の詳細については、この記事を参照してください。深度誤差は、以下によって求められます。ΔZ=Z²/Bf * Δd は、以下の要因に依存します。

  • Zは範囲
  • Bはベースラインです
  • fはピクセル単位の焦点距離で、カメラの視野と画像の解像度に関連しています。

これらの要件を満たすことができる、さまざまな設計オプションがあります。上記のシーンのサイズと距離の要件に基づいて、特定のセンサーのレンズの焦点距離を決定できます。ベースラインと共に、上記の式を使用して3 mでの予想される深度誤差を計算し、精度要件を満たしていることを確認します。

より長いベースラインを持つ低解像度カメラ、またはより短い の高解像度カメラを使用した2つのオプションを図2に示しています。最初のオプションは大型カメラですが、計算の必要性が低く、2番目のオプションは小型カメラで、計算の必要性が高くなります。モバイルロボットにとってはコンパクトなサイズがより望ましいため、このアプリケーションでは2つ目のオプションを選択しました。処理ニーズに対処するために強力なGPUを搭載したTX2用Quartet Embedded Solutionを使用できます。

design_options.jpg

図2:サンプルのアプリケーション用のステレオシステム設計オプション

ハードウェア要件

この例では、IMX273 Sony Pregiusグローバルシャッターセンサーを使用して、ベースライン12cmの3Dプリントバーに、2台のBlackfly Sボードレベル1.6 MPカメラを取り付けます。どちらのカメラも、同様の6 mmのSマウントレンズを備えています。カメラは、2本のFPCケーブルを使用してTX2 カスタム・キャリア・ボード用のQuartet Embedded Solutionに接続します。左右のカメラを同期して画像を同時に捉えるには、2つのカメラを接続する同期ケーブルを制作します。図3に、カスタム埋め込みステレオシステムの前面図と背面図を示します。

Stereo.jpg

図3:カスタム埋め込みステレオシステムの前面図と背面図

次の表には、すべてのハードウェアコンポーネントを示しています。

部品

説明

数量

リンク

ACC-01-6005

Quartet Carrier、TX2モジュール8GB付き

1

https://www.flir.com/products/quartet-embedded-solution-for-tx2/

BFS-U3-16S2C-BD2

1.6 MP、226 FPS、Sony IMX273、カラー

2

https://www.flir.com/products/blackfly-s-board-level

ACC-01-5009

ACC-01-5009:BFSカラーボードレベルカメラ用Sマウント& IRフィルター

2

https://www.flir.com/products/s_mount-front

BW3M60B-1000

6 mm Sマウントレンズ

 

http://www.boowon.co.kr/site/down.asp?fileName=BW3M60B-1000.pdf

ACC-01-2401

ボードレベルBlackfly S用15 cm FPCケーブル

2

https://www.flir.com/products/15-cm-fpc-cable-for-board-level-blackfly-s/

XHG302

NVIDIA® Jetson™ TX2/TX2 4GB/TX2i アクティブ ヒートシンク

1

https://connecttech.com/product/nvidia-jetson-tx2-tx1-active-heat-sink/

 

同期ケーブル(独自に制作)

1

https://www.flir.com/support-center/iis/machine-vision/application-note/configuring-synchronized-capture-with-multiple-cameras/

 

取り付けバー(独自に制作)

1

 

どちらのレンズも、用途に必要な距離範囲にカメラの焦点を合わせるために、調整する必要があります。各レンズのネジ(図4で赤い丸で囲まれたもの)を締めて焦点を合わせます。

側面図.jpg

図4:レンズスクリューを示すステレオシステムの側面図

ソフトウェア要件

a. Spinnaker

Teledyne FLIR Spinnaker SDKはQuartet Embedded SolutionsのTX2用にプレインストールされています。Spinnakerはカメラと通信する必要があります。

b. CUDAサポート付きOpenCV 4.5.2

使用しているステレオマッチングアルゴリズムであるSGMには、OpenCVバージョン4.5.1以降が必要です。この記事のコードを含むzipファイルをダウンロードし、StereoDepthフォルダーに解凍します。OpenCVをインストールするスクリプトはOpenCVInstaller.sh.です。ターミナルに次のコマンドを入力します。

    cd ~/ステレオ深度
    chmod +x OpenCVInstaller.sh
    ./OpenCVInstaller.sh

インストーラーが管理者パスワードの入力を求めます。OpenCV 4.5.2のインストールを開始します。OpenCVのダウンロードと構築には、2時間ほどかかる場合があります。

c. Jetson-inference (ディープラーニングが必要な場合)

Jetson-inference は NVIDIA のオープンソースライブラリで、TX2 などの Jetson デバイスで GPU アクセラレーションによるディープラーニングに使用できます。このライブラリは、NVIDIA GPU での高性能推論を容易にする TensorRT SDK を利用しています。Jetson-inference は、事前にトレーニングされ、すぐに使用できるディープ ラーニング モデルの配列と、TensorRT を使用してこれらのモデルをデプロイするためのコードをユーザーに提供します。Jetson-inference をインストールするには、ターミナルで次のコマンドを入力します。

  • cd ~/StereoDepth
  • chmod +x InferenceInstaller.sh
  • ./InferenceInstaller.sh

キャリブレーション

ステレオ画像を取り込み、キャリブレーションするコードは、“キャリブレーション”フォルダー内にあります。SpinView GUIを使用して、左右のカメラのシリアル番号を特定します。設定では、右のカメラがマスター、左のカメラがスレーブです。マスターおよびスレーブカメラのシリアル番号をgraveStereoImages.cppファイルの60行目と61行目にコピーします。ターミナルで次のコマンドを使用して、実行可能なファイルを作成します。

    cd ~/StereoDepth/Calibration
    mkdir build
    mkdir -p画像/{left, right}
    cd build
    cmake ..
    作成

このリンクからチェッカーボードパターンを印刷し、平らな表面に取り付けてキャリブレーション対象として使用します。図5に示すように、較正中に最良の結果を得るには、SpinViewで自動露出をオフに設定し、チェッカーボードパターンをクリアにして、白い四角形が露出しすぎないように露出を調整します。キャリブレーション画像を収集した後、ゲインと露出をSpinViewで自動に設定することができます。

Spinview settings.png

図5:SpinView GUIの設定

画像の収集を開始するには、次のように入力します。

    ./grabStereoImages

コードは、毎秒約1フレームで画像の収集を開始する必要があります。左の画像は、画像/左のフォルダーに、右の画像は、画像/右のフォルダーに保存されます。ターゲットを動かして、画像のすべてのコーナーに見えるようにします。ターゲットを回転させて、近くや遠くから画像を撮影できます。デフォルトでは、プログラムは100個の画像ペアを撮像しますが、コマンドライン引数で変更できます。

    ./grabStereoImages 20

これにより、20組の画像のみが収集されます。フォルダーに書き込まれた画像は上書きされます。図6にキャリブレーションの画像サンプルを示します。

キャリブレーション.jpg

図6:キャリブレーションの画像サンプル

画像を収集した後、次のように入力してキャリブレーションPythonコードを実行します。

    cd ~/StereoDepth/Calibration
    python cameraCalibration.py

これにより、ステレオシステムの固有パラメータと外部パラメータを含む、“intrinsics.yml” と “extrinsics.yml” という2 つのファイルが生成されます。このコードはデフォルトでは30mmチェッカーボードの正方形のサイズを想定していますが、必要に応じて編集することができます。キャリブレーションの最後に、キャリブレーションがどの程度良好であるかを示すRMSエラーが表示されます。良好なキャリブレーションとしての一般的なRMS誤差は、0.5ピクセル未満である必要があります。

リアルタイムの深度マップ

リアルタイムで差異を計算するコードは、“深度”フォルダー内にあります。カメラのシリアル番号をlive_disparity.cpp ファイルの230行目と231行目にコピーします。ターミナルで次のコマンドを使用して、実行可能なファイルを作成します。

    cd ~/StereoDepth/Depth
    mkdir build
    cd build
    cmake ..
    作成

“intrinsics.yml ” とキャリブレーションのステップで取得した “extrinsics.yml” ファイルをこのフォルダーにコピーします。リアルタイム深度マップデモを実行するには、次のように入力します。

    ./live_disparity

左側のカメラ画像(未整流の生画像)と深度マップ(最終出力)が表示されます。出力の例を図7に示します。カメラからの距離は、深度マップの右側の凡例に従って色分けされます。深度マップの黒い領域は、その領域に格差データがないことを意味します。NVIDIA Jetson TX2 GPUにより、1440 × 1080 の解像度で毎秒5フレームまで、720 × 540 の解像度で毎秒13フレームまで実行できます。

特定のポイントの深度を表示するには、深度マップでそのポイントをクリックすると、図7の最後の例に示すように、深度が表示されます。

左と深度マップ.jpg

図7:左カメラ画像と対応する深度マップのサンプル。下部の深度マップには、特定のポイントの深度も表示されます。

ペット検出

Jetson-inference によって提供される DetectNet を使用して、画像フレーム内の人間を検出します。DetectNet には、オブジェクト検出用のディープラーニングモデルアーキテクチャを選択するオプションが付属しています。シングルショット検出(SSD)アーキテクチャと MobileNetV2 バックボーンを使用して、速度と精度の両方を最適化します。デモを初めて実行するとき、TensorRT はシリアル化されたエンジンを作成して推論速度をさらに最適化しますが、完了するまでに数分かかる場合があります。このエンジンは、さらに実行するためにファイルに自動的に保存されます。使用されるアーキテクチャは非常に効率的であり、検出モジュールを実行するために ~50 fps が期待できます。人物検出機能とリアルタイムのステレオ深度のコードは、「DepthAndDetection」フォルダーにあります。カメラのシリアル番号を 271 行目と 272 行目live_disparity.cppファイルにコピーします。ターミナルで次のコマンドを使用して実行可能ファイルをビルドします。

  • cd ~/StereoDepth/DepthAndDetection
    mkdir
    buildcd
    buildcmake ..
    make

キャリブレーション手順で取得した「intrinsics.yml」ファイルと「extrinsics.yml」ファイルをこのフォルダにコピーします。リアルタイムの深度マップのデモを実行するには、次のように入力します。

  • ./live_disparity

左の整流カラー画像と深度マップを示す2つのウィンドウが表示されます。深度マップは、深度マップをよりわかりやすくするために色分けされています。どちらのウィンドウにも、フレーム内の人物を囲む境界ボックスがあり、カメラから人物までの平均距離が表示されます。ステレオ処理とディープ ラーニング推論の両方を使用して、デモは 1440 × 1080 の解像度で約 ~4 fps、720 × 540 の解像度で最大 11.5 fps で実行されます。

図 8:左カメラ画像と対応する深度マップのサンプル。すべての画像は、画像で検出された人物とカメラからの人物の距離を示しています。

人物検出アルゴリズムは、閉塞などの困難な状況でも複数の人物を検出することができます。このコードは、以下に示すように、画像で検出されたすべての人物までの距離を計算します。

imageipo6s.png

図 9:左の画像と深度マップは、画像内で検出された複数の人物と、カメラからの対応する距離を示しています。

結語

ステレオビジョンを使用して深度認識を展開すると、屋外での良好な機能、高解像度の深度マップを提供する能力、低コストの既製のコンポーネントで非常にアクセスしやすいという利点が得られます。要件に応じて、市販のステレオ・システムが多数あります。カスタム埋め込みステレオシステムを開発する必要がある場合は、ここに記載されている説明を使用することで、比較的簡単な作業で済みます。

関連記事