【第33回コンピュータビジョン勉強会@関東】openvx、 nvidia...

34
OpenVXNVIDIA VisionWorks使ってみた 33回コンピュータビジョン勉強会@関東 2016/4/17 @dandelion1124

Upload: yasuhiro-yoshimura

Post on 08-Jan-2017

3.126 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVX、NVIDIA VisionWorks使ってみた

第33回コンピュータビジョン勉強会@関東2016/4/17

@dandelion1124

Page 2: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

自己紹介

Twitter ID:@dandelion1124

webpage: http://atinfinity.github.io/

• 学生時代は画像処理、VRの研究に従事

• 現在は都内勤務エンジニア

• Build InsiderにてOpenCV入門(http://www.buildinsider.net/small/opencv)を連載中

Page 3: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

本日のアジェンダ

• OpenVX

– OpenVXとは

– サンプルコード

– OpenVX Implementation

• NVIDIA VisionWorks

– NVIDIA VisionWorksとは

Page 4: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVXとは

• クロノス・グループが仕様策定しているコンピュータビジョンアプリケーション向けのライブラリ、フレームワーク

• ターゲットは低消費電力、リアルタイムのアプリケーション

• 様々なヘテロジニアスプロセッサ間の移植性– DSP、GPU、マルチコアCPU etc…

• 目的の処理を連結グラフで記述(詳細は後述)

https://www.khronos.org/openvx/

Page 5: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVXで定義されるデータ構造

• vx_image

– 画像データを格納する型

• vx_array

– arrayデータを格納する型

• vx_matrix

– 行列データを格納する型

Page 6: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVXで定義されるデータ構造

• vx_status

– ステータスを表すenum値• VX_SUCCESS

• VX_ERROR_NO_MEMORY

• VX_ERROR_INVALID_VALUE

etc...

– 詳細はOpenVX仕様書、vx_status_eのenum値を参照のこと。

Page 7: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVXで定義されるデータ構造

• vx_node

– 目的の処理を記述するための処理単位

– OpenVXではプリミティブな処理(フィルタ処理、色変換etc…)を規定

• vx_graph

– vx_nodeによって処理とデータの流れを記述した連結グラフ

Page 8: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

• Sobelフィルタの処理を記述したグラフ構成例

OpenVXで定義されるデータ構造

Sobel3x3 Magnitude

dx

dy

ConvertDepth

mag dstsrc

画像データ ノード

Page 9: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVXで定義されるデータ構造

• グラフのライフサイクル

Graph Construction

Graph Verification

Graph Execution

Graph Deconstruction

data updates

reference changes

OpenVX specification v1.0.1から引用

Page 10: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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;

Page 11: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

サンプルコード(OpenVX)

• context生成• image生成

• graph生成• node生成• graph検証

• graph実行

• node破棄• graph破棄• image破棄• context破棄

初期化

Vision処理

後処理

Page 12: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

サンプルコード(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処理

③後処理

Page 13: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

サンプルコード(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生成画像データをコピーする処理は時間の都合上割愛。

Page 14: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

サンプルコード(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が返ってくる

Page 15: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

サンプルコード(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の記述に沿った処理が実行される

Page 16: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

サンプルコード(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);

後処理

Page 17: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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

Page 18: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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

Page 19: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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

Page 20: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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

(主に宗教上の理由で)今回はこちらを使ってみました

Page 21: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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

Page 22: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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

Page 23: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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として扱える

Page 24: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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から抜粋

Page 25: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA 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から抜粋

Page 26: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

NVIDIA VisionWorks使ってみた

• Semi-Global Matching

left image

right image

depth image

入力はDaimler Urban Segmentation Dataset 2014(http://www.6d-vision.com/scene-labeling)の画像データ。

Page 27: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

速度計測してみた

• 計測環境

– 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

Page 28: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

速度計測してみた

0 1 2 3 4 5 6 7 8 9

2160p

4320p

処理時間[ms]

画像サイズ

グレースケール化

VisionWorks cuda::GpuMat Mat

Page 29: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

速度計測してみた

0 5 10 15 20 25 30 35 40 45 50

2160p

4320p

処理時間[ms]

画像サイズ

box filter

VisionWorks cuda::GpuMat Mat

Page 30: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

速度計測してみた

0 2 4 6 8 10 12

1024x440

処理時間[ms]

画像サイズ

stereoBM

VisionWorks cuda::GpuMat Mat

Page 31: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

速度計測してみた

0 20 40 60 80 100 120 140

1024x440

処理時価[ms]

画像サイズ

stereoSGBM

VisionWorks Mat

※OpenCV 3.1時点でGpuMatにSGBMの関数が未実装なのでGpuMatは比較対象から除外

Page 32: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

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/みたいなの)とは相性が良さそう

Page 33: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA VisionWorks使ってみた

OpenVXを使ってみた所感

• 画像データ入出力にちょっと一苦労– OpenVX仕様書としばらくにらめっこしたりした・・・

– 特にメモリのalignmentあたりをきちんとわかってないと詰む

• エラー処理はかなり大事– vx_statusのエラーコードだけだと具体的なエラー箇所、エラー原因の絞り込みがしづらいのでエラー処理はしっかり書いた方がよさそう

• VisionWorksが思ったよりも高速(な場合もある)– 機能によっては部分的に使ってみるのもアリかも

Page 34: 【第33回コンピュータビジョン勉強会@関東】OpenVX、 NVIDIA 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間の相互変換処理等のユーティリティ周りが参考になる