Explanation of GPU architecture and Stereo-matching algorithm. Conduct experiment to prove cuda implementation of stereo-matching greatly improve a performance.
GPUでステレオマッチングshun sato
View Slide
GPUとCUDAアーキテクチャ
GPUとはGraphics Processing Unit (画像処理ユニット)● 並列計算がいっぱいできる● CPUよりでかい● 電力消費高い・熱いGPUの例:RTX 3090
CPUとGPUの違いCPU● 少数の強力なコア● 遅延の少ない処理● 幅広いタスクに対応GPU● 大量の弱いコア● データ移動で遅延が起きやすい● 演算タスクに特化
CUDAについてCompute Unified Device Architecture● NVIDIA社が提供しているGPUプログラミング環境● C言語でCUDAのAPIを利用可能● NVCCでコンパイル● リソースを監視できるプロファイラもある● PyTorchやTensorflowもCUDAのAPIを使っている
CUDAのアーキテクチャスレッド∈ブロック∈グリッドの関係● スレッドがプログラムを実行する● 実行単位を分けてメモリアクセスを制限○ レジスタ:各スレッド○ シェアードメモリ:各ブロック○ グローバルメモリ:全体● 並列化を自然に実装できるアーキテクチャ
GPUと画像処理の相性画像処理は局所処理が多い画像処理を行うときに離れている画素はあまり相互作用しない例:ぼかし、グレースケール変換...⇢ 独立した処理が多い⇢ 並列化に向いている⇢ GPUと相性が良い◎
ステレオマッチング
ステレオカメラについてカメラを左右に取り付けたデバイス● 左右カメラから同時に画像を取得できるだけ
ステレオマッチングとは視差を推定する画像アルゴリズム● 視差:2枚の画像間での同一物体のピクセル差● 視差が分かれば三角形の相似から物体の距離がわかる!
ステレオマッチングの準備左右画像の平行化● 平行化:同一の物体が乗る直線が水平になるようにする● 水平に探索を行えばよくなる→マッチングの高速化
セミグローバルマッチングステレオマッチングの一般的なアルゴリズム1. 画像の平滑化とグレイスケール変換をする2. 決められたウィンドウで画像をセンサス変換する3. マッチングコストを許容視差の範囲で計算4. 動的計画法を使ったアルゴリズムでマッチングコストを最小化→最適な視差マップが完成読みたい人は読んで ↓https://github.com/opencv/opencv_contrib/blob/4.7.0/modules/cudastereo/src/stereosgm.cpphttps://github.com/opencv/opencv_contrib/blob/4.7.0/modules/cudastereo/src/cuda/stereosgm.cu
センサス変換 (Census Transform)● ある画素を周辺のピクセルを使って特徴量化→中心画素との輝度差を{0,1}に変換してbit列化● 左右画像で照明条件が変わってもロバスト● 特徴量の比較が非常に高速(XNOR)
マッチングコストの計算● 許容する視差の横幅でセンサス変換の特徴量をスコア化→左右画像の特徴量のハミング距離がスコア● ここでスコアの最小値を採用しても滑らかな視差マップが得られないノイズのような視差マップ
最適な視差マップの生成● 周辺ピクセルに対するマッチングコストを使った動的計画法● 視差=0 → ペナルティー無し● 視差=1 → P1を追加● 視差>1 → P2を追加● 水平ラインを左から右にアルゴリズム適用ノイズのような視差マップ 滑らかな視差マップ
ステレオマッチングの並列化
考えてみる1. センサス変換:→ 各ピクセルごとに周辺との輝度差をスコア化2. マッチングコストの計算:→ 左右画像各ピクセルの特徴量のハミング距離を計算3. 最適な視差マップの生成:→ 各y座標ごとに左から右に動的計画法● 独立した操作が存在 ⇒ 並列化が可能!
CPUとGPUの比較実験OpenCVのcv::StereoSGBM(cpu)とcv::cuda::StereoSGM(gpu)を比較● 実験環境● OpenCV: 4.7.0● CUDA: 12.1● CPU: Core i7-10700K (16コア)● GPU: RTX 3090 (24GB)● メモリ: 16GB● 結果○ CPU平均: 1200 ms○ GPU平均: 6 ms➡ 約200倍の高速化を確認 (※ RTX 3060は多分100~150倍ぐらい)
まとめ
スライドまとめ● GPUは並列計算に特化した大規模な計算ユニットの集合● 画像処理は並列計算と相性が〇● ステレオマッチングはGPUで超高速化できる● みんなもCUDAで並列プログラムを書こう!
ステレオマッチングもっと知りたい人へ自分が前に書いた記事検索トップだから読んで(誰もやってないということ)
参考● https://www.d3.ntt-east.co.jp/00101/● https://e-words.jp/w/CUDA.html● https://developer.nvidia.com/blog/cuda-refresher-cuda-programming-model/● http://www.sanko-shoko.net/note.php?id=cbgw● https://wooptix.com/drawbacks-of-widespread-stereo-matching-techniques/● https://www.researchgate.net/figure/Census-transform-and-Hamming-distance-for-3-x-3-windows_fig2_261269856