Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GPUでステレオマッチング / Stereo-matching with GPU

GPUでステレオマッチング / Stereo-matching with GPU

Explanation of GPU architecture and Stereo-matching algorithm.
Conduct experiment to prove cuda implementation of stereo-matching greatly improve a performance.

shun74

May 26, 2023
Tweet

More Decks by shun74

Other Decks in Programming

Transcript

  1. GPUでステレオマッチング
    shun sato

    View full-size slide

  2. GPUとCUDAアーキテクチャ

    View full-size slide

  3. GPUとは
    Graphics Processing Unit (画像処理ユニット)
    ● 並列計算がいっぱいできる
    ● CPUよりでかい
    ● 電力消費高い・熱い
    GPUの例:RTX 3090

    View full-size slide

  4. CPUとGPUの違い
    CPU
    ● 少数の強力なコア
    ● 遅延の少ない処理
    ● 幅広いタスクに対応
    GPU
    ● 大量の弱いコア
    ● データ移動で遅延が起きやすい
    ● 演算タスクに特化

    View full-size slide

  5. CUDAについて
    Compute Unified Device Architecture
    ● NVIDIA社が提供しているGPUプログラミング環境
    ● C言語でCUDAのAPIを利用可能
    ● NVCCでコンパイル
    ● リソースを監視できるプロファイラもある
    ● PyTorchやTensorflowもCUDAのAPIを使っている

    View full-size slide

  6. CUDAのアーキテクチャ
    スレッド∈ブロック∈グリッドの関係
    ● スレッドがプログラムを実行する
    ● 実行単位を分けてメモリアクセスを制限
    ○ レジスタ:各スレッド
    ○ シェアードメモリ:各ブロック
    ○ グローバルメモリ:全体
    ● 並列化を自然に実装できるアーキテクチャ

    View full-size slide

  7. GPUと画像処理の相性
    画像処理は局所処理が多い
    画像処理を行うときに離れている画素は
    あまり相互作用しない
    例:ぼかし、グレースケール変換...
    ⇢ 独立した処理が多い
    ⇢ 並列化に向いている
    ⇢ GPUと相性が良い◎

    View full-size slide

  8. ステレオマッチング

    View full-size slide

  9. ステレオカメラについて
    カメラを左右に取り付けたデバイス
    ● 左右カメラから同時に画像を取得できるだけ

    View full-size slide

  10. ステレオマッチングとは
    視差を推定する画像アルゴリズム
    ● 視差:2枚の画像間での同一物体のピクセル差
    ● 視差が分かれば三角形の相似から物体の距離がわかる!

    View full-size slide

  11. ステレオマッチングの準備
    左右画像の平行化
    ● 平行化:同一の物体が乗る直線が水平になるようにする
    ● 水平に探索を行えばよくなる
    →マッチングの高速化

    View full-size slide

  12. セミグローバルマッチング
    ステレオマッチングの一般的なアルゴリズム
    1. 画像の平滑化とグレイスケール変換をする
    2. 決められたウィンドウで画像をセンサス変換する
    3. マッチングコストを許容視差の範囲で計算
    4. 動的計画法を使ったアルゴリズムでマッチングコストを最小化
    →最適な視差マップが完成
    読みたい人は読んで ↓
    https://github.com/opencv/opencv_contrib/blob/4.7.0/modules/cudastereo/src/stereosgm.cpp
    https://github.com/opencv/opencv_contrib/blob/4.7.0/modules/cudastereo/src/cuda/stereosgm.cu

    View full-size slide

  13. センサス変換 (Census Transform)
    ● ある画素を周辺のピクセルを使って特徴量化
    →中心画素との輝度差を{0,1}に変換してbit列化
    ● 左右画像で照明条件が変
    わってもロバスト
    ● 特徴量の比較が非常に高
    速(XNOR)

    View full-size slide

  14. マッチングコストの計算
    ● 許容する視差の横幅でセンサス変換の特徴量をスコア化
    →左右画像の特徴量のハミング距離がスコア
    ● ここでスコアの最小値を採用しても滑らかな視差マップが得られない
    ノイズのような視差マップ

    View full-size slide

  15. 最適な視差マップの生成
    ● 周辺ピクセルに対するマッチングコストを使った動的計画法
    ● 視差=0 → ペナルティー無し
    ● 視差=1 → P1を追加
    ● 視差>1 → P2を追加
    ● 水平ラインを左から右にアルゴリズム適用
    ノイズのような視差マップ 滑らかな視差マップ

    View full-size slide

  16. ステレオマッチングの並列化

    View full-size slide

  17. 考えてみる
    1. センサス変換:
    → 各ピクセルごとに周辺との輝度差をスコア化
    2. マッチングコストの計算:
    → 左右画像各ピクセルの特徴量のハミング距離を計算
    3. 最適な視差マップの生成:
    → 各y座標ごとに左から右に動的計画法
    ● 独立した操作が存在 ⇒ 並列化が可能!

    View full-size slide

  18. 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倍ぐらい)

    View full-size slide

  19. スライドまとめ
    ● GPUは並列計算に特化した大規模な計算ユニットの集合
    ● 画像処理は並列計算と相性が〇
    ● ステレオマッチングはGPUで超高速化できる
    ● みんなもCUDAで並列プログラムを書こう!

    View full-size slide

  20. ステレオマッチングもっと知りたい人へ
    自分が前に書いた記事
    検索トップだから読んで
    (誰もやってないということ)

    View full-size slide

  21. 参考
    ● 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-distanc
    e-for-3-x-3-windows_fig2_261269856

    View full-size slide