More Related Content
Similar to コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi (20)
コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi
- 5. 1.前編:目次
• 1.1 OpenCVについて
• OpecCV3.0の新機能
• 便利なPythonインターフェースも身につけましょう
• OpenCVといえど万能ではない。。
• 1.2 Point Cloud Library
• PCLとロボットについて
• PCL1.7.xの最新機能
• 点群処理にも慣れておく意味
• 1.3 Python科学技術計算環境
• どうしてPython?
• IPython, Python向けのIDE, scikit-learn など
5
- 6. OpenCV 3.0の新機能(1/2)
• GSoC等のおかげで多数の新アルゴリズムや機能が追加:
• 魚眼レンズカメラモデル
• 形状の距離計算とマッチング(Shape Context , Earth Movers Distance)
• KAZE/ A-KAZE feature
• HDR処理やPoisson Image Editing
• Saliency / Objectness(物体検出候補検出)
• シーン画像中からのテキスト検出とテキスト認識
• TLDトラッカーなどのオンライントラッキング
• xobjdetect:車検出(Waldboost) と人検出 (Integral Channel Feature)
• viz : 3D可視化ツール(vtkベース)と RDG-Dモジュール
※DERiVEメルマガで、各アルゴリズムを
毎回1つ取り上げ、概要を紹介中
1.1 OpenCVについて
6
詳しくは http://opencv.org/opencv-3-0-alpha.html 等を参照
- 7. • 開発環境や演算高速化周り
• cv::Mat の高速foreach処理
• GPU/OpenCL対応の強化
• 主要Computer Visionデータセットの操作ツール
• Python3サポート
• Matlabバインディング
• ARMのNEON命令向けの最適化
• Intel Performance Primitivesのデフォルト統合
OpenCV 3.0の新機能(2/2)
1.1 OpenCVについて
7
- 10. 便利なOpenCVのPythonインターフェース
1.1 OpenCVについて
OpenCV/C++と全く同じ引数で用意された関数群をPythonで叩ける
C++
Python
関数同じのままPythonでOpenCVで使えるので、
既にC++でOpenCVを使ってきた方には移行が簡単
10
cv2.imshow( test ,img)
imshow( test ,img);
cascade = cv2.CascadeClassifier(“haarcascade_frontalface_alt.xml”)Python
C++
CascadeClassifier face_cascade;
face_cascade.load(“haarcascade_frontalface_alt.xml”);
C++
Python
HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap)
クラスでもほぼ同じ使用感
※2.後編にて、実際の使い方を改めて紹介
- 13. Point Cloud Library(PCL)
• ロボットビジョンを目的としたC++言語による点群処理ライブラリ
• Kinectと同じ頃に登場:リアルタイムに動画で点群が取得できる => 点群を簡単に処
理できる(OpenCV的な)ライブラリが3Dビジョンにも欲しい
• 最新版はver. 1.7.2(2015年4月現在)
1.2 PCLについて
13
- 14. PCLとロボット
• ロボットは3D環境を把握することで働ける => ビジョン技術がとても大事
• 物の場所や種類を認識 => 特定の物体だけ把持する。欠陥検査。テーブル上の物体認識
• 人の位置や様子(行動)を認識 => 人とのインタラクション、行動認識、ジェスチャー認識
• 環境の3D地図や変化を認識 => 自動車の前方監視。自律移動ロボットの自己位置把握,
SLAM。広範囲レーザー測量(LIDARなど)による巨大地形マップの獲得(位置合わせ)や解析
1.2 PCLについて
14
- 18. pcl::PointCloud<PointT> 型
18
基本的な宣言方法:
pcl::PointCloud<PointT>::Ptr cloud( new PointCloud<PointT>() );
Point Cloudに含まれる点の形式を表すPointTの例:
pcl::PointXYZ - float x, y z
pcl::PointXYZI - float x, y z + 輝度
pcl::PointXYZRGBA - float x, y z + RGBA
pcl::PointNormal - float x, y z +normal[3] + curvature
pcl::Histogram - float histogram[N]
例):各点がPointXYZRGBAのPoint Cloud型オブジェクトの作成
PointCloud<pcl::PointXYZRGBA>::Ptr data(new PointCloud<pcl::PointXYZRGBA>());
「色付きの3D点群、法線」などのデータを格納する
PCLで一番よく使うオブジェクト: std:vectorライクなデータ構造
1.2 PCLについて
- 20. 例:PassThrough Filter
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud
(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered
(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud (cloud);
pass.setFilterFieldName ("z");
pass.setFilterLimits (0.0, 1.0);
pass.filter (*cloud_filtered);
指定した1次元方向(ここではz)の範囲
(setFilterLimits)の点群のみを残す
20
1.2 PCLについて
- 23. Organized Point Cloud in PCL
23
•点群中の各3D点を、距離画
像へ投影した座標(x,y)の順番
で保持.
•画像処理likeな、2次元画像構
造を利用した高速な近傍処理
(画像処理で言う「連結成分
処理」)が可能に
PCLでは:
1.PointCloud<PointT>に画素の順に並べて点を挿入する(普段は height=1で boost
のvectorとして点群を扱っている)
2.挿入済みのOrganizedPointCloudをOrganized対応の関数やクラスに渡すことで高
速処理(法線計算や平面検出など)
width
height
1.2 PCLについて
- 28. Python科学技術計算環境
• IPython と Jupyter(旧称 「IPython notebook」)
• Spyder IDE , Python Tools fo Visual Studio
• Numpy,Scipy, Matplotlib(基本三種の神器)
• Scikit-learn, Scikit-image
• Pandas, PyTables (Big Data, データ解析)
• Numba, PyCuDA
1.3 Python科学技術計算環境
28
- 34. Spyder IDE
• Matlab的な科学計算向けIDE (IPythonと統合済み)
• AnacondaやPython(x,y)の推奨IDE
• Matlabのように、変数もデバッグ/実行中にその場でGUIで確認できる(ただし
オブジェクトの中までは見れない)
34
1.3 Python科学技術計算環境
- 35. PTVS(Python Tools for Visual Studio)
• Microsoft Visual Studioに統合されたPythonの開発環境
• Visual Studioの強力な開発環境そのままでPythonの開発が可能 (例:Intellisenseなど)
https://pytools.codeplex.com/
35
1.3 Python科学技術計算環境
- 41. 2. 後編:目次
• 2.1 プログラミング言語の選択と比較
• C/C++? それとも Python/Matlab?
• プロトタイピングの重要性
• 高速化、並列化
• 数学的記述、関数型プログラミング
• 2.2 Pythonを実際に研究に使ってみる
• PythonでOpenCVと一緒に機械学習ツールを使う(例;scikit-learn)
• Python + Matlplotlibで効率的な実験評価
• 2.3 開発テクニック(を研究に):IDE, テスト、バージョン管理
• テスト、リファクタリング、ドキュメント共有、などのエッセンスを研究に持ち込む
41
- 43. C/C++ v.s. Python/Matlab
2.1 プログラミング言語の選択と比較
C/C++(Java,C#など)
• 計算速度が速い
• 型定義が厳格
• 古くからのC/C++の資産が全て使
える
• 設計終了後の本番用チューニング
に向く
• 行列/数式的記述がしづらい(※)
• cv::Matの関数や配列forアクセス
よる画像操作
Python/Matlab
• 計算速度が(やや)遅い
• 型定義が緩い(引数などで)
• 近年の画像認識/機械学習の資産
が多い
• インタラクティブな実験的/探
索的作業に向く
• 行列/数式的記述がしやすい
• numpyでの行列操作-likeな画像
の代入/スライス操作
43
※概要の把握し易さから2項対立的に比較しているが、反対側の特徴も併せ持っているものも多い点には注意
※関数プログラミング等が導入されてきたことで、最近はそうでもない。また、行列や線形代数演算についても、C++
ではEigenライブラリなら簡潔に書ける。
- 44. 画像操作:C++ v.s. Python
• OpenCV/C++でグレー画像grayのROIを取得
cv::Rect roi(10, 20, 100, 50);
cv::Mat gray_roi = gray(roi);
• OpenCV/python,numpyでグレー画像grayのROIを取得
roi = gray[10:(10+100), 20:(20+50)]
• OpenCV/python,numpyでカラー画像colorImgのROIのチャンネル0のみを取得
roi_0 = colorImg[10:(10+100), 20:(20+50),0]
注意:行数が同等な時でも、Pythonでは1行ずつ
すぐに実行して試せることが重要
2.1 プログラミング言語の選択と比較
44
C++
Python
- 47. インタラクィブなプロトタイピング作業により
「アイデア」を練り出す
• C++やJavaで実装 => 少しずつ変更してすぐ試す事はしづらい (※JavaやC#などはコ
ンパイル時間短いが、対話的実行環境ではない)
• PythonやMatlabなどを用いてプロトタイピング:
• 少し思いついただけでもすぐ試せる!
• 「やってみないとわからない」「目標がまだ定められていない」という時に有利
• やってみてダメなら何度でも作り直せばOK!
• 動的片付け言語では行列や関数型プログラミングと仲良くなりやすい(数式に近い形
でそのまま記述できる言語が多い)
2.1 プログラミング言語の選択と比較
※最初から完成系が描けて、コードにもすぐ書ける型の場合、
プロトタイピングによるアイデア出し作業の必要性は少ない
47
- 49. プロトタイピング環境
49
帰納的作業が得意な方は
こちらの割合を増やす
動的型付け言語:Matlab, Python, Ruby etc.. 静的型付け言語で:C/C++, Java, C# etc..
「アイデア出し」、
「うまく行くかを試す」
を優先
「設計済み」、
「正しく動く」
を優先
演繹的作業が得意な方は
こちらの割合を増やす
本番環境
色々試しながら考えたい
(勉強中、修行中、新しい問題に
チャレンジ中の)方はこちらが有利
既に熟練している場合や
設計が固まっている場合
はこちらが有利
2.1 プログラミング言語の選択と比較
※作業フロー例
※どちらかのみの使用や、逆の順でも
自分の目的に合致したフローであれば当然OK
- 52. コンパイル時の型推論
最近は、静的片付け言語(C#, C++11, Java8 など)でも、
var 変数名 = new クラス名()
とコンパイル時に型推論する仕組みもある (varが何型かの決定をコンパイラにおまかせできる)
52
型推論に頼ると
静的型付け言語の「静的な記述による厳格さ」は減る
v.s.
動的型付け言語的な「簡潔に書けてすぐに試せる」は増える
2.1 プログラミング言語の選択と比較
def function1(input):
result = input + 1.0 #この行の実行で、inputが数値型でないとエラー)
※動的型付け言語では、(基本的に)引数の型は実行時に動的にしかチェックできない
※この機能のメリット:コードの冗長性を避ける(varにすれば同じクラス名の表記を
繰りかえさずに、短い記述のvarだけで済み、スッキリする)
Pythonでの例
- 56. どういった時に関数型プログラミングを優先すべき?
• 世の流れ:統計、機械学習周辺では、過去のLisp -> Mathematica等の流
れから、近年はR, Juliaなどの関数プログラミング寄りの対話的科学計算
環境へ(もちろんPythonやMatlabで関数型プログラミングしてもよい)
56
ただし、関数型プログラミング初心者には手続き型、命令型の方が楽
for やif 無しで、再代入無しというルールは(簡潔で安全になるとはいえ)初心者にはわ
かりづらい、書きづらい。慣れるまではC++/Java的に書くほうがベター
2.1 プログラミング言語の選択と比較
関数型言語/プログラミングだとC/C++までの速度最適化はしづらい
実行速度がやや落ちようとも、記述の綺麗さや見やすさを優先したいなら、関数型プ
ログラミング重視でOK(論文中での抽象的な記述との一致を図れるのもGOOD)
ソフトウェアが中規模以上になってくると「関数だけ」の構成は少し見辛い
クラスも使った方が大きなプログラムだと整理しやすい ? でもアルゴリズムは関数プロ
グラミング的に作ると良い?※私もまだ正しい解が提供できず、今後議論したい点
- 59. 例:scikit-learnで人検出器を学習
from sklearn import svm
lin_clf = svm.LinearSVC()
lin_clf.fit(X, y) # Xはn個のHOG特徴ベクトルで、yはn個の出力ラベル(1 or -1)
手順2. 計算した特徴ベクトルと正解ラベルでSVMを学習
※ コードはDERiVEメルマガの
「scikit-learnとscikit-imageで学ぶ人検出」より抜粋
手順1.学習画像ごとにHOG特徴ベクトルを計算し、リストXに格納
2.2 Pythonを実際に研究に使ってみる
#OpenCVのHOGDescriptorクラスで計算する場合
hogvec = hog.compute(imgWin)
X.append(hogvec)
#(こちらでも可能)scikit-imageのhog関数で計算する場合。ただしOpenCVとはHOGベクトルの算出方法
が異なる。
hogvec = hog(pos_roi, orientations=9, pixels_per_cell=(8,8),cells_per_block=(2,2), visualise=False)
X.append(hogvec)
- 71. ドキュメント、コード
をチームで共有する
• ドキュメント化は大事 (開発の現場でとてもよく言われること) :アウトプットす
ることで本人の理解度アップ + その文書を元にチームで議論できる
• 問題点をいち早く見つけて対処しやすい
• ドキュメント化すると「そのチームの資産」となる(時間が経ってもどういった設
計のソフトウァなのかが読み解ける)
• 共有する文書:プログラムのコード、論文(Mendeley等)、定例報告文書、IPython
ノートブックなど
• 開発者がよく行うコードの共有、議論方法
• コードレビュー、ペアプログラミングなど
71
2.3 開発テクニックを研究に生かす
- 73. 本日のtake home message
• 前編
• コンピュータサイエンスではライブラリを使いこなして、(時には自分で使わずとも、
中身を参考にして)更に高みを狙うことが重要。Python系まったく未知だったかは試
してみてください。
• 後編
• プロトタイピング重要。「アイデアを生み出すためにはどうするか」を大切に
• 目的ごとにプログラミング言語を使い分ける
• 研究活動をしているとしてもチーム開発手法の各エッセンスは生かせる
• 最終的にはあなたの編み出すアルゴリズムや研究を大事にしましょう
• ツールに凝ることで効率性やグループ共有度が増せばその分、時間を有意義に確保する
ことができ、たくさん論文も読むことができ、人と人のつながりや連携も増やせます
73
- 74. Reference
• Maribel Fernández , “Programming Languages and Operational Semantics - A Concise Overview”, Springer (2014).
• Cyrille Rossant, “IPython Interactive Computing and Visualization Cookbook”, Packet Publishing (2014)
• Steven Lott, “Functional Python Programming ”, Packet Publishing (2014)
• Jennifer Campbell , Paul Gries , Jason Montojo , Greg Wilson, 長尾高弘(訳) , “初めてのコンピュータサイエン
ス” , オライリー・ジャパン (2010)
• Python for MATLAB Users: Promoting Open Source Computer Vision Research , CVPR 2012 tutorial:
http://www.kitware.com/cvpr2012.html
• 山本和彦 Gihyo.jp「[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!」: http://
gihyo.jp/dev/feature/01/functional-prog/0001
• PythonでCUDAに入門する http://d.hatena.ne.jp/norio515/20111112/1321105385
• James Shore, Shane Warden , 木下 史彦 (監訳), 平鍋 健児(監訳),笹井崇司 (訳) , “アート・オブ・アジャ
イル デベロップメント ―組織を成功に導くエクストリームプログラミング” , オライリー・ジャパン
(2010)
74