24
OpenCVpythonインター フェース入門 林昌希 (Masaki Hayashi) 慶應義塾大学 博士課程3PyConJP 2014,9月14日(日) 13:00- 13:30 この資料の元となった本番資料(IPython Notebook)も、以下に公開中です: https://github.com/payashim/tutorial-opencv-python-pyconjp2014

Pyconjp 2014 OpenCVのpythonインターフェース入門

Embed Size (px)

DESCRIPTION

PyconJP2014でのチュートリアル「」の発表資料(IPython Notebook)を、Keynoteで書き直してアップロードしたものです。

Citation preview

Page 1: Pyconjp 2014 OpenCVのpythonインターフェース入門

!

OpenCVのpythonインターフェース入門 林昌希 (Masaki Hayashi) 慶應義塾大学 博士課程3年

PyConJP 2014,9月14日(日) 13:00- 13:30

この資料の元となった本番資料(IPython Notebook)も、以下に公開中です: https://github.com/payashim/tutorial-opencv-python-pyconjp2014

Page 2: Pyconjp 2014 OpenCVのpythonインターフェース入門

発表者について• 専門は機械学習による画像認識。研究は「チームスポーツ映像からの人物姿勢推定とその応用」

• 元計測システム開発者 => 現在 博士課程3年

• DERiVEコンピュータビジョンブログ・メルマガ(@derivecv)

• 翻訳者に「コンピュータビジョン - アルゴリズムと応用」著者:Richard Szeliski ; 訳者:玉木徹 他

• Web連載:「コンピュータビジョンのセカイ~今そこにあるミライ~」マイナビニュースにて2011年3月より連載中

Page 3: Pyconjp 2014 OpenCVのpythonインターフェース入門

本日の内容• コンピュータビジョンのためのオープンソースライブラリであるOpenCV(Open Computer Vision)のPythonインターフェースのチュートリアル。

• 過去の私のブログでの記事のパワーアップ版: 【Python Advent Calendar 2013】OpenCVライブラリのpythonインターフェース入門

Page 4: Pyconjp 2014 OpenCVのpythonインターフェース入門

目的(ターゲット層別)• コンピュータビジョンの初級者: Pythonでコンピュータビジョンプログラミングは簡単に始められる!!

• コンピュータビジョンの中級者: C++でしかOpenCVを使っていない方 -->> Pythonインターフェースを知らないせいで莫大な時間損失をしていることに気づくべき!Matlabのようにインタラクティブプログラミングの恩恵が得られる

• データ解析•機械学習系のみなさま: Scikit-learnやpandasは使えて画像認識をはじめてみたい!という方への最初のきっかけに

Page 5: Pyconjp 2014 OpenCVのpythonインターフェース入門

目次1. Computer Visionとは

2. OpenCVの概要と、pythonからの使用

3. 入出力と可視化

4. 画像処理の基礎的な処理のデモ

5. 応用例(動画での背景差分、人検出)

Page 6: Pyconjp 2014 OpenCVのpythonインターフェース入門

1.Computer Visionとは• Computer Vision: カメラで撮影した画像•動画、デプスなどから、実世界の様子を計算機で(できれば自動的に)把握する技術分野

https://www.youtube.com/watch?v=ftQnykTmGPw

youtube :computer vision applications (代表的な応用例集)

Page 7: Pyconjp 2014 OpenCVのpythonインターフェース入門

2.1 OpenCVの概要!

• C++言語向けのComputer Vision向け大規模ライブラリ

• Python, Javaなどのラッパーも提供されていて、C++版とほぼ同じように使用できる

• 画像処理,動画像入出力から, ステレオビジョン、局所特徴量、顔検出などコンピュータビジョンの基本的な道具が全部入っている

• 最新のバージョンはOpenCV2.4.9。先日、OpenCV3.0.0のα版がリリース

Page 8: Pyconjp 2014 OpenCVのpythonインターフェース入門

OpenCV(2.4.9)の主要モジュール• 多くのモジュールに分割されているが、Pythonからだと全ての関数は「cv2」でインポートし、cv2.から各関数にアクセスするだけ

基本モジュール(いつも使うもの) • core

• imgproc (画像処理)

• highgui (画像の表示ウィンドウとマウスキーボード入力)

Page 9: Pyconjp 2014 OpenCVのpythonインターフェース入門

応用モジュール(カテゴリーごとの処理)

• video (動画処理、背景差分、オプティカルフロー)

• calib3d (カメラキャリブレーション、ステレオ幾何)

• features2d (局所特徴量とそのマッチング)

• objdetect (物体検出: 顔検出,人検出,Latent SVM)

