9. KITTIのStereo2012ベンチマークにGLDSというMethod名で応募96位

Source codes of the Method GLDS (Gaze_Line-Depth model Stereo) are submit_kitti.cpp and graph_cut.cu . The makefile for GLDS is makefile . You should type "make do7".

KITTIの真値視差画像の形式が違う

KITTIの真値視差画像はTSUKUBA画像とは違って左画像のピクセルにスケールファクタ256の視差を16ビットで指定するようになっていました. 視差は右画像に定義するものと思っていましたから面食らってしまいました. 左が基準画像であることはTSUKUBA画像もKITTI画像も同じでした. 記事7で紹介したdata_stereo_flow.zipファイル群の中から

  • quote training/colored_0/000000_10.png again as L000000_10.png
  • quote training/colored_1/000000_10.png again as R000000_10.png
  • new quote training/disp_occ/000000_10.png as O000000_10.png
  • new quote training/disp_noc/000000_10.png as N000000_10.png
しました.最初の2枚は記事7と同じです.この4枚の画像を以下に示します.
L000000_10.png
R000000_10.png
O000000_10.png
N000000_10.png
O000000_10.pngはLiDARで検出したすべての距離を視差に変換した視差画像, N000000_10.pngはステレオカメラでは視差が検出できない部分を無効とした視差画像だそうです. 無効はTSUKUBAと同様に値0で表されます. このN000000_10.pngに本当に本来視差が検出できない部分が含まれていないのか TSUKUBA画像のとき(記事2)と同じようにチェックしてみました. このチェックを行うプログラムは記事2のtrue_disparity.cppをKITTIの形式に変更した true_kitti.cppです. これとmakefileを ダウンロードして,
make do2
と打ち込み,コンパイルと実行を行ってください. このチェックの結果,本来視差が定義できないピクセルであるにもかかわらず 視差が定義されているピクセルが962ピクセルあることが検出されました. 次の図の赤い部分が本来視差が定義できないピクセルです.
N000000_10_error.png
左画像と右画像をよく見ると,赤い部分は右画像には映っていないことが分かります. makefileを見れば分かりますが,チェックプログラムの起動は
./true disparity_to_correct result_disparity image_in_which_contradiction_is_red
となっています.
N000000_10_true.png
は修正後の視差画像です.

Gaze_line-Depth modelでの左視差画像生成

depth_kitti.cppは gaze_line-depth modelによるステレオビジョン処理を行って左視差画像を生成するプログラムです. 記事3のdepth_stereo.cppに対応しますが,視差が右画像ではなくて左画像に付与されるとともに, スケールファクタが256固定で,ピクセルが8ビットではなく16ビットで表現されます. また左視差画像と同時に次の3d_kitti.cppで使用する奥行き画像も生成されます. graph_cut.cuもダウンロードして

make do1
とすると左視差画像dis_pen_24_inh_4095.pngと 奥行き画像dep_pen_24_inh_4095.pngが生成されます.graph_cut.cuは記事3と同じです. makefileを見れば分かりますが,左視差画像生成プログラムの起動は
./depth right_image left_image max_disparity min_disparity penalty inhibit
となっています.
dis_pen_24_inh_4095.png
は生成された左視差画像です.記事7と違って左画像に視差が定義されています. またスケールファクタは256なのですが,ピクセルが16ビットなので暗く表示されます. この辺はpng画像の仕様のようです.

3D表示プログラム

3d_kitti.cppは 奥行き画像と左視差画像を使用して3D表示を行うプログラムです. 記事3の3d_stereo.cppに対応しますが,自分でステレオビジョン処理は行いません. 記事3ではdepth_stereo.cppと3d_stereo.cppの両方にgaze_line-depth model のステレオビジョン処理が含まれていましたが,機能を整理したこちらが本命です. KITTIの真値左視差画像に定義できないはずの視差情報が含まれていましたので, 視差の値そのものもどれほど正しいのか疑問に思い, 目視で確認するためにこのプログラムを用意しました.

make do3
とするとプログラムが起動します. 「mキー」で左画像表示, 「.キー」で右画像表示となります. 「,キー」では3d_stereo.cppとは違って左右画像が重なって表示されます. 「eキー」ではカーソル表示が追加され, 3d_stereo.cppの注目視線(gaze_lineではありません)がカーソルと連動するようになりました. カーソルは左画像,右画像のそれぞれにあります. 左画像のカーソルは「yキー」,「uキー」,「iキー」,「oキー」で移動でき, 右画像のカーソルは「7キー」,「8キー」,「9キー」,「0キー」で移動できます. 上下方向のカーソル移動は左右で連動しており左右を別々の位置にすることはできません. 左右のカーソルを目視で特定の特徴点に合わせます. 「,キー」で左右画像を重ねて表示します. 「sキー」,「tキー」により奥行き(視差)を変更して左右のカーソルが重なるようにすると その特徴点の奥行き(視差)が分かります.「sキー」,「tキー」押下時に表示される奥行き(視差)が その特徴点の視差となります. 一方「yキー」,「oキー」押下時には左視差画像で与えられた視差が表示され, 「7キー」,「0キー」」押下時には奥行き画像で与えられた奥行きが表示されます. これらの値を比べることによりそれぞれの情報の正しさが分かります. 「<キー」で3D表示となります. 3d_stereo.cppの「,キー」に対応しますがステレオビジョン処理は行わず, 奥行き画像または左視差画像から奥行き(視差)情報を得ます. 「wキー」でこの3D表示の奥行き(視差)情報を 奥行き画像から得る(dis_mode=0)のか, 左視差画像から得る(dis_mode=1)のかが切り替わります. 「?キー」ですべてのキーコマンドが表示されます. ビデオを出力する「6キー」もあります. makefileを見れば分かりますが,3D表示プログラムの起動は
./3d right_image left_image max_disparity min_disparity depth_image left_disparity
となっています.このプログラムを使ってKITTIの真値左視差画像が正しいかをいくつかの特徴点で確認しましたが, 問題は見つかりませんでした.

