36
OpenCVの新機能 UMatを先取りしよう 関東GPGPU勉強会#3 2013/11/30 @dandelion1124

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

OpenCVの新機能 UMatを先取りしよう

関東GPGPU勉強会#3 2013/11/30

@dandelion1124

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

自己紹介(1/3)

Twitter:@dandelion1124

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

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

• 研究室でOpenCVのTipsサイトを作っていたらOpenCV関連書籍を

書くことになり今に至る。

blog: http://www.atinfinity.info/blog/

wiki: http://www.atinfinity.info/wiki/

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

自己紹介(2/3)

• 書籍執筆 – OpenCVプログラミングブック

• 和訳本(原稿チェック) – 詳解 OpenCV – 実践 コンピュータビジョン

• 雑誌関連 – 日経ソフトウェア(2011年3月号) 特集記事担当

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

自己紹介(3/3)

• メインで活動している勉強会

–関東コンピュータビジョン勉強会 #cvsaisentan

http://sites.google.com/site/cvsaisentan/

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

本日のアジェンダ

• OpenCVとは?

• 前置き

• OpenCVのデータ構造

• UMatとは?

• サンプルコード

• UMatを使うには

• UMatのTips

本日のメイン

本題に入る前の前準備

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

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

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

前置き

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

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

前置き

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

なんか凄そう! (小並感)

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

前置き

という残念な理由からUMatについて説明することに

しました。

ただし、あくまでOpenCV 3.0で入る予定の機能なので、正式な

導入時は本発表時と内容が変わっている可能性がある点

ご了承ください。

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

前置き

というか、そもそも、最新コード(https://github.com/Itseez/opencv/)に

UMat実装されているんでしょうか?

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

前置き

というか、そもそも、最新コード(https://github.com/Itseez/opencv/)に

UMat実装されているんでしょうか?

あった!

modules/core/src/umatrix.cpp

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

前置き

じゃあ、開発版ドキュメント読んでみようかな? http://docs.opencv.org/trunk/modules/core/doc/core.html

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

前置き

じゃあ、開発版ドキュメント読んでみようかな? http://docs.opencv.org/trunk/modules/core/doc/core.html

「UMatのドキュメントはまだ無い」

(※2013/11/29時点)

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

ご清聴ありがとうございました

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

前置き

ドキュメントが無いので、しぶしぶソースを

読んで使い方を調べることにしました。

というわけで、本編に戻ります。

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

OpenCVの画像データ構造

OpenCVで画像を格納するために使うデータ構造は

おおまかに以下の4つ。

• cv::Mat 画像データの入れ物(CPU版)

• gpu::GpuMat 画像データの入れ物(CUDA版)

• ocl::oclMat 画像データの入れ物(OpenCL版)

• cv::UMat 画像データの入れ物(CPU/OpenCL版)

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

OpenCVの画像データ構造

OpenCVで画像を格納するために使うデータ構造は

おおまかに以下の4つ。

• cv::Mat 画像データの入れ物(CPU版)

• gpu::GpuMat 画像データの入れ物(CUDA版)

• ocl::oclMat 画像データの入れ物(OpenCL版)

• cv::UMat 画像データの入れ物(CPU/OpenCL版)

oclMatについては前回勉強会の発表資料を参照ください。

http://www.slideshare.net/YasuhiroYoshimura/gpgpu2opencvopencloclmat

※上記資料は2013年6月時点のものなので最新版ではAPI仕様が少し変わっています。

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

OpenCVの画像データ構造

OpenCVで画像を格納するために使うデータ構造は

おおまかに以下の4つ。

• cv::Mat 画像データの入れ物(CPU版)

• gpu::GpuMat 画像データの入れ物(CUDA版)

• ocl::oclMat 画像データの入れ物(OpenCL版)

• cv::UMat 画像データの入れ物(CPU/OpenCL版)

今日のお話はこの部分がメイン

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

UMatとは?

• Mat/oclMat間の差異を隠蔽したデータ構造

• UMatに画像データを入れて画像処理の関数を実行すると、OpenCLが使える環境なら自動でOpenCL実装を使ってくれる

• UMatを使って実装しておけばCPU/OpenCLのコードを共通化できる

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

UMatとは?

• Mat/oclMat間の差異を隠蔽したデータ構造

• UMatに画像データを入れて画像処理の関数を実行すると、OpenCLが使える環境なら自動でOpenCL実装を使ってくれる

• UMatを使って実装しておけばCPU/OpenCLのコードを共通化できる

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

UMatとは?

UMatに画像データを格納

OpenCLが使える 実行環境?

oclMatの実装を使う Matの実装を使う

OpenCVの画像処理関数をコール OpenCV内部で

勝手にやってくれる

Yes

No

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

UMatとは?

• Mat/oclMat間の差異を隠蔽したデータ構造

• UMatに画像データを入れて画像処理の関数を実行すると、OpenCLが使える環境なら自動でOpenCL実装を使ってくれる

• UMatを使って実装しておけばCPU/OpenCLのコードを共通化できる

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

サンプルコード(グレースケール化) #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版)のコード

点線で囲った部分が共通化できていないコード部分

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

サンプルコード(グレースケール化) #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のコードを共通化できる!

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

UMatのサンプルコードを使って 各処理をもう少し詳しく説明します

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

サンプルコード(グレースケール化) #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初期化

②画像読み込み

④画像処理

⑤画像書き込み

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

サンプルコード(グレースケール化) #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初期化

②画像読み込み

④画像処理

⑤画像書き込み

UMatを使うにはocl.hppの インクルードが必要

①ヘッダ読み込み

OpenCVのヘッダをインクルード

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

サンプルコード(グレースケール化) #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初期化

④画像処理

⑤画像書き込み

画像ファイルを読みこんで Mat形式で格納する。

②画像読み込み

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

サンプルコード(グレースケール化) #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;

}

④画像処理

⑤画像書き込み

srcに入れたデータをもとに UMatのインスタンスを作る

③UMat初期化

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

サンプルコード(グレースケール化) #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;

}

