Upload
yasuhiro-yoshimura
View
3.124
Download
2
Embed Size (px)
Citation preview
OpenVX、NVIDIA VisionWorks使ってみた
第33回コンピュータビジョン勉強会@関東2016/4/17
@dandelion1124
自己紹介
Twitter ID:@dandelion1124
webpage: http://atinfinity.github.io/
• 学生時代は画像処理、VRの研究に従事
• 現在は都内勤務エンジニア
• Build InsiderにてOpenCV入門(http://www.buildinsider.net/small/opencv)を連載中
本日のアジェンダ
• OpenVX
– OpenVXとは
– サンプルコード
– OpenVX Implementation
• NVIDIA VisionWorks
– NVIDIA VisionWorksとは
OpenVXとは
• クロノス・グループが仕様策定しているコンピュータビジョンアプリケーション向けのライブラリ、フレームワーク
• ターゲットは低消費電力、リアルタイムのアプリケーション
• 様々なヘテロジニアスプロセッサ間の移植性– DSP、GPU、マルチコアCPU etc…
• 目的の処理を連結グラフで記述(詳細は後述)
https://www.khronos.org/openvx/
OpenVXで定義されるデータ構造
• vx_image
– 画像データを格納する型
• vx_array
– arrayデータを格納する型
• vx_matrix
– 行列データを格納する型
OpenVXで定義されるデータ構造
• vx_status
– ステータスを表すenum値• VX_SUCCESS
• VX_ERROR_NO_MEMORY
• VX_ERROR_INVALID_VALUE
etc...
– 詳細はOpenVX仕様書、vx_status_eのenum値を参照のこと。
OpenVXで定義されるデータ構造
• vx_node
– 目的の処理を記述するための処理単位
– OpenVXではプリミティブな処理(フィルタ処理、色変換etc…)を規定
• vx_graph
– vx_nodeによって処理とデータの流れを記述した連結グラフ
• Sobelフィルタの処理を記述したグラフ構成例
OpenVXで定義されるデータ構造
Sobel3x3 Magnitude
dx
dy
ConvertDepth
mag dstsrc
画像データ ノード
OpenVXで定義されるデータ構造
• グラフのライフサイクル
Graph Construction
Graph Verification
Graph Execution
Graph Deconstruction
data updates
reference changes
OpenVX specification v1.0.1から引用
OpenVXで処理時間を測る
• graphの処理時間を測る
• nodeの処理時間を測る
vx_perf perf;vxQueryGraph(graph1, VX_GRAPH_ATTRIBUTE_PERFORMANCE, &perf, sizeof(perf));std::cout << (perf.tmp / 1000000.0) << “[ms]” << std::endl;
vx_perf perf;vxQueryNode(node1, VX_NODE_ATTRIBUTE_PERFORMANCE, &perf, sizeof(perf));std::cout << (perf.tmp / 1000000.0) << “[ms]” << std::endl;
サンプルコード(OpenVX)
• context生成• image生成
• graph生成• node生成• graph検証
• graph実行
• node破棄• graph破棄• image破棄• context破棄
初期化
Vision処理
後処理
サンプルコード(OpenVX)
vx_context context = vxCreateContext();vx_image src;vx_image dst;
vx_graph graph = vxCreateGraph(context);vx_node node = vxColorConvertNode(graph, src, dst);vxVerifyGraph(graph);
vxProcessGraph(graph);
vxReleaseNode(&node);vxReleaseGraph(&graph);vxReleaseImage(&vx_src);vxReleaseImage(&vx_dst);vxReleaseContext(&context);
①初期化
②Vision処理
③後処理
サンプルコード(OpenVX)
vx_context context = vxCreateContext();vx_image src;vx_image dst;
vx_graph graph = vxCreateGraph(context);vx_node node = vxColorConvertNode(graph, src, dst);vxVerifyGraph(graph);
vxProcessGraph(graph);
vxReleaseNode(&node);vxReleaseGraph(&graph);vxReleaseImage(&vx_src);vxReleaseImage(&vx_dst);vxReleaseContext(&context);
②Vision処理
③後処理
context生成
image生成画像データをコピーする処理は時間の都合上割愛。
サンプルコード(OpenVX)
vx_context context = vxCreateContext();vx_image src;vx_image dst;
vx_graph graph = vxCreateGraph(context);vx_node node = vxColorConvertNode(graph, src, dst);vxVerifyGraph(graph);
vxProcessGraph(graph);
vxReleaseNode(&node);vxReleaseGraph(&graph);vxReleaseImage(&vx_src);vxReleaseImage(&vx_dst);vxReleaseContext(&context);
②Vision処理
③後処理
graph生成
node生成このサンプルは色変換のnode
graph検証graphが正しく作られていればVX_SUCCSESSが返ってくる
サンプルコード(OpenVX)
vx_context context = vxCreateContext();vx_image src;vx_image dst;
vx_graph graph = vxCreateGraph(context);vx_node node = vxColorConvertNode(graph, src, dst);vxVerifyGraph(graph);
vxProcessGraph(graph);
vxReleaseNode(&node);vxReleaseGraph(&graph);vxReleaseImage(&vx_src);vxReleaseImage(&vx_dst);vxReleaseContext(&context);
③後処理
graph実行graphの記述に沿った処理が実行される
サンプルコード(OpenVX)
vx_context context = vxCreateContext();vx_image src;vx_image dst;
vx_graph graph = vxCreateGraph(context);vx_node node = vxColorConvertNode(graph, src, dst);vxVerifyGraph(graph);
vxProcessGraph(graph);
vxReleaseNode(&node);vxReleaseGraph(&graph);vxReleaseImage(&vx_src);vxReleaseImage(&vx_dst);vxReleaseContext(&context);
後処理
OpenVX Implementation
OpenVX Implementationとして有名どころは以下の2つ。
• AMD OpenVX (AMDOVX)– http://gpuopen.com/compute-product/amd-openvx/
• NVIDIA VisionWorks– https://developer.nvidia.com/embedded/visionworks
参考URL:https://www.khronos.org/openvx/resources
AMD OpenVX(AMDOVX)
• AMD APP SDKを使ったOpenVX Implementation– OpenCL v2.0以降の機能を用いて実装されている
• C++11以降をサポートしているコンパイラが必要
• オープンソース!(なのでソースコードが読める)– https://github.com/GPUOpen-ProfessionalCompute-
Libraries/amdovx-core
• Windows上での環境構築方法をまとめましたhttps://github.com/atinfinity/lab/wiki/AMD-OpenVX-%28AMDOVX%29%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89
NVIDIA VisionWorks
• CUDAを使ったOpenVX Imprementation
• 2016/4/8時点で最新のVisionWorks v1.0を使うにはCUDA Toolkit v7.0のインストールが必要
• Jetson TK1、TX1でも動作する!– JetPack(https://developer.nvidia.com/embedded/jetpack)をインストールすることでVisionWorksが使える
• Webinarも用意されているhttps://developer.nvidia.com/embedded/learn/tutorials#collapseVisionWorks
OpenVX Implementation
OpenVX Implementationとして有名どころは以下の2つ。
• AMD OpenVX (AMDOVX)– http://gpuopen.com/compute-product/amd-openvx/
• NVIDIA VisionWorks– https://developer.nvidia.com/embedded/visionworks
参考URL:https://www.khronos.org/openvx/resources
(主に宗教上の理由で)今回はこちらを使ってみました
NVIDIA VisionWorks
VisionWorksの構成はざっくりとこんな感じらしい。
CUDA
VisionWorks Toolkit
VisionWorksPrimitives
VisionWorksFramework
Application Code
http://on-demand.gputechconf.com/gtc/2014/presentations/S4714-nvidia-vision-toolkit-adas-photography.pdf
NVIDIA VisionWorks
VisionWorksの構成はざっくりとこんな感じらしい。
CUDA
VisionWorks Toolkit
VisionWorksPrimitives
VisionWorksFramework
Application Code
OpenVX API NVIDIA Extension
OpenVX Framework NVIDIA Extension
http://on-demand.gputechconf.com/gtc/2014/presentations/S4714-nvidia-vision-toolkit-adas-photography.pdf
NVIDIA VisionWorks
OpenVXNode
OpenVXNode
VisionWorksNode
VisionWorksNode
http://on-demand.gputechconf.com/gtc/2014/presentations/S4714-nvidia-vision-toolkit-adas-photography.pdf
OpenVX Graph
VisionWorks Node(CUDAを使って実装されたNode)を使うことでGPUの恩恵を受けることができる
※VisionWorks NodeはOpenVX Nodeとして扱える
NVIDIA VisionWorksの機能
• Image Arithmetic– Add/Subtract/Multiply
– Not/Or/And/Xor
– LUT
– Color Convert
etc…
• Flow– Median Flow
– Optical Flow
etc…
• Depth– Stereo Block Matching
– Semi-Global Matching
etc…
• Geometric Transform– Affine Warp
– Flip Image
– Remap
– Scale Image
etc…
https://developer.nvidia.com/embedded/visionworksから抜粋
NVIDIA VisionWorksの機能
• Filters– Box Filter
– Convolution
– Gaussian Filter
– Laplacian Filter
etc…
• Features– Fast Corners
– Harris Corners
– Hough Circles
– Hough Lines
etc…
• Analysis– Histogram
– Histogram Equalization
– Integral Image
– Min Max Locations
etc…
https://developer.nvidia.com/embedded/visionworksから抜粋
NVIDIA VisionWorks使ってみた
• Semi-Global Matching
left image
right image
depth image
入力はDaimler Urban Segmentation Dataset 2014(http://www.6d-vision.com/scene-labeling)の画像データ。
速度計測してみた
• 計測環境
– OS:Windows 10 Pro 64bit
– CPU:Intel Core [email protected]
– メモリ:32GB
– GPU:NVIDIA GeForce GTX 680
– VisionWorks:NVIDIA VisionWorks v1.0.25
– CUDA:CUDA Toolkit v7.0
– OpenCV:OpenCV 3.1
– コンパイラ:Visual Studio 2013 Update5
速度計測してみた
0 1 2 3 4 5 6 7 8 9
2160p
4320p
処理時間[ms]
画像サイズ
グレースケール化
VisionWorks cuda::GpuMat Mat
速度計測してみた
0 5 10 15 20 25 30 35 40 45 50
2160p
4320p
処理時間[ms]
画像サイズ
box filter
VisionWorks cuda::GpuMat Mat
速度計測してみた
0 2 4 6 8 10 12
1024x440
処理時間[ms]
画像サイズ
stereoBM
VisionWorks cuda::GpuMat Mat
速度計測してみた
0 20 40 60 80 100 120 140
1024x440
処理時価[ms]
画像サイズ
stereoSGBM
VisionWorks Mat
※OpenCV 3.1時点でGpuMatにSGBMの関数が未実装なのでGpuMatは比較対象から除外
OpenVXを使ってみた所感
• OpenCVに比べてまだまだ対応関数が少ない
– OpenVX v1.0ではプリミティブな関数のみの提供に留まっているが以降のバージョンで追加していく予定らしい
– AMDはOpenCVを使った追加モジュールを公開している• https://github.com/GPUOpen-ProfessionalCompute-
Libraries/amdovx-modules
• GraphやNodeの概念がちょっと独特
– UIでデータフローを作ってプログラミングをするツール(http://www.adaptive-vision.com/en/software/みたいなの)とは相性が良さそう
OpenVXを使ってみた所感
• 画像データ入出力にちょっと一苦労– OpenVX仕様書としばらくにらめっこしたりした・・・
– 特にメモリのalignmentあたりをきちんとわかってないと詰む
• エラー処理はかなり大事– vx_statusのエラーコードだけだと具体的なエラー箇所、エラー原因の絞り込みがしづらいのでエラー処理はしっかり書いた方がよさそう
• VisionWorksが思ったよりも高速(な場合もある)– 機能によっては部分的に使ってみるのもアリかも
OpenVX参考サイト
• 個人wikiにまとめました– https://github.com/atinfinity/lab/wiki/OpenVX%E5%8F%82%E8%80%
83%E3%83%AA%E3%83%B3%E3%82%AF
• 個人的にはAMD OpenVXのコードを重宝しています
– 特にcv::Mat、vx_image間の相互変換処理等のユーティリティ周りが参考になる