視差を比較するプログラム

記事4のcompare_disparity.cppをKITTIの形式にしたものが cmp_kitti.cppです.

make do4
でコンパイルと実行を指示してください. これでdis_pen_24_inh_4095.pngがN000000_10_true.pngと比べられます. 結果はaverage=1.19797pxとなりました. 結果の表示にはcompare_disparity.cppのものに加えて, ピクセル当たりの視差の差,すなわち視差の差の平均も表示するようにしました. makefileを見れば分かりますが,視差比較プログラムの起動は
./cmp true_left_disparity left_disparity difference_image
となっています.差画像は
error.png
のような画像で視差が真値より大きいとき赤,小さいとき緑でピクセルが表示される画像です.

視差の範囲を確認するプログラム

chk_kitti.cpp はKITTIのstereo2012ベンチマークのトレーニングで提供されている 194枚の真値左視差の範囲がどれくらいかを確認するプログラムです.

make do5
とすると, /home/oguri/KITTI/data_2012/training/disp_occと /home/oguri/KITTI/data_2012/training/disp_nocに それぞれ194枚存在する真値左視差画像の最大視差と最小視差をチェックします. 最大視差と最小視差を持つ画像も分かるようになっています. 結果はdisp_occの最大視差が231.613,disp_nocの最大視差が227.988,最小視差はどちらも4.10547でした. 視差が最大となっている画像は藪の中を通過しているような場面でした. またdisp_occでは視差が136.395までで80%の画像を含み, disp_nocでは視差が125.434までで80%の画像を含むことが分かりました.

評価方法の確認

KITTIのstereo2012のページからダウンロードできるdevelopment kitに含まれる evaluate_stereo.cppを読むとどのように評価されるのかが分かります. 視差が3ピクセル以上異なるピクセルの割合と 視差の差の平均値で評価されるようです. 3ピクセル以上だけではなく,1ピクセル以上,2ピクセル以上,4ピクセル以上,5ピクセル以上の割合 と有効ピクセルの割合についても出力されます. depth_kitti.cppで変更できるパラメータは視差範囲,penalty値,inhibit値です. inhibit値は十分に大きければ何でも構わないので4095としました. TSUKUBA画像で使っていた1023ではtrue_kitti.cpp で赤くなってしまう(矛盾を持つ)結果が発生することがありましたので ほぼ4倍にしておきました. gaze_line-depth modelを使えば本来true_kitti.cppで矛盾は検出されないはずなので, inhibitとしている枝がカットされてしまったということを表しています. 一方penalty値と視差範囲は現物合わせしかないので,いくつかの値で結果が良くなるところを 探しました.全範囲を調べたわけではないのですが,視差は4から120ピクセル.penalty値は24としました. このパラメータで,トレーニングデータでは視差の差の平均が2.909685px, 3ピクセル以上視差が異なるピクセルの割合が17.1%となりました.

データの提出とその結果96位

submit_kitti.cpp は提出データを作成する121行のステレオビジョン処理プログラムです. ステレオビジョン処理部分はdepth_kitti.cppと同じです.

make do7
でコンパイルと実行が行われます. グラフカットにgraph_cut.cuを使います. テストデータは195対のステレオ画像です. グレイスケールではなくてカラー画像を使用しました. 全体では85分,1対当たりでは26秒程度の処理時間となりました. パラメータはinhibit値=4095,penalty値=24,視差範囲=4px--120pxです. 結果は2018年3月24日時点で 96位 でした. method名はGLDS(Gaze_Line-Depth model Stereo)としました. 視差が3ピクセル以上異なるピクセルの割合は17.22%. 視差の差の平均値は2.8pxでした. gaze_line-depth model stereoでは視差の分解能は2pxですので, 視差の差の平均値が2.8pxというのは満足できる値です. 今はグラフカットしたままを提出していますが, 後処理を加えれば順位をかなり上げられるのではと思っています. しかし,人の目がそれほどの精度を持っていないことを考えると, 視差の差の平均値を下げることにそれほどの意味があるとは思えません.