交通シーンで物体を覆う棒状のようなものがstexilと呼ばれ、中レベルの画像表現として障害物検出などに使われています。Stexilを計算するときに、通常ステレオカメラで視差画像 (Disparity)を求める必要があります。本記事はDeepLearningを用いて、単眼カメラ画像よりStexilを求める方法を紹介します。本記事はこちらの記事を和訳したものです。
Stixel Overview
画像の構成について考えてみます。例えば、最も小さい単位が画素値 (pixel) です。画素値は画像において一つの微小領域における明るさのことです。このほか、2次元画像において、ある物体の位置情報の集まりを一つの単位として考える場合は、物体領域 (region)があります。例えば、下記の画像の青い領域がその一つです。画素値に比べると、物体領域はよりハイレベルな情報を表す。具体的には、物体の2次元形状や視覚的な情報:carなどがあります。しかし、このようなハイレベルな情報を求めるには計算量が大変多くて、リアルタイムアプリではボトルネックとなることがあります。
Stixelはpixelとregionの間に位置し、画像領域に固定幅の棒状に区切ってその領域を障害物とする手法です。Stixelの色は障害物からカメラまでの距離を表します。
Stixel計算-ステレオ画像
Stixelを求めるときに、まずステレオ画像から視差画像 (Disparity Map)を計算します。次にDisparity Mapを等間隔の列に区切り、各列に対して高さが異なるSegmentまで分割し、Sky, Object, Groundいずれかに分類します。ここで各Segmentに対して、
Data項:Segmentがあるクラスに属しているとき期待される視差値と実際の視差値の誤差
Prior項:Segmentの割り当て方に関する先験情報。入力とは無関係
からなるコスト関数を定義し、これらの和が最小となる分割を求めます。
Stixel Computation Process Flow: The original way
Stixel計算-単眼画像
上記の処理の流れからわかる通り、Stixelの計算はあくまでもDisparity Mapの分類問題に過ぎない。その前提として、2枚のステレオ画像は欠かせないことに気づいたと思いますが、問題は、全てのシステムにステレオカメラを設置できるわけではありません。また単眼画像しかない古い走行データセットなどは、Stixel画像を取得したいという需要があるかもしれません。そこでDeepLearningの出番です。Depth Estimation Networkというモデルを使用して、単眼画像からDisparity Mapを求めることができるのです。
Depth Estimation Network modelとは、pixel-wise単眼画像から視差を推定するモデルで、学習データセット以外の画像でも効果的です。 (Related work: Paper & Implementation。
Disparity関連のモジュールをDepth Estimation Networkに変えると単眼画像でもDisparity Mapを作ることができるようになります。その流れは下記の通りです。
Stixel Computation Process Flow: Our proposal
Demo
Stixelの2次元の座標は物体の位置を、Stixelの色は物体とカメラとの距離を表しています。右の鳥瞰図では、色がStixelの高さで、位置がz軸に沿ってStixelの分布状況を示します。
処理時間: 50ms / frame
CPU: i7-7700 3.6GHz
GPU: NVidia 1050Ti
まとめ・今後の課題
- DeepLearningを用いて単眼画像から視差を推定可能
- 学習として使っていないシーンでもうまく推定できる
- 学習データセットにない物体があった場合、視差画像に誤差が生じる
- Stixelを求めるときにカメラのz座標をパラメータとして使用したため、下図のように突然の揺れが起きるとノイズが発生する。
Stixels are sensitive to camera bumping