Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

GPUとCUDAアーキテクチャ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

ステレオマッチング

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

セミグローバルマッチング ステレオマッチングの一般的なアルゴリズム 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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

まとめ

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

参考 ● 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