⑤画像書き込み グレースケール化する

④画像処理

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

サンプルコード(グレースケール化) #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;

}

⑤画像書き込み

グレースケール化した画像を ファイルに書き込む

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

UMatを使うには

■CMake CMakeで以下の手順を行うことで ソリューションファイルが生成される ①「WITH_OPENCL」にチェックを入れる ②「Configure」ボタンを押す ③「Generate」ボタンを押す

④生成されたソリューションを使ってOpenCVのライブラリを生成

■OpenCL環境導入 PCにOpenCLのSDKをインストールして おく必要がある

■開発版OpenCVコード入手 2.4.xにはUMat実装が入っていないのでgit or githubから開発版のコードを取得する必要があります https://github.com/Itseez/opencv/

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

UMatのTips

• 今の実行環境でOpenCL環境が使えるかどうかを調べるユーティリティ関数があります

– ocl::haveOpenCL()

• UMatの処理でOpenCL実装を使うかを知るためのユーティリティ関数があります

– ocl::useOpenCL()

ただし、#include <opencv2/core/ocl.hpp> を追加する必要あり!

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

UMatのTips

• ユーザによってはUMatの処理で勝手にOpenCL側の処理に入って欲しくない場合もあるのでは?

– ocl::setUseOpenCL関数にtrue/falseを指定することでUMatでOpenCLを使う/使わないを決められます。

ただし、#include <opencv2/core/ocl.hpp> を追加する必要あり!

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

まとめ

• OpenCV 3.0あたりからUMatというデータ構造が追加される予定

• UMatを使うとCPU/OpenCLの実装コードを共通化できる

• UMatを使った実装を行うとき、CPUモードでアルゴリズムを検証してから、OpenCLモードに切り替えるのも容易そう

• 「UMatのドキュメントはまだ無い」(※2013/11/29時点)

• 正式発表を楽しみに待ちましょう!

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

おわり