pyconjp 2014 opencvのpythonインターフェース入門
DESCRIPTION
PyconJP2014でのチュートリアル「」の発表資料(IPython Notebook)を、Keynoteで書き直してアップロードしたものです。TRANSCRIPT
!
OpenCVのpythonインターフェース入門 林昌希 (Masaki Hayashi) 慶應義塾大学 博士課程3年
PyConJP 2014,9月14日(日) 13:00- 13:30
この資料の元となった本番資料(IPython Notebook)も、以下に公開中です: https://github.com/payashim/tutorial-opencv-python-pyconjp2014
発表者について• 専門は機械学習による画像認識。研究は「チームスポーツ映像からの人物姿勢推定とその応用」
• 元計測システム開発者 => 現在 博士課程3年
• DERiVEコンピュータビジョンブログ・メルマガ(@derivecv)
• 翻訳者に「コンピュータビジョン - アルゴリズムと応用」著者:Richard Szeliski ; 訳者:玉木徹 他
• Web連載:「コンピュータビジョンのセカイ~今そこにあるミライ~」マイナビニュースにて2011年3月より連載中
本日の内容• コンピュータビジョンのためのオープンソースライブラリであるOpenCV(Open Computer Vision)のPythonインターフェースのチュートリアル。
• 過去の私のブログでの記事のパワーアップ版: 【Python Advent Calendar 2013】OpenCVライブラリのpythonインターフェース入門
目的(ターゲット層別)• コンピュータビジョンの初級者: Pythonでコンピュータビジョンプログラミングは簡単に始められる!!
• コンピュータビジョンの中級者: C++でしかOpenCVを使っていない方 -->> Pythonインターフェースを知らないせいで莫大な時間損失をしていることに気づくべき!Matlabのようにインタラクティブプログラミングの恩恵が得られる
• データ解析•機械学習系のみなさま: Scikit-learnやpandasは使えて画像認識をはじめてみたい!という方への最初のきっかけに
目次1. Computer Visionとは
2. OpenCVの概要と、pythonからの使用
3. 入出力と可視化
4. 画像処理の基礎的な処理のデモ
5. 応用例(動画での背景差分、人検出)
1.Computer Visionとは• Computer Vision: カメラで撮影した画像•動画、デプスなどから、実世界の様子を計算機で(できれば自動的に)把握する技術分野
https://www.youtube.com/watch?v=ftQnykTmGPw
youtube :computer vision applications (代表的な応用例集)
2.1 OpenCVの概要!
• C++言語向けのComputer Vision向け大規模ライブラリ
• Python, Javaなどのラッパーも提供されていて、C++版とほぼ同じように使用できる
• 画像処理,動画像入出力から, ステレオビジョン、局所特徴量、顔検出などコンピュータビジョンの基本的な道具が全部入っている
• 最新のバージョンはOpenCV2.4.9。先日、OpenCV3.0.0のα版がリリース
OpenCV(2.4.9)の主要モジュール• 多くのモジュールに分割されているが、Pythonからだと全ての関数は「cv2」でインポートし、cv2.から各関数にアクセスするだけ
基本モジュール(いつも使うもの) • core
• imgproc (画像処理)
• highgui (画像の表示ウィンドウとマウスキーボード入力)
応用モジュール(カテゴリーごとの処理)
• video (動画処理、背景差分、オプティカルフロー)
• calib3d (カメラキャリブレーション、ステレオ幾何)
• features2d (局所特徴量とそのマッチング)
• objdetect (物体検出: 顔検出,人検出,Latent SVM)
• stitching (パノラマ作成
• superres (超解像)
• videostab (動画安定化)
• ml (基礎的な機械学習)
• gpu, ocl (各アルゴリズムのCUDA版、OpenCL版)
※ ほとんどの関数・クラスはPythonからも使用可能であるが、gpuなど、Pythonへのバインディングが提供されていないものもある点には注意。
2.2 OpenCVのPythonからの使用法• cv2モジュールをインポート
• 画像データはnumpyのarray(多次元配列)として格納されている
!
(C++ではなく)PythonでOpenCVを使うメリット • numpyやscipyなどのpythonで充実している数値計算ライブラリとの連繋
• C++と違って(コンパイルを待たずに)、インタラクティブに、実験的に実行できる(しかもIPythonもある!)
• IPython Notebook(再生可能なノート)による、全ての結果のノート保存と、そのノートのグループ共有・Web共有
• Scikit-learn, pandasなど、機械学習、データサイエンスとの相性もGood
3.入出力と可視化• 画像の入力はcv2.imread() → numpy.ndarray型の画像データ
OpenCVの画像データの構造
• カラー画像:(height × width × channels)の3次元配列
• グレー画像:(height × width)の2次元配列
画像データが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: )
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の該当記事を参照)
画像の可視化1 with OpenCVcv2.imshow()を用いる
結果:HighGUIの画像Windowが表示される
画像の可視化2 with MatplotlibMatplotlibのpyplot.imshow()でも画像をplotできる
※ 前述のように、OpenCVの画像はデフォルトだとBGR画像なので、matplotlibで正しく表示するには色変換する必要有り
画像の可視化2 with Matplotlib• OpenCVのimreadで読み込んだ画像はBGR画像 => cvCvtColor()でRGB画像へ変換
(要するに。。) RGB画像にすればMatplotibでは正しく表示できる!
4.画像処理の基礎的な処理のデモ: ガウシアンブラー
• 元画像に対して、ガウシアンフィルターを用いてボケ画像を作成
※ 上記2つの方法のどちらも、OpenCVの関数を1つ呼ぶだけで処理が完了しているのがポイント
4.画像処理の基礎的な処理のデモ: ガウシアンブラー
4.画像処理の基礎的な処理のデモ: エッジ検出
• 元画像から、以下の各フィルターでエッジ画像を作成
• Laplacianフィルタで2次微分
• X方向の1次微分(Sobelフィルタ)
• Y方向の1次微分(Sobelフィルタ)
4.画像処理の基礎的な処理のデモ: エッジ検出
5.1 動画での背景差分
• https://www.youtube.com/watch?v=UBZtk6EFxlY
今回のトーク向けに、私がPythonで作成した プログラムの結果動画
5.2 人検出
https://www.youtube.com/watch?v=PzXIgVzxr7Eこちらも私が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
まとめ • OpenCVのPythonインターフェースの導入をしました
• C++版OpenCVとほぼ同じ関数インターフェースがPython
に用意されている • 画像データはnumpy.arrayの2次元(グレー画像) or 3次元(カ
ラー画像)配列で保持 → numpy を介しているので、他のPython科学計算ライブラリと連繋が良い
• 基本的な画像処理と画像認識の関数の使用例を紹介
この資料の元となった本番資料(IPython Notebook)も、以下に公開中です: https://github.com/payashim/tutorial-opencv-python-pyconjp2014