【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

8,777
-1

Published on

【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

Published in: Technology
0 Comments
20 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
8,777
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
49
Comments
0
Likes
20
Embeds 0
No embeds

No notes for slide

【関東GPGPU勉強会#3】OpenCVの新機能 UMatを先取りしよう

  1. 1. OpenCVの新機能 UMatを先取りしよう 関東GPGPU勉強会#3 2013/11/30 @dandelion1124
  2. 2. 自己紹介(1/3) Twitter:@dandelion1124 • 学生時代は画像処理の研究に従事。 • 現在は都内勤務エンジニア。 • 研究室でOpenCVのTipsサイトを作っていたらOpenCV関連書籍を 書くことになり今に至る。 blog: http://www.atinfinity.info/blog/ wiki: http://www.atinfinity.info/wiki/
  3. 3. 自己紹介(2/3) • 書籍執筆 – OpenCVプログラミングブック • 和訳本(原稿チェック) – 詳解 OpenCV – 実践 コンピュータビジョン • 雑誌関連 – 日経ソフトウェア(2011年3月号) 特集記事担当
  4. 4. 自己紹介(3/3) • メインで活動している勉強会 – 関東コンピュータビジョン勉強会 #cvsaisentan http://sites.google.com/site/cvsaisentan/
  5. 5. 本日のアジェンダ • • • • • • • OpenCVとは? 前置き OpenCVのデータ構造 UMatとは? サンプルコード UMatを使うには UMatのTips 本題に入る前の前準備 本日のメイン
  6. 6. OpenCVとは? Intelが開発・公開したOpen SourceのComputer Vision ライブラリ。現在はWillow Garageが開発を行っている。 http://opencv.org/ • 公式サポートOS – Windows/Linux/Mac OS/Android/iOS • 公式サポート言語 – C/C++/Python/Java ※有志による非公式ラッパーは以下のサイトにまとめています。 http://www.atinfinity.info/wiki/index.php?OpenCV%2FOpenCV%20wrapper%20list
  7. 7. 前置き ある日OpenCV MeetingNotesで以下の記載を見かける – 3.0 will do a lot more work on this. But OpenCL will vanish and be put into automatic acceleration in the other modules • It will accelerate automatically if you use "umat" (Universal Matrix). • Tests often show 10 to 100x acceleration on GPU – If user casts to umat and pass to functions, it will use GPU acceleration if available achieving the speedup. • Data is not copied in conversion back and forth between mat and umat. Use mat if you want pixel access. http://code.opencv.org/projects/opencv/wiki/2013#2013-11-05 から抜粋
  8. 8. 前置き ある日OpenCV MeetingNotesで以下の記載を見かける – 3.0 will do a lot more work on this. But OpenCL will vanish and be put into automatic acceleration in the other modules • It will accelerate automatically if you use "umat" (Universal Matrix). • Tests often show 10 to 100x acceleration on GPU – If user casts to umat and pass to functions, it will use GPU acceleration if available achieving the speedup. • Data is not copied in conversion back and forth between mat and umat. Use mat if you want pixel access. なんか凄そう! (小並感) http://code.opencv.org/projects/opencv/wiki/2013#2013-11-05 から抜粋
  9. 9. 前置き という残念な理由からUMatについて説明することに しました。 ただし、あくまでOpenCV 3.0で入る予定の機能なので、正式な 導入時は本発表時と内容が変わっている可能性がある点 ご了承ください。
  10. 10. 前置き というか、そもそも、最新コード (https://github.com/Itseez/opencv/)に UMat実装されているんでしょうか?
  11. 11. 前置き というか、そもそも、最新コード (https://github.com/Itseez/opencv/)に UMat実装されているんでしょうか? あった! modules/core/src/umatrix.cpp
  12. 12. 前置き じゃあ、開発版ドキュメント読んでみようかな? http://docs.opencv.org/trunk/modules/core/doc/core.html
  13. 13. 前置き じゃあ、開発版ドキュメント読んでみようかな? http://docs.opencv.org/trunk/modules/core/doc/core.html 「UMatのドキュメントはまだ無い」 (※2013/11/29時点)
  14. 14. ご清聴ありがとうございました
  15. 15. 前置き ドキュメントが無いので、しぶしぶソースを 読んで使い方を調べることにしました。 というわけで、本編に戻ります。
  16. 16. OpenCVの画像データ構造 OpenCVで画像を格納するために使うデータ構造は おおまかに以下の4つ。 • • • • cv::Mat gpu::GpuMat ocl::oclMat cv::UMat 画像データの入れ物(CPU版) 画像データの入れ物(CUDA版) 画像データの入れ物(OpenCL版) 画像データの入れ物(CPU/OpenCL版)
  17. 17. OpenCVの画像データ構造 OpenCVで画像を格納するために使うデータ構造は おおまかに以下の4つ。 • • • • cv::Mat gpu::GpuMat ocl::oclMat cv::UMat 画像データの入れ物(CPU版) 画像データの入れ物(CUDA版) 画像データの入れ物(OpenCL版) 画像データの入れ物(CPU/OpenCL版) oclMatについては前回勉強会の発表資料を参照ください。 http://www.slideshare.net/YasuhiroYoshimura/gpgpu2opencvopencloclmat ※上記資料は2013年6月時点のものなので最新版ではAPI仕様が少し変わっています。
  18. 18. OpenCVの画像データ構造 OpenCVで画像を格納するために使うデータ構造は おおまかに以下の4つ。 • • • • cv::Mat gpu::GpuMat ocl::oclMat cv::UMat 画像データの入れ物(CPU版) 画像データの入れ物(CUDA版) 画像データの入れ物(OpenCL版) 画像データの入れ物(CPU/OpenCL版) 今日のお話はこの部分がメイン
  19. 19. UMatとは? • Mat/oclMat間の差異を隠蔽したデータ構造 • UMatに画像データを入れて画像処理の関数 を実行すると、OpenCLが使える環境なら自動 でOpenCL実装を使ってくれる • UMatを使って実装しておけばCPU/OpenCLの コードを共通化できる
  20. 20. UMatとは? • Mat/oclMat間の差異を隠蔽したデータ構造 • UMatに画像データを入れて画像処理の関数 を実行すると、OpenCLが使える環境なら自動 でOpenCL実装を使ってくれる • UMatを使って実装しておけばCPU/OpenCLの コードを共通化できる
  21. 21. UMatとは? UMatに画像データを格納 OpenCV内部で 勝手にやってくれる OpenCVの画像処理関数をコール OpenCLが使える 実行環境? No Yes oclMatの実装を使う Matの実装を使う
  22. 22. UMatとは? • Mat/oclMat間の差異を隠蔽したデータ構造 • UMatに画像データを入れて画像処理の関数 を実行すると、OpenCLが使える環境なら自動 でOpenCL実装を使ってくれる • UMatを使って実装しておけばCPU/OpenCLの コードを共通化できる
  23. 23. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); Mat dst; cvtColor(src, dst, COLOR_BGR2GRAY); imwrite (“lena_gray.jpg", dst); return 0; #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); Mat dst; ocl::oclMat oclsrc (src ); ocl::oclMat ocldst; ocl::cvtColor(oclsrc, ocldst, COLOR_BGR2GRAY); ocldst.download(dst); } imwrite (“lena_gray.jpg", dst); return 0; } Mat(CPU版)のコード oclMat(OpenCL版)のコード 点線で囲った部分が共通化できていないコード部分
  24. 24. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; cvtColor(usrc, udst, COLOR_BGR2GRAY); imwrite (“lena_gray.jpg", udst); return 0; } UMat(CPU/OpenCL版)のコード UMatを使って実装するとCPU/OpenCLのコードを共通化できる!
  25. 25. UMatのサンプルコードを使って 各処理をもう少し詳しく説明します
  26. 26. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; ①ヘッダ読み込み int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); ②画像読み込み ③UMat初期化 UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } グレースケール化
  27. 27. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; ①ヘッダ読み込み int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMatを使うにはocl.hppの インクルードが必要 ②画像読み込み ③UMat初期化 UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } OpenCVのヘッダをインクルード
  28. 28. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); ③UMat初期化 UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } ②画像読み込み 画像ファイルを読みこんで Mat形式で格納する。
  29. 29. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; ④画像処理 cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } ③UMat初期化 srcに入れたデータをもとに UMatのインスタンスを作る
  30. 30. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; cvtColor(usrc, udst, COLOR_BGR2GRAY); ⑤画像書き込み imwrite (“lena_gray.jpg", udst); return 0; } ④画像処理 グレースケール化する
  31. 31. サンプルコード(グレースケール化) #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui.hpp> #include <opencv2/ocl/ocl.hpp> using namespace cv; int main(int argc, char** argv) { Mat src = imread(“lena.jpg ", IMREAD_UNCHANGED); UMat usrc = src.getUMat(ACCESS_READ); UMat udst; cvtColor(usrc, udst, COLOR_BGR2GRAY); imwrite (“lena_gray.jpg", udst); return 0; } ⑤画像書き込み グレースケール化した画像を ファイルに書き込む
  32. 32. UMatを使うには ■開発版OpenCVコード入手 2.4.xにはUMat実装が入っていないので git or githubから開発版のコードを取得 する必要があります https://github.com/Itseez/opencv/ ■OpenCL環境導入 PCにOpenCLのSDKをインストールして おく必要がある ■CMake CMakeで以下の手順を行うことで ソリューションファイルが生成される ①「WITH_OPENCL」にチェックを入れる ②「Configure」ボタンを押す ③「Generate」ボタンを押す ④生成されたソリューションを使って OpenCVのライブラリを生成
  33. 33. UMatのTips • 今の実行環境でOpenCL環境が使えるかどう かを調べるユーティリティ関数があります – ocl::haveOpenCL() • UMatの処理でOpenCL実装を使うかを知るた めのユーティリティ関数があります – ocl::useOpenCL() ただし、#include <opencv2/core/ocl.hpp> を追加する必要あり!
  34. 34. UMatのTips • ユーザによってはUMatの処理で勝手に OpenCL側の処理に入って欲しくない場合もあ るのでは? – ocl::setUseOpenCL関数にtrue/falseを指定すること でUMatでOpenCLを使う/使わないを決められます。 ただし、#include <opencv2/core/ocl.hpp> を追加する必要あり!
  35. 35. まとめ • OpenCV 3.0あたりからUMatというデータ構造が追 加される予定 • UMatを使うとCPU/OpenCLの実装コードを共通化で きる • UMatを使った実装を行うとき、CPUモードでアルゴリ ズムを検証してから、OpenCLモードに切り替えるの も容易そう • 「UMatのドキュメントはまだ無い」(※2013/11/29時 点) • 正式発表を楽しみに待ちましょう!
  36. 36. おわり

×