• stitching (パノラマ作成

• superres (超解像)

• videostab (動画安定化)

• ml (基礎的な機械学習)

• gpu, ocl (各アルゴリズムのCUDA版、OpenCL版)

※ ほとんどの関数・クラスはPythonからも使用可能であるが、gpuなど、Pythonへのバインディングが提供されていないものもある点には注意。

Page 10: Pyconjp 2014 OpenCVのpythonインターフェース入門

2.2 OpenCVのPythonからの使用法• cv2モジュールをインポート

• 画像データはnumpyのarray(多次元配列)として格納されている

!

(C++ではなく)PythonでOpenCVを使うメリット • numpyやscipyなどのpythonで充実している数値計算ライブラリとの連繋

• C++と違って(コンパイルを待たずに)、インタラクティブに、実験的に実行できる(しかもIPythonもある!)

• IPython Notebook(再生可能なノート)による、全ての結果のノート保存と、そのノートのグループ共有・Web共有

• Scikit-learn, pandasなど、機械学習、データサイエンスとの相性もGood

Page 11: Pyconjp 2014 OpenCVのpythonインターフェース入門

3.入出力と可視化• 画像の入力はcv2.imread() → numpy.ndarray型の画像データ

OpenCVの画像データの構造

• カラー画像:(height × width × channels)の3次元配列

• グレー画像:(height × width)の2次元配列

Page 12: Pyconjp 2014 OpenCVのpythonインターフェース入門

画像データがnumpy配列である利点• numpy,scipyなどの線形代数関数が、OpenCVでのプログラムにも使用可能 (C++のOpenCVでは、画像を扱うcv::Matクラスに用意されている線形代数関数を用いる)

• numpy的な画像操作を書けば、c言語並みの計算スピードをnumpyにより簡単に確保しやすい。(詳しくは、DERiVEメルマガ vo.16,17の該当記事を参照)

• numpyを介することで、scikit-learnやpyMC3などの、Pythonの統計的・機械学習ライブラリとの連繋もGood!

• numpyの配列はMatlabの配列と似ているので、研究者もPythonへ移行しやすい。(参考:Numpy for Matlab Users: )

Page 13: Pyconjp 2014 OpenCVのpythonインターフェース入門

OpenCVのnumpy画像データ の注意点

!

• 画素やwidth,heightへのインデックスアクセスや行列操作の、C++-OpenCVにおける同じ操作との違いに注意(numpyに慣れる必要あり)

• matplotlib,PIL,scikit-imageはRGB画像で保持するのに対して、OpeCVはBGR画像がデフォルト(後述のように、カラー変換が必要)

• OpenCVは画像は全てnumpy.uint8型のnumpy arrayであるが、scikit-imageなどではグレー画像だけはnumpy.float64型なので、他ライブラリと併用時に型変換を行うなど注意が必要

• (これらについて詳しくは、DERiVEメルマガ vo.16,17の該当記事を参照)

Page 14: Pyconjp 2014 OpenCVのpythonインターフェース入門

画像の可視化1 with OpenCVcv2.imshow()を用いる

結果:HighGUIの画像Windowが表示される

Page 15: Pyconjp 2014 OpenCVのpythonインターフェース入門

画像の可視化2 with MatplotlibMatplotlibのpyplot.imshow()でも画像をplotできる

※ 前述のように、OpenCVの画像はデフォルトだとBGR画像なので、matplotlibで正しく表示するには色変換する必要有り

Page 16: Pyconjp 2014 OpenCVのpythonインターフェース入門

画像の可視化2 with Matplotlib• OpenCVのimreadで読み込んだ画像はBGR画像 => cvCvtColor()でRGB画像へ変換

(要するに。。) RGB画像にすればMatplotibでは正しく表示できる!

Page 17: Pyconjp 2014 OpenCVのpythonインターフェース入門

4.画像処理の基礎的な処理のデモ: ガウシアンブラー

• 元画像に対して、ガウシアンフィルターを用いてボケ画像を作成

※ 上記2つの方法のどちらも、OpenCVの関数を1つ呼ぶだけで処理が完了しているのがポイント

Page 18: Pyconjp 2014 OpenCVのpythonインターフェース入門

4.画像処理の基礎的な処理のデモ: ガウシアンブラー

Page 19: Pyconjp 2014 OpenCVのpythonインターフェース入門

4.画像処理の基礎的な処理のデモ: エッジ検出

• 元画像から、以下の各フィルターでエッジ画像を作成

• Laplacianフィルタで2次微分

• X方向の1次微分(Sobelフィルタ)

• Y方向の1次微分(Sobelフィルタ)

Page 20: Pyconjp 2014 OpenCVのpythonインターフェース入門

4.画像処理の基礎的な処理のデモ: エッジ検出

Page 21: Pyconjp 2014 OpenCVのpythonインターフェース入門

5.1 動画での背景差分

• https://www.youtube.com/watch?v=UBZtk6EFxlY

今回のトーク向けに、私がPythonで作成した プログラムの結果動画

Page 22: Pyconjp 2014 OpenCVのpythonインターフェース入門

5.2 人検出

https://www.youtube.com/watch?v=PzXIgVzxr7Eこちらも私がOpenCV-Pythonで作成した結果

Page 23: Pyconjp 2014 OpenCVのpythonインターフェース入門

機械学習を用いた画像認識をPythonで作りたい方は:

•DERiVEメルマガ(derivecv.tumblr.com/merumaga)で連載中の記事

「scikit-­‐‑learnとscikit-­‐‑imageでつくる人検出」をチェック!  

• Github  repositoryに連載で紹介したコードを公開中:  h;ps://github.com/

payashim/python_visual_recognition_tutorials  •メルマガではアルゴリズムの解説とともに、Pythonによる「HOG+SVM

による人検出器」のコーディング方法を解説中(数少ない、機械学習

の画像認識アルゴリズムのコーディング法の解説資料)。  

• scikit-­‐‑learnとscikit-­‐‑imageを用いてHOG  +  SVM  (Dalal,  Triggs(2005))の人

検出手法(=  OpenCVのHOGDescriptorと同じ)の実装方法を紹介中。

23

Page 24: Pyconjp 2014 OpenCVのpythonインターフェース入門

まとめ • OpenCVのPythonインターフェースの導入をしました    

• C++版OpenCVとほぼ同じ関数インターフェースがPython  

に用意されている   • 画像データはnumpy.arrayの2次元(グレー画像)  or  3次元(カ  

ラー画像)配列で保持  →  numpy  を介しているので、他のPython科学計算ライブラリと連繋が良い  

• 基本的な画像処理と画像認識の関数の使用例を紹介  

この資料の元となった本番資料(IPython Notebook)も、以下に公開中です: https://github.com/payashim/tutorial-opencv-python-pyconjp2014