Stixelを用いた視差画像からのフリースペース計算 〜(理論編2)

ということで,実装編に入る!と思っていたんですが,「どうやって動的計画法を実装するか?」という点を抑えておきたく下記の理論編1に引き続き理論編2のエントリも書くことにしました.

daily-tech.hatenablog.com

1.参考文献

こちらのエントリでは下記の論文の内容を見ていきますが,論文内容としては「Stixel をどうやって Cuda で実装するか?」です.

  • GPU-accelerated real-time stixel computation

画像処理をやる人の端くれとして,一応 Cuda には触ったことはあるのですが,あまりむずかしい並列化はやったことがなく,今回の Stixel の問題は難易度も結構高くていい題材かと思ったので論文を読んでまとめてみることにしました.(が,このエントリでは動的計画法のとこまでしか書いてません.Cuda化のところは実装編で触れます.)

2.問題のおさらい

細かい問題定義は「理論編1」を見ていただくとして,簡単に問題構成のおさらいをしておきます.解こうとしている問題は,「視差画像 D が与えられたときに,尤度が最大となるような Stixel の集合 L を見つける.」ことです.

f:id:rkoichi2001:20191013102429j:plain
理論編1のおさらい

で,尤度が最大になるような Stixel L の集合をどうやって見つけるか?ですが,簡単に言うと可能な Stixel の組み合わせを総当りで試してみて,その中で尤度が最大になる組み合わせを採用します.この総当り計算を実施するときに,単純に全組み合わせを計算すると計算量が爆発してしまうので,「重複した計算を避ける」ために動的計画法が出てきます.で,動的計画法の話に入る前に,解法に重要な影響を与える2つの前提を書いておきます.

1.隣り合う列は互いに独立である.
2.それぞれのピクセルの視差の値は互いに独立である.

上の2つの前提をおいたおかげで,Stixel を求める問題は列・ピクセルの問題に簡単化することができます.これを図示すると,下記のようになります.

f:id:rkoichi2001:20191011082741j:plain
2つの前提による問題の簡略化

3.動的計画法のおさらい

次に,簡単に動的計画法のおさらいをしておきます.この Stixel の問題と類似の問題を見つけたので,別のエントリとして作ってみました.

daily-tech.hatenablog.com

で,上記エントリの場合の問題設定は下記でした.

ロッド切り出し問題
あなたはコーナンで働いているとします!長〜い金属棒を仕入れて,これを小分けに切断して販売したいですが,金属棒は長さによって販売価格が異なります.そして,販売価格は長さに比例しているとは限りません!このときに,長さ n の金属棒をどのように切断すれば売上を最大化できるでしょうか?

動的計画法の観点では,この問題はとても良く似ています.

f:id:rkoichi2001:20191012223942j:plain
ロッド切り出し問題と Stixel の最適化問題の比較

一点異なる点として,ロッド切り出し問題の場合は単純に切り出し方法を決めればよかったのに対し,Stixel の最適化計算では Stixel の種類(Sky, Ground, Object)が変数として増えてきます.

4.動的計画法を用いた Stixel の解法

ロッド切り出し問題との類似点がわかったので,同様の考え方で動的計画法を解いてみたいと思います.

4.1.細かな問題設定

下記,論文にある問題設定です.

・Stixel は3種類(Object, Ground, Sky)
・Stixel自体 の表記方法

 1. 開始端を row = b,終了端を row = t にもつ,Object の Stixel:obtb = {vb, vt, Object}
 2. 開始端を row = b,終了端を row = t にもつ,Sky の Stixel:skytb = {vb, vt, Sky}
 3. 開始端を row = b,終了端を row = t にもつ,Ground の Stixel:groundtb = {vb, vt, Ground}

・集約コストの表記方法

 1. 終了端を row = k にもち,最後の Stixel が Object である場合の集約コスト: OBk
 2. 終了端を row = k にもち,最後の Stixel が Sky である場合の集約コスト: SKk
 3. 終了端を row = k にもち,最後の Stixel が Ground である場合の集約コスト: GRk

で,やっぱりわかりにくいので描画します!

f:id:rkoichi2001:20191012234143j:plain
問題設定

4.2.評価式

評価式自体は,理論編1のときに紹介したものがベースになっています.が,,,2つの論文で評価式がちょっと違っていたので,これは実装と突き合わせながら,実装編で確認します.

4.3.動的計画法

で,ようやく評価式ができたとして,動的計画法を用いて最適化問題をときます.

f:id:rkoichi2001:20191013001443j:plain
終了端を k にもつ最適な集約コスト

上図を見てもらうとわかると思うのですが,ある画像列に対して高さ h までの集約コストが最適になるものを求めるという問題なので,ロッドの切り出し問題とよく似ています.が,Stixel の種類が3つあるということと,評価式が実質的に2つの項(条件付き確率項,事前確率項)からなるということで,ちょっとだけ問題が複雑になります. この条件を鑑みて,動的計画法の漸化式を書いてみます.

f:id:rkoichi2001:20191013004451j:plain
終了端を k にもつ最適な集約コスト(Stixel の種類を考慮)

上図に描画したとおり,Stixel の種類が3種になることから下記の点が異なってきます.

・考慮している Stixel (終了端が k) 自体に関して,3つの分岐ができる.
・考慮している Stixel (終了端が k) の一つ前の Stixel に関して,3つの分岐ができる.

ここまでで,動的計画法の漸化式が求まりました.前述したとおり,この論文のメインテーマは「Cudaでどうやって並列化するか?」なのですが,これは実装編でかければと思います.