Upload
masaki-hayashi
View
4.314
Download
11
Embed Size (px)
Citation preview
コンピュータビジョンの最新ソフトウェア開発環境 ~ OpenCV,PCLの導入・機能紹介、
プログラミング言語の選択と開発ツールの活用~
慶應義塾大学 先端科学技術研究センター研究員 林 昌希
1
SSII2015チュートリアル講演会
本日の内容と目的コンピュータビジョン分野で研究開発活動をされている皆様に、以下の2テーマで
最新のソフトウェア開発環境について紹介
1. 前編:代表的ツール類の紹介
OpenCV/PCLの最近の話と、Python科学技術計算全般について
2. 後編:研究を進める上で
2-①どのプログラミング言語をいつ選択するか
2-②どのようなプロセスや判断基準で行うか、ツールを選択するか
2
本日の目的: よって、そんなところで苦労しないで済むようにしていただき、 本当に大事なことに、今後より集中できるようにする (もしくは今後自分で習熟していくのが楽になるための導入解説)
開発テクニックやツールの使いこなしは研究開発の手段であっても目的ではない。しかし、これらの使いこなしや知識が成果に直結する時代
講師の立ち位置• 普段の研究分野は画像認識/機械学習(動画からの人物追跡/姿勢推定/行動認識)
• 数理モデルや機械学習の理論寄りの話は強くない(これらはツールとして使う側)
• Point Cloud Library周辺の点群処理系の仕事/研究をしてきた経験あり
• 博士課程の前は4年間プログラマーでした(C#,C++,Javaなどで小チーム開発)
• 従って、一般的なソフトウェア開発テクニック + ここ3年の画像認識での研究の経験が両方あります(逆に言うとどちらもまだ深くはないです)。
3
一般的な話や公平な提案を心掛けていますが、やはり著者が得意なところにフォーカスのあたる発表である事には注意 (Pythonをプッシュする点など)
1.前編:ビジョン周辺の 最新ソフトウェア開発環境
(OpenCV/PCLとPython科学技術計算)
4
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
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 等を参照
• 開発環境や演算高速化周り
• cv::Mat の高速foreach処理
• GPU/OpenCL対応の強化
• 主要Computer Visionデータセットの操作ツール
• Python3サポート
• Matlabバインディング
• ARMのNEON命令向けの最適化
• Intel Performance Primitivesのデフォルト統合
OpenCV 3.0の新機能(2/2)1.1 OpenCVについて
7
• OpenCV3.0を用いたデモ
• TLD MIT trackerによるオンライン物体追跡
• Poisson Image Editingによる画像合成
8
1.1 OpenCVについて
OpenCVの他言語バインディング
• OpenCV2.0系のプログラミング言語
• メイン:C++
• バインディング:Java, Python
• 有志による非公式のバインディング:Ruby, C#など
• このうち現状Pythonインターフェースだけが、スクリプト言語からOpenCVを使用可能な公式サポート言語
1.1 OpenCVについて
9
便利な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.後編にて、実際の使い方を改めて紹介
OpenCVの存在する価値• 業界の人なら共通に知ってる/使えるものとして(万国共通語)
• 画像系の初心者:OpenCVで基礎教育が簡単に。
• 中級者:アルゴリズムは自力実装できるレベル人でも、基本ツールとしての存在が生産性を向上(画像の基本操作やcv::Matなど)
• オープンソース:コードさえ読めば標準的なアルゴリズムが学べる
• 専門外の人:仕組みは詳しく知らず、自分で実装まではできない人も各アルゴリズムをツール/APIとして使える(例:スマホアプリ開発や、インタラクション系など)
11
1.1 OpenCVについて
• 英語圏のWebではCUDA/OpenCL周りは結構バグが多いとの報告あり( 3.0以降は改善していく?)
• 「OpenCV最先端のアルゴリズムまで搭載されている」ように感じてしまうが、そんなことはない!(各問題設定やや新しいものや最初の提案が最低1つ入っているのみ。OpenCV3.0で改善)
• 画像認識に弱い:画像特徴 も機械学習アルゴリズムも共に最小限のものしか登録されていない(MLモジュールも最低限の道具しか搭載されていない)
OpenCVも万能神ではない1.1 OpenCVについて
12
Point Cloud Library(PCL)• ロボットビジョンを目的としたC++言語による点群処理ライブラリ
• Kinectと同じ頃に登場:リアルタイムに動画で点群が取得できる => 点群を簡単に処理できる(OpenCV的な)ライブラリが3Dビジョンにも欲しい
• 最新版はver. 1.7.2(2015年4月現在)
1.2 PCLについて
13
PCLとロボット• ロボットは3D環境を把握することで働ける => ビジョン技術がとても大事
• 物の場所や種類を認識 => 特定の物体だけ把持する。欠陥検査。テーブル上の物体認識
• 人の位置や様子(行動)を認識 => 人とのインタラクション、行動認識、ジェスチャー認識
• 環境の3D地図や変化を認識 => 自動車の前方監視。自律移動ロボットの自己位置把握, SLAM。広範囲レーザー測量(LIDARなど)による巨大地形マップの獲得(位置合わせ)や解析
1.2 PCLについて
14
15
1.2 PCLについて
標準的な点群処理が PCLには全て収録
※ これらはPCL1.5 くらいまでの主要構成
標準的な点群処理が PCLには全て収録
• 基礎~標準レベルのビジョン系処理がPCLには収録されている
• IO周りや可視化を簡単に済ませられるものが充実 (OpenNIGrabberやPCLVisualizerなど)
1.2 PCLについて
• 理由(私の憶測):ロボット業界の人たちはコンピュータビジョン的なところで苦労したくない??
点群処理はとにかく PCLに集約させよう!!
(=ロボット屋はビジョン部分は PCLで済むようにしよう!)
16
構成モジュール(PCL 1.7): 新規モジュールが多数追加中。既存モジュールも
機能増加中(Segmentationなど)
17
1.2 PCLについて
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について
例: Filtersモジュール• 点群向けのノイズや外れ値除去、平滑化などのフィルタリングを提供 • 主なアルゴリズム:
• 特定の領域だけ抽出(PathThrough) • 平滑化(Bilateral Filter) • ダウンサンプリング(VoxelGrid filter) • 外れ値除去(StatisticalOutlierRemoval)
19
1.2 PCLについて
例: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について
Unorganized Point Cloud (RGBDセンサーで撮影)
一見すると不均一だが。。21
1.2 PCLについて
Unorganized Point Cloud (RGBDセンサーで撮影)
距離画像上においては 各点は整列されている!
(各画素ごとに 対応する3D点が存在する)
22画像平面
1.2 PCLについて
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について
People モジュール: RGB-D人物検出
24
http://www.pointclouds.org/documentation/tutorials/ground_based_rgbd_people_detection.php#ground-based-rgbd-people-detection
画像:IAS2014 PCLチュートリアルより
• 処理手順; • 床平面初期化、Euclidian Clustering • そのサブクラスタ群を:
• 人のサイズまで分割と統合 • 身長やサイズの拘束でノイズを削除
• 人候補領域のみで画像からHOG +SVM検出
1.2 PCLについて
Recognitionモジュールテンプレート点群とテスト点群との間で、キーポイント特徴記述子を対応付けすることで特定物体認識
1.2 PCLについて
pcl::HypothesisVerification複数物体同時認識時の
妥当性確認
pcl::GeometricConsistencyGroupingpcl::Hough3DGrouping
25
これらは「登録済みの物体点群モデル とのマッチング」である点に注意 (物体カテゴリー認識ではない)
Segmentationモジュール の最近の新機能
※上記3つとも、公式サイトにチュートリアルあり
pcl::RegionGrowing
pcl::SupervoxelClustering
26
pcl::MinCutSegmentation
1.2 PCLについて
(普段2D画像で問題を解いていても) PCLで点群処理を少しでも触っておくメリット
• 画像での3D幾何のイメージがつきやすくなる(私も点群処理を通してカメラ幾何や剛体変換などに強くなりました)
• セグメンテーションや人認識、物体認識は3Dの方が楽 :この感覚をつかんでおけば、画像でそれらを行う時のハードルが下がる(引き出しも増える)。
• 3Dで関連する、グラフィックス、ロボット、インタラクションなどの周辺分野の知識が入りやすくなる
• ICPによる位置合わせ、法線特徴量などにより「形状特徴の応用」に親しむことができる:画像のエッジ特徴やセグメンテーションの理解度アップ。
27
1.2 PCLについて
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
著者がPythonを薦める理由• 個人的な体験:かつてC++メインだったのがPythonに移行して以降、コーディングに関してストレスを感じずに研究できている(=Pythonは簡潔なので楽)
• OpenCVをPythonから用いて、scikit-learn等と共に用いれば、画像認識、機械学習で有利(ツールも豊富なので楽で快適)
• また、インタラクティブな作業ができるので、プロトタイピングやアイデア練り出しに有利(2.後編で詳しく説明)
• 大学や会社で画像処理や画像認識を初めて学ぶ時に、Pythonは楽!(初心者の教育や最初の一歩に有利)
1.3 Python科学技術計算環境
29
「Scipy lecture notes -1.科学技術計算のためにPythonを始めよう」もチェック (※筆者はIPythonリード開発者のFernando Perez)
IPythonIPython本体:通常のPython対話実行環境を強化して、
科学技術計算向けにインタラクティブに作業しやすくしたもの
おもなサブ機能: • IPython Notebook (Jupyter): ノートとして作業かつ記録 • IPython Parallel:手軽に並列、分散計算を行うための仕組み
30
1.3 Python科学技術計算環境
http://ipython.org/
Jupyter (旧IPython Notebook)
• サーバークライアント形式のノートブック型Python実行環境 • Pythonだけでなく、各スクリプト言語(Julia,R,Rubyなど)でも
Notebook作成/実行が可能 (「試行錯誤」作業に適した環境) • Github上でノートブックの共有閲覧が盛ん:CS系のチュートリアルの
代表的提供手段になりつつある (例:Caffeのチュートリアルも.ipynb)31
1.3 Python科学技術計算環境
IPython コンソール/ Notebookへの Matplotlibのinline統合
matplotlibの図表を、別窓表示ではなく コンソール内やノートブック内で表示可能
通常は別ウィンドウに matplotlibの
figureは表示される ノートブックやコンソール内でも表示可能32
1.3 Python科学技術計算環境
NBViewer :Githubと統合された IPythonノートブックのWeb共有
著者のgithubレポジトリを nbViewerからexploreしている様子
33
1.3 Python科学技術計算環境
Githubに.ipynbファイルをアップロードしておくと、自動的にこのサイトで閲覧可能に
(ただし、Python自体はサイト上では実行できずStaticなノートに変換される)
http://nbviewer.ipython.org/
Spyder IDE
• Matlab的な科学計算向けIDE (IPythonと統合済み)
• AnacondaやPython(x,y)の推奨IDE
• Matlabのように、変数もデバッグ/実行中にその場でGUIで確認できる(ただしオブジェクトの中までは見れない)
34
1.3 Python科学技術計算環境
PTVS(Python Tools for Visual Studio)
• Microsoft Visual Studioに統合されたPythonの開発環境
• Visual Studioの強力な開発環境そのままでPythonの開発が可能 (例:Intellisenseなど)
https://pytools.codeplex.com/
35
1.3 Python科学技術計算環境
scikit-learn
• データマイニング、データ解析向けのシンプルさと効率的な機械学習ライブラリ(BSDライセンスで商用可能)。もちろん画像認識にも使用可能
• Numpy,Scipy,Matplotlibを基盤とした使用およびソースコード
36
1.3 Python科学技術計算環境
scikit-image
• 画像処理ライブラリ(※ 規模小さめのライブラリなので画像処理初心者におすすめ)
• 古典的な画像処理 + HOG, 局所特徴量やsuperpixelなど古典的画像特徴量から構成
• Pythonでは、OpenCVに足りないものを補間する使い方にもGood
37
1.3 Python科学技術計算環境
重要:これらのPythonライブラリは全てオープンソース
• scikit-learnやscikit-imageで画像処理や機械学習の基本アルゴリズムを全て読める(良い時代??)
• Matlabのツールボックスはどれもフルスタックで便利だが、中のコードまでは読むことができない。
• 同じアルゴリズムをC/C++のライブラリで読んでも良いのですが。。:PythonやMatlabの方が、簡潔で行列-likeな表現なので可読性が良い(=短い時間で理解もしやすい)。
38
1.3 Python科学技術計算環境
前編まとめ• OpenCV, PCLについて、最新状況の紹介とこれらを用いる事のメリットを改めて整理
• 画像系の皆様だけではなく科学計算行う型全般に役に立つ、Python科学計算環境の基本について
39
ここまではソフトウェアやツールの列挙でしか なかったので(なぜPython?もまだ不明)、 後編では実際の研究開発での使いこなしや 言語やツールを選択する判断基準の話へ
後編:プログラミング言語 と研究開発環境
40
2. 後編:目次• 2.1 プログラミング言語の選択と比較
• C/C++? それとも Python/Matlab?
• プロトタイピングの重要性
• 高速化、並列化
• 数学的記述、関数型プログラミング
• 2.2 Pythonを実際に研究に使ってみる
• PythonでOpenCVと一緒に機械学習ツールを使う(例;scikit-learn)
• Python + Matlplotlibで効率的な実験評価
• 2.3 開発テクニック(を研究に):IDE, テスト、バージョン管理
• テスト、リファクタリング、ドキュメント共有、などのエッセンスを研究に持ち込む
41
画像センシングによく 用いられるプログラミング言語
• コンパイルを行う言語(静的型付け):C/C++, Java, C# etc..
• スクリプト言語(動的型付け):Matlab, Python etc..
2.1 プログラミング言語の選択と比較
「型付け」以外の選定基準: • 画像系、機械学習系のライブラリの豊富さ • 計算速度の必要性 ( 最速確保にはやはりcやFortran) • その環境ではその言語しか使えない(例:組み込みだからc言語。
iOSだからObjective-C、など) • その言語が昔から得意なので(果たしてそれで良いのか??)
42
C/C++ v.s. Python/Matlab2.1 プログラミング言語の選択と比較
C/C++(Java,C#など) • 計算速度が速い • 型定義が厳格 • 古くからのC/C++の資産が全て使
える • 設計終了後の本番用チューニング
に向く • 行列/数式的記述がしづらい(※) • cv::Matの関数や配列forアクセス
よる画像操作
Python/Matlab • 計算速度が(やや)遅い • 型定義が緩い(引数などで) • 近年の画像認識/機械学習の資産
が多い • インタラクティブな実験的/探
索的作業に向く • 行列/数式的記述がしやすい • numpyでの行列操作-likeな画像
の代入/スライス操作
43
※概要の把握し易さから2項対立的に比較しているが、反対側の特徴も併せ持っているものも多い点には注意 ※関数プログラミング等が導入されてきたことで、最近はそうでもない。また、行列や線形代数演算についても、C++
ではEigenライブラリなら簡潔に書ける。
画像操作: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
「スクリプト言語によるプロトタイピング」 の科学技術計算での重要性
• C/C++は古来から画像系でよく用いられてきたが:
• 「何度もコードを書き換える」と毎回再コンパイルの時間が失われる
• 「画像/行列」の操作は、数式と同じ形でコーディングしづらい
本日の主提案「プロトタイピングフェーズの導入」: (1)PythonやMatlab等の動的スクリプト言語でプロトタイピングを行い、アルゴリズムの設計を固めたのちに、 (2)C/C++等で安定した最終版を設計に基づき実装する
プロトタイピング/設計済みのアルゴリズムなら、その後は設計済みなので (最小の時間で)C/C++でコーディング => 研究時間ロスの削減!
2.1 プログラミング言語の選択と比較
45
• デモ:IPython上で、インタラクティブにOpenCVを実行(画像を読み込み、人検出を行い結果を表示)
46
2.1 プログラミング言語の選択と比較
インタラクィブなプロトタイピング作業により 「アイデア」を練り出す
• C++やJavaで実装 => 少しずつ変更してすぐ試す事はしづらい (※JavaやC#などはコンパイル時間短いが、対話的実行環境ではない)
• PythonやMatlabなどを用いてプロトタイピング:
• 少し思いついただけでもすぐ試せる!
• 「やってみないとわからない」「目標がまだ定められていない」という時に有利
• やってみてダメなら何度でも作り直せばOK!
• 動的片付け言語では行列や関数型プログラミングと仲良くなりやすい(数式に近い形でそのまま記述できる言語が多い)
2.1 プログラミング言語の選択と比較
※最初から完成系が描けて、コードにもすぐ書ける型の場合、プロトタイピングによるアイデア出し作業の必要性は少ない
47
設計も重要• プロトタイピング作業だけに偏ると、方向性も完成系のイメージも無しの「手を動かしてるだけ!」になりがち (他人の論文も読まないし、設計も用意していないままの適当作業)。
• 設計もしましょう:
• 数式やアルゴリズムの式を書く
• 開発者的に「UML」で設計する
• グループで案を議論する など
2.1 プログラミング言語の選択と比較
「設計」と「プロトタイピング」のバランスは、 あなたの脳がどちらがより得意か次第とも言える
(アイデアはどちらが思いつきやすい??練りやすい?)
48
プロトタイピング環境
49
帰納的作業が得意な方は こちらの割合を増やす
動的型付け言語:Matlab, Python, Ruby etc.. 静的型付け言語で:C/C++, Java, C# etc..
「アイデア出し」、 「うまく行くかを試す」
を優先
「設計済み」、 「正しく動く」
を優先演繹的作業が得意な方は こちらの割合を増やす
本番環境
色々試しながら考えたい (勉強中、修行中、新しい問題に
チャレンジ中の)方はこちらが有利
既に熟練している場合や 設計が固まっている場合
はこちらが有利
2.1 プログラミング言語の選択と比較
※作業フロー例
※どちらかのみの使用や、逆の順でも 自分の目的に合致したフローであれば当然OK
アルゴリズムが複雑で新規なほど(図中右上方向) 簡潔な記述とプロトタイピングが効いてくる
アルゴリズムが 複雑で長い
アルゴリズムが 単純で短い
既存のアルゴリズム
新規設計/研究のアルゴリズム
プロトタイピングほぼ必要なし(OpenCVやscikit-learnのクラス
をつなげるだけの程度)
一気に書いてうまく動くかどうかは怪しい。。(長いアルゴリズムは論文読んだだけでは
理解も難しい)
コードにはすぐ書けるが、 まずは実験的に試していく
2.1 プログラミング言語の選択と比較
未開の地!ジャングル! (プロトタイピングがあなたを助ける!)
設計済みなものほど、静的型付け言語で
• 静的型付け言語(C,C++,Java,C#など)のメリット:
• 型をコンパイル前に限定できる(※キャストなどにより型変化できるので型不変ではないことには注意)
• 速度最適化をとことんまで突き詰められる(C++の闇)
• テンプレート、ジェネリックコード、メタプログラミングの恩恵を受けられる(C++の闇)
2.1 プログラミング言語の選択と比較
51
アルゴリズムが既に確定している場合C/C++などの静的型付けプログラムで厳格にコーディング!(本番環境向けに洗練されたバグのないものを作る)
※もちろん慣れていればC++/Java/C#などでプロトタイピングするのでもOK ただし、複雑な科学計算アルゴリズムは動的言語+対話環境のほうがおすすめ
コンパイル時の型推論最近は、静的片付け言語(C#, C++11, Java8 など)でも、
var 変数名 = new クラス名()
とコンパイル時に型推論する仕組みもある (varが何型かの決定をコンパイラにおまかせできる)
52
型推論に頼ると 静的型付け言語の「静的な記述による厳格さ」は減る
v.s. 動的型付け言語的な「簡潔に書けてすぐに試せる」は増える
2.1 プログラミング言語の選択と比較
def function1(input): result = input + 1.0 #この行の実行で、inputが数値型でないとエラー)
※動的型付け言語では、(基本的に)引数の型は実行時に動的にしかチェックできない
※この機能のメリット:コードの冗長性を避ける(varにすれば同じクラス名の表記を繰りかえさずに、短い記述のvarだけで済み、スッキリする)
Pythonでの例
スクリプト言語での高速化
• Matlabでの仕組み:MEX
• C/Fortranで書いた関数をコンパイル済みにしておき、Matlabから呼び出せる(その部分だけ高速実行できる)
• Matlabの場合、C言語でAPIが提供されている外部機器との通信手段ともなる(RS-232CやEthernetなど)
• Python:
• MEXのPython版のようなものがいくつかある(Cython, scipy.weaveなど)
• NumbaやNumexprで配列操作も結構簡単に高速化できる
• IPython ClusterやpyCUDAなど、(大規模)並列計算もPythonでは楽に使いやすい
2.1 プログラミング言語の選択と比較
Matlab/Pythonには、部分的にコンパイル済みにしたり、Pythonからお手軽に高速化/並列化を行う仕組みが提供されている(C++並みの速度も案外簡単に出せる)
53
C系言語:SIMDプログラミングやOpenMPで並列化
• 昨年のSSII2014での福嶋先生のチュートリアル「マルチコアを用いた画像処理」を参照
2.1 プログラミング言語の選択と比較
54
関数型プログラミング• 関数内で再代入不可(Immutable)を推奨するプログラミングスタイル。
• 命令型プログラミングのように計算機への命令やデータ構造の抽象化優先でなく、数学的な「純粋関数」による記述を優先(直感的に記述できる)
• 関数も引数として使えるので(第1級関数)、汎関数(関数の関数)を扱える (例:scipy.opimizeの多項式フィッティングなどでは、当てはめ対象の関数を引数に与える)
• 高階関数(map(), reduce(), filter()など関数を引数として取る関数)を駆使した関数操作
• 遅延評価や、Pythonジェネレータなどにより「簡潔な記述 かつ 繰り返し計算が高速」を実現しやすい。(再帰関数などで、計算中のメモリの温存=高速化につながる)
• 直感的(数式的に)にかつ簡潔にかけるので、対話実行時に有利
55
2.1 プログラミング言語の選択と比較
※「コンピュータビジョン」や「数値計算」に特化したメリットについて、著者がまだ整理できなかったので、ビジョン周辺に特化した話は割愛
どういった時に関数型プログラミングを優先すべき?• 世の流れ:統計、機械学習周辺では、過去のLisp -> Mathematica等の流れから、近年はR, Juliaなどの関数プログラミング寄りの対話的科学計算環境へ(もちろんPythonやMatlabで関数型プログラミングしてもよい)
56
ただし、関数型プログラミング初心者には手続き型、命令型の方が楽
for やif 無しで、再代入無しというルールは(簡潔で安全になるとはいえ)初心者にはわかりづらい、書きづらい。慣れるまではC++/Java的に書くほうがベター
2.1 プログラミング言語の選択と比較
関数型言語/プログラミングだとC/C++までの速度最適化はしづらい実行速度がやや落ちようとも、記述の綺麗さや見やすさを優先したいなら、関数型プ
ログラミング重視でOK(論文中での抽象的な記述との一致を図れるのもGOOD)
ソフトウェアが中規模以上になってくると「関数だけ」の構成は少し見辛い
クラスも使った方が大きなプログラムだと整理しやすい ? でもアルゴリズムは関数プログラミング的に作ると良い?※私もまだ正しい解が提供できず、今後議論したい点
RとPython for データサイエンス
フリー、オープンソースで統計や機械学習の共有が: 1. まずはR言語で進む:研究者のプロトタイピング向け 2. その後、実際のデプロイ環境でも解析ルーチンを動かしたいので、Pythonにscikit-learn(これがゲームチェンジャー)などが登場 3. ビジネスでも使用者が多くなり、Webやカンファレンスなどでの情報共有が活発に ( = 統計、機械学習の初歩が学びやすくなっている)
日本では: 日本語のRの教科書が充実したこともあり、Rユーザーは多いが、Pythonによるデータサイエンスの人材はまだ少なめ
欧米では: scipyやPyDataなどのカンファレンスが毎年開かれ、既にWebやデータサイエンスの世界でPythonが使われている
57
2.2 Pythonを実際に研究に使ってみる
Pythonの機械学習系ツールと OpenCVを同時に使う
※「C++/OpenCVのMLモジュールに収録されているものしか機械学習を使いこなせない」とはなっていませんか??
58
2.2 Pythonを実際に研究に使ってみる
OpenCV Pythonインターフェース
scikit-learn
caffe+numpy/scipy
基本的な画像処理や 特徴量計算を担当
特徴量計算や認識モデル と評価(sciki-learn)
を担当
他pystruct
例: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)
PythonからOpenCVを使うメリット
• Pythonなのでインラタクティブに作業できる
• cv::Matの代わりに画像をNumpyのArray(2/3次元配列)として使用するので行列操作が(C++,Eigenライブラリなど)より楽に書ける
• Numpy経由で繋がる多くのPython科学計算ライブラリと連携可
• Matlab/Mathematicaライクな環境が全て無料で手に入る
• PythonをC言語のように入門言語として使うと、画像処理の初歩を短時間で身につけやすい
60
2.2 Pythonを実際に研究に使ってみる
OpenCV/Numpyだと 画像の操作が数式的かつ簡潔
スライスによる指定ROI領域への値の代入
これらの操作はNumpyのndarray(2or3次元配列)への操作なので scipyのimageモジュールやscikit-imageでも書き方が共通!
(※OpenCVだけ画像のデータ型が少し違うので同時に使う場合は注意)
チャンネルnの画素値(i,j)へのアクセス
# グレー画像grayの(10,20)が左上で100*50の矩形に画素値0を代入 gray[10:(10+100), 20:(20+50)] =0
# カラー画像colorImgの(i, j) のチャンネル0の値を表示 print str(colorImg[i,j,0])
61
2.2 Pythonを実際に研究に使ってみる
※C++では2重forループに なるのが1行で記述が済む!
# グレー画像grayのインデックスmaskの画素(前景など)のみへ0を代入 gray[mask] =0
MatplotlibMatplotlib:Matlabやgnuplotのような図を、似たような関数 インターフェースを用いて作成できるPythonのplotライブラリ
62
2.2 Pythonを実際に研究に使ってみる
Python+Matplotlibで 実験評価+可視化
メインのコードはC++などの場合も、実験結果を一旦保存して PythonとNumpyで精度評価計算+結果のグラフ化を実行
「開発はC++で引き続きやる!Pythonには移行しない!」という方や「Excel (+VBAやExcelの関数)で実験結果はまとめています」という方にもオススメ
OpenCV/C++ で実験を実施
Numpy,Pandasで 評価値を計算
実験結果のデータ (CSVファイル)
Matplotlibで 結果や評価値を
グラフ化これらがPythonに
移ることで、 サクサク試せて
やり直しも楽になる
63
2.2 Pythonを実際に研究に使ってみる
例(機械学習):識別器のROC曲線を scikit-learn + Matplotlibで計算/可視化
http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#example-model-selection-plot-roc-py
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2) roc_auc = auc(fpr, tpr)
64
ROC曲線とAUCの計算
matplotlibで結果をプロット
pl.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
2.2 Pythonを実際に研究に使ってみる
チーム開発時には、リッチなIDEの恩恵を 受けながらコーディングしましょう
Emacs/Vimなどのコーディングエディタ(+コマンドライン)だけで開発する悪しき習慣はやめましょう!
画像系など専門性の高い(複雑で規模の大きなソフトウェア)のプログラミングにはIDEの助けが不可欠です
(一般的な開発では「チーム開発」で特に活きるのがIDE)
65
IDEの便利な機能を使わずに、勝つ自信がありますか? 「例:タブ補完、IDE上でのデバッグ、変数の状態確認
クラス構成全体の把握、バージョン管理とのエディタ連携」
2.3 開発テクニックを研究に生かす
テスト
製品出荷前に行うテスト: 機能テスト 性能テスト
目的:テスト時に発生した不具合の修正を行うことで、設計した通りの 安定したソフトウェアシステムを世の中にリリースする
66
2.3 開発テクニックを研究に生かす
• 研究寄りのコードは、機能テストが「実験」の執筆である程度済む
• しかし「テスト」を行わない限りはコードの正しさは保証されない
• 研究段階では製品をリリースするわけではないので、たとえば「重要な関数だけ単体テストする」などがちょうど良さそう?(※研究レベルの複雑で長い処理に対して、細かいテストを全て実施するのは負荷があまりにも高い)
開発中に(こまめに)行うテスト 単体テスト
テスト駆動開発(TDD)先にテストコードを書き、そのテストを通過するように、
設計してコードを書いていく手法
メリット: • テストが文章より正確な仕様になる(文書による曖昧な仕様定義を回避)
• 目標地点を提供する(※単体テストが全て通ればその関数は完成、など)
• 毎回テストを行う保証ができるので、ソフトウェアの安定性につながる
• c系の組み込み開発などにも威力を発揮。(言語やアルゴリズムが複雑なほど、テスト駆動が活きる)
67
2.3 開発テクニックを研究に生かす
(デザイン)パターン/リファクタリング整理された簡潔なコードにこまめに保守することは、規模が大きいシステム/長期的に使うシステム/チームで開発・共有するシステムほど重要 (※一点物の小さいシステムではあまり気にしないでもOK)
研究活動の中での例:実験を終えて、論文を提出した => 3ヶ月後査読が返ってきて、コードを修正して追加実験を行うことに
A. 汚く長いコードの場合:読みづらくてコードの修正に時間がかかり、締め切りギリギリまで苦戦。
B. 綺麗で簡潔なコードの場合:速やかにコードを追加して短時間で 終了。
同時に、コメントや文書にコーディングした内容の説明を こまめにメモしておくことも大切
68
2.3 開発テクニックを研究に生かす
「アジャイル」開発手法から エッセンスを学ぶ
「昨今のITシステム速い変化」に対応するために、 短期間にシステムを開発/変更するための開発戦略。
(XP, スクラム,リーン開発,かんばん)
69
※アジャイルは自己流での中途半端な導入は返って 混乱や非効率を及ぼす側面もあり、
本格導入にはきちんとした勉強が必要なことに注意
2.3 開発テクニックを研究に生かす
変化の激しいシステムを組んでいる人や 短期間でたくさん修正を加える場合は参考になる発想
研究寄りのプロジェクトでは バージョン管理まで行うべき?
• Githubが流行しているので、研究専業の方々でもGit等で研究のコードをバージョン管理している方も多いかもしれませんが。。
• MatlabやPythonでのコードをへたにGitなどで管理するとオーバーヘッドが大きい!(REPLの恩恵が減ってしまう!)
• もちろん多人数開発(これが本来のバージョン管理の目的)ではバージョン管理しても良いかもしれませんが、プロトタインピング中や、REPLで試し試し行う段階では、バージョン管理はアイデア捻出の妨げになっている可能性もあることに注意
※一方で、テストする段階ではバージョン管理しておいた 方がベスト:テストとコードの対応も管理できるので
70
2.3 開発テクニックを研究に生かす
ドキュメント、コード をチームで共有する
• ドキュメント化は大事 (開発の現場でとてもよく言われること) :アウトプットすることで本人の理解度アップ + その文書を元にチームで議論できる
• 問題点をいち早く見つけて対処しやすい
• ドキュメント化すると「そのチームの資産」となる(時間が経ってもどういった設計のソフトウァなのかが読み解ける)
• 共有する文書:プログラムのコード、論文(Mendeley等)、定例報告文書、IPythonノートブックなど
• 開発者がよく行うコードの共有、議論方法
• コードレビュー、ペアプログラミングなど
71
2.3 開発テクニックを研究に生かす
開発者になりすぎないように!• 会場にいる皆様の多くは「研究者」なので、あくまで勝負するのは高い専門性と新規性です。開発手法は必要なところだけ賢く取り入れましょう
• 定期的に自分に問いかけてみる言葉:
• 「ソースコード管理なんて本当に必要??」
• 「テストをきちんと実施する必要ある??」
• 「皆Python等で研究しているようだけど、自分の問題の特性を考えると、C/C++で厳格なコードにしたほうがよいのでは?」
• 貴方の研究と開発のバランス次第で、実際の仕事に取り入れるべきエッセンスが変わります
72
2.3 開発テクニックを研究に生かす
本日のtake home message• 前編
• コンピュータサイエンスではライブラリを使いこなして、(時には自分で使わずとも、中身を参考にして)更に高みを狙うことが重要。Python系まったく未知だったかは試してみてください。
• 後編
• プロトタイピング重要。「アイデアを生み出すためにはどうするか」を大切に
• 目的ごとにプログラミング言語を使い分ける
• 研究活動をしているとしてもチーム開発手法の各エッセンスは生かせる
• 最終的にはあなたの編み出すアルゴリズムや研究を大事にしましょう
• ツールに凝ることで効率性やグループ共有度が増せばその分、時間を有意義に確保することができ、たくさん論文も読むことができ、人と人のつながりや連携も増やせます
73
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