74
コンピュータビジョンの最新ソフトウェア開発環境 ~ OpenCV,PCLの導入・機能紹介、 プログラミング言語の選択と開発ツールの活用~ 慶應義塾大学 先端科学技術研究センター研究員 林 昌希 1 SSII2015チュートリアル講演会

コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Embed Size (px)

Citation preview

Page 1: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

コンピュータビジョンの最新ソフトウェア開発環境 ~ OpenCV,PCLの導入・機能紹介、

プログラミング言語の選択と開発ツールの活用~

慶應義塾大学 先端科学技術研究センター研究員 林 昌希

1

SSII2015チュートリアル講演会

Page 2: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

本日の内容と目的コンピュータビジョン分野で研究開発活動をされている皆様に、以下の2テーマで

最新のソフトウェア開発環境について紹介

1. 前編:代表的ツール類の紹介

OpenCV/PCLの最近の話と、Python科学技術計算全般について

2. 後編:研究を進める上で

2-①どのプログラミング言語をいつ選択するか

2-②どのようなプロセスや判断基準で行うか、ツールを選択するか

2

本日の目的: よって、そんなところで苦労しないで済むようにしていただき、 本当に大事なことに、今後より集中できるようにする (もしくは今後自分で習熟していくのが楽になるための導入解説)

開発テクニックやツールの使いこなしは研究開発の手段であっても目的ではない。しかし、これらの使いこなしや知識が成果に直結する時代

Page 3: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

講師の立ち位置• 普段の研究分野は画像認識/機械学習(動画からの人物追跡/姿勢推定/行動認識)

• 数理モデルや機械学習の理論寄りの話は強くない(これらはツールとして使う側)

• Point Cloud Library周辺の点群処理系の仕事/研究をしてきた経験あり

• 博士課程の前は4年間プログラマーでした(C#,C++,Javaなどで小チーム開発)

• 従って、一般的なソフトウェア開発テクニック + ここ3年の画像認識での研究の経験が両方あります(逆に言うとどちらもまだ深くはないです)。

3

一般的な話や公平な提案を心掛けていますが、やはり著者が得意なところにフォーカスのあたる発表である事には注意 (Pythonをプッシュする点など)

Page 4: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

1.前編:ビジョン周辺の 最新ソフトウェア開発環境

(OpenCV/PCLとPython科学技術計算)

4

Page 5: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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

Page 6: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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 等を参照 

Page 7: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

• 開発環境や演算高速化周り

• cv::Mat の高速foreach処理

• GPU/OpenCL対応の強化

• 主要Computer Visionデータセットの操作ツール

• Python3サポート

• Matlabバインディング

• ARMのNEON命令向けの最適化

• Intel Performance Primitivesのデフォルト統合

OpenCV 3.0の新機能(2/2)1.1 OpenCVについて

7

Page 8: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

• OpenCV3.0を用いたデモ

• TLD MIT trackerによるオンライン物体追跡

• Poisson Image Editingによる画像合成

8

1.1 OpenCVについて

Page 9: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

OpenCVの他言語バインディング

• OpenCV2.0系のプログラミング言語

• メイン:C++

• バインディング:Java, Python

• 有志による非公式のバインディング:Ruby, C#など

• このうち現状Pythonインターフェースだけが、スクリプト言語からOpenCVを使用可能な公式サポート言語

1.1 OpenCVについて

9

Page 10: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

便利な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.後編にて、実際の使い方を改めて紹介

Page 11: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

OpenCVの存在する価値• 業界の人なら共通に知ってる/使えるものとして(万国共通語)

• 画像系の初心者:OpenCVで基礎教育が簡単に。

• 中級者:アルゴリズムは自力実装できるレベル人でも、基本ツールとしての存在が生産性を向上(画像の基本操作やcv::Matなど)

• オープンソース:コードさえ読めば標準的なアルゴリズムが学べる

• 専門外の人:仕組みは詳しく知らず、自分で実装まではできない人も各アルゴリズムをツール/APIとして使える(例:スマホアプリ開発や、インタラクション系など)

11

1.1 OpenCVについて

Page 12: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

• 英語圏のWebではCUDA/OpenCL周りは結構バグが多いとの報告あり( 3.0以降は改善していく?)

• 「OpenCV最先端のアルゴリズムまで搭載されている」ように感じてしまうが、そんなことはない!(各問題設定やや新しいものや最初の提案が最低1つ入っているのみ。OpenCV3.0で改善)

• 画像認識に弱い:画像特徴 も機械学習アルゴリズムも共に最小限のものしか登録されていない(MLモジュールも最低限の道具しか搭載されていない)

OpenCVも万能神ではない1.1 OpenCVについて

12

Page 13: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Point Cloud Library(PCL)• ロボットビジョンを目的としたC++言語による点群処理ライブラリ

• Kinectと同じ頃に登場:リアルタイムに動画で点群が取得できる => 点群を簡単に処理できる(OpenCV的な)ライブラリが3Dビジョンにも欲しい

• 最新版はver. 1.7.2(2015年4月現在)

1.2 PCLについて

13

Page 14: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

PCLとロボット• ロボットは3D環境を把握することで働ける => ビジョン技術がとても大事

• 物の場所や種類を認識 => 特定の物体だけ把持する。欠陥検査。テーブル上の物体認識

• 人の位置や様子(行動)を認識 => 人とのインタラクション、行動認識、ジェスチャー認識

• 環境の3D地図や変化を認識 => 自動車の前方監視。自律移動ロボットの自己位置把握, SLAM。広範囲レーザー測量(LIDARなど)による巨大地形マップの獲得(位置合わせ)や解析

1.2 PCLについて

14

Page 15: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

15

1.2 PCLについて

標準的な点群処理が PCLには全て収録

※ これらはPCL1.5 くらいまでの主要構成

Page 16: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

標準的な点群処理が PCLには全て収録

• 基礎~標準レベルのビジョン系処理がPCLには収録されている

• IO周りや可視化を簡単に済ませられるものが充実 (OpenNIGrabberやPCLVisualizerなど)

1.2 PCLについて

• 理由(私の憶測):ロボット業界の人たちはコンピュータビジョン的なところで苦労したくない??

点群処理はとにかく PCLに集約させよう!!

(=ロボット屋はビジョン部分は PCLで済むようにしよう!)

16

Page 17: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

構成モジュール(PCL 1.7): 新規モジュールが多数追加中。既存モジュールも

機能増加中(Segmentationなど)

17

1.2 PCLについて

Page 18: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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について

Page 19: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

例: Filtersモジュール• 点群向けのノイズや外れ値除去、平滑化などのフィルタリングを提供 • 主なアルゴリズム:

• 特定の領域だけ抽出(PathThrough) • 平滑化(Bilateral Filter) • ダウンサンプリング(VoxelGrid filter) • 外れ値除去(StatisticalOutlierRemoval)

19

1.2 PCLについて

Page 20: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

例: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について

Page 21: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Unorganized Point Cloud (RGBDセンサーで撮影)

一見すると不均一だが。。21

1.2 PCLについて

Page 22: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Unorganized Point Cloud (RGBDセンサーで撮影)

距離画像上においては 各点は整列されている!

(各画素ごとに 対応する3D点が存在する)

22画像平面

1.2 PCLについて

Page 23: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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について

Page 24: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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について

Page 25: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Recognitionモジュールテンプレート点群とテスト点群との間で、キーポイント特徴記述子を対応付けすることで特定物体認識

1.2 PCLについて

pcl::HypothesisVerification複数物体同時認識時の

妥当性確認

pcl::GeometricConsistencyGroupingpcl::Hough3DGrouping

25

これらは「登録済みの物体点群モデル とのマッチング」である点に注意 (物体カテゴリー認識ではない)

Page 26: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Segmentationモジュール の最近の新機能

※上記3つとも、公式サイトにチュートリアルあり

pcl::RegionGrowing

pcl::SupervoxelClustering

26

pcl::MinCutSegmentation

1.2 PCLについて

Page 27: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

(普段2D画像で問題を解いていても) PCLで点群処理を少しでも触っておくメリット

• 画像での3D幾何のイメージがつきやすくなる(私も点群処理を通してカメラ幾何や剛体変換などに強くなりました)

• セグメンテーションや人認識、物体認識は3Dの方が楽 :この感覚をつかんでおけば、画像でそれらを行う時のハードルが下がる(引き出しも増える)。

• 3Dで関連する、グラフィックス、ロボット、インタラクションなどの周辺分野の知識が入りやすくなる

• ICPによる位置合わせ、法線特徴量などにより「形状特徴の応用」に親しむことができる:画像のエッジ特徴やセグメンテーションの理解度アップ。

27

1.2 PCLについて

Page 28: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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

Page 29: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

著者がPythonを薦める理由• 個人的な体験:かつてC++メインだったのがPythonに移行して以降、コーディングに関してストレスを感じずに研究できている(=Pythonは簡潔なので楽)

• OpenCVをPythonから用いて、scikit-learn等と共に用いれば、画像認識、機械学習で有利(ツールも豊富なので楽で快適)

• また、インタラクティブな作業ができるので、プロトタイピングやアイデア練り出しに有利(2.後編で詳しく説明)

• 大学や会社で画像処理や画像認識を初めて学ぶ時に、Pythonは楽!(初心者の教育や最初の一歩に有利)

1.3 Python科学技術計算環境

29

「Scipy lecture notes -1.科学技術計算のためにPythonを始めよう」もチェック (※筆者はIPythonリード開発者のFernando Perez)

Page 30: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

IPythonIPython本体:通常のPython対話実行環境を強化して、

科学技術計算向けにインタラクティブに作業しやすくしたもの

おもなサブ機能: • IPython Notebook (Jupyter): ノートとして作業かつ記録 • IPython Parallel:手軽に並列、分散計算を行うための仕組み

30

1.3 Python科学技術計算環境

http://ipython.org/

Page 31: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Jupyter (旧IPython Notebook)

• サーバークライアント形式のノートブック型Python実行環境 • Pythonだけでなく、各スクリプト言語(Julia,R,Rubyなど)でも

Notebook作成/実行が可能 (「試行錯誤」作業に適した環境) • Github上でノートブックの共有閲覧が盛ん:CS系のチュートリアルの

代表的提供手段になりつつある (例:Caffeのチュートリアルも.ipynb)31

1.3 Python科学技術計算環境

Page 32: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

IPython コンソール/ Notebookへの Matplotlibのinline統合

matplotlibの図表を、別窓表示ではなく コンソール内やノートブック内で表示可能

通常は別ウィンドウに matplotlibの

figureは表示される ノートブックやコンソール内でも表示可能32

1.3 Python科学技術計算環境

Page 33: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

NBViewer :Githubと統合された IPythonノートブックのWeb共有

著者のgithubレポジトリを nbViewerからexploreしている様子

33

1.3 Python科学技術計算環境

Githubに.ipynbファイルをアップロードしておくと、自動的にこのサイトで閲覧可能に

(ただし、Python自体はサイト上では実行できずStaticなノートに変換される)

http://nbviewer.ipython.org/

Page 34: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Spyder IDE

• Matlab的な科学計算向けIDE (IPythonと統合済み)

• AnacondaやPython(x,y)の推奨IDE

• Matlabのように、変数もデバッグ/実行中にその場でGUIで確認できる(ただしオブジェクトの中までは見れない)

34

1.3 Python科学技術計算環境

Page 35: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

PTVS(Python Tools for Visual Studio)

• Microsoft Visual Studioに統合されたPythonの開発環境

• Visual Studioの強力な開発環境そのままでPythonの開発が可能 (例:Intellisenseなど)

https://pytools.codeplex.com/

35

1.3 Python科学技術計算環境

Page 36: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

scikit-learn

• データマイニング、データ解析向けのシンプルさと効率的な機械学習ライブラリ(BSDライセンスで商用可能)。もちろん画像認識にも使用可能

• Numpy,Scipy,Matplotlibを基盤とした使用およびソースコード

36

1.3 Python科学技術計算環境

Page 37: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

scikit-image

• 画像処理ライブラリ(※ 規模小さめのライブラリなので画像処理初心者におすすめ)

• 古典的な画像処理 + HOG, 局所特徴量やsuperpixelなど古典的画像特徴量から構成

• Pythonでは、OpenCVに足りないものを補間する使い方にもGood

37

1.3 Python科学技術計算環境

Page 38: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

重要:これらのPythonライブラリは全てオープンソース

• scikit-learnやscikit-imageで画像処理や機械学習の基本アルゴリズムを全て読める(良い時代??)

• Matlabのツールボックスはどれもフルスタックで便利だが、中のコードまでは読むことができない。

• 同じアルゴリズムをC/C++のライブラリで読んでも良いのですが。。:PythonやMatlabの方が、簡潔で行列-likeな表現なので可読性が良い(=短い時間で理解もしやすい)。

38

1.3 Python科学技術計算環境

Page 39: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

 前編まとめ• OpenCV, PCLについて、最新状況の紹介とこれらを用いる事のメリットを改めて整理

• 画像系の皆様だけではなく科学計算行う型全般に役に立つ、Python科学計算環境の基本について

39

ここまではソフトウェアやツールの列挙でしか なかったので(なぜPython?もまだ不明)、 後編では実際の研究開発での使いこなしや 言語やツールを選択する判断基準の話へ

Page 40: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

後編:プログラミング言語 と研究開発環境

40

Page 41: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

2. 後編:目次• 2.1 プログラミング言語の選択と比較

• C/C++? それとも Python/Matlab?

• プロトタイピングの重要性

• 高速化、並列化

• 数学的記述、関数型プログラミング

• 2.2 Pythonを実際に研究に使ってみる

• PythonでOpenCVと一緒に機械学習ツールを使う(例;scikit-learn)

• Python + Matlplotlibで効率的な実験評価

• 2.3 開発テクニック(を研究に):IDE, テスト、バージョン管理

• テスト、リファクタリング、ドキュメント共有、などのエッセンスを研究に持ち込む

41

Page 42: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

画像センシングによく 用いられるプログラミング言語

• コンパイルを行う言語(静的型付け):C/C++, Java, C# etc..

• スクリプト言語(動的型付け):Matlab, Python etc..

2.1 プログラミング言語の選択と比較

「型付け」以外の選定基準: • 画像系、機械学習系のライブラリの豊富さ • 計算速度の必要性 ( 最速確保にはやはりcやFortran) • その環境ではその言語しか使えない(例:組み込みだからc言語。

iOSだからObjective-C、など) • その言語が昔から得意なので(果たしてそれで良いのか??)

42

Page 43: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

C/C++ v.s. Python/Matlab2.1 プログラミング言語の選択と比較

C/C++(Java,C#など) • 計算速度が速い • 型定義が厳格 • 古くからのC/C++の資産が全て使

える • 設計終了後の本番用チューニング

に向く • 行列/数式的記述がしづらい(※) • cv::Matの関数や配列forアクセス

よる画像操作

Python/Matlab • 計算速度が(やや)遅い • 型定義が緩い(引数などで) • 近年の画像認識/機械学習の資産

が多い • インタラクティブな実験的/探

索的作業に向く • 行列/数式的記述がしやすい • numpyでの行列操作-likeな画像

の代入/スライス操作

43

※概要の把握し易さから2項対立的に比較しているが、反対側の特徴も併せ持っているものも多い点には注意 ※関数プログラミング等が導入されてきたことで、最近はそうでもない。また、行列や線形代数演算についても、C++

ではEigenライブラリなら簡潔に書ける。

Page 44: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

画像操作: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

Page 45: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

「スクリプト言語によるプロトタイピング」 の科学技術計算での重要性

• C/C++は古来から画像系でよく用いられてきたが:

• 「何度もコードを書き換える」と毎回再コンパイルの時間が失われる

• 「画像/行列」の操作は、数式と同じ形でコーディングしづらい

本日の主提案「プロトタイピングフェーズの導入」: (1)PythonやMatlab等の動的スクリプト言語でプロトタイピングを行い、アルゴリズムの設計を固めたのちに、 (2)C/C++等で安定した最終版を設計に基づき実装する

プロトタイピング/設計済みのアルゴリズムなら、その後は設計済みなので (最小の時間で)C/C++でコーディング => 研究時間ロスの削減!

2.1 プログラミング言語の選択と比較

45

Page 46: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

• デモ:IPython上で、インタラクティブにOpenCVを実行(画像を読み込み、人検出を行い結果を表示)

46

2.1 プログラミング言語の選択と比較

Page 47: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

インタラクィブなプロトタイピング作業により 「アイデア」を練り出す

• C++やJavaで実装 => 少しずつ変更してすぐ試す事はしづらい (※JavaやC#などはコンパイル時間短いが、対話的実行環境ではない)

• PythonやMatlabなどを用いてプロトタイピング:

• 少し思いついただけでもすぐ試せる! 

• 「やってみないとわからない」「目標がまだ定められていない」という時に有利

• やってみてダメなら何度でも作り直せばOK!

• 動的片付け言語では行列や関数型プログラミングと仲良くなりやすい(数式に近い形でそのまま記述できる言語が多い)

2.1 プログラミング言語の選択と比較

※最初から完成系が描けて、コードにもすぐ書ける型の場合、プロトタイピングによるアイデア出し作業の必要性は少ない

47

Page 48: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

設計も重要• プロトタイピング作業だけに偏ると、方向性も完成系のイメージも無しの「手を動かしてるだけ!」になりがち (他人の論文も読まないし、設計も用意していないままの適当作業)。

• 設計もしましょう:

• 数式やアルゴリズムの式を書く

• 開発者的に「UML」で設計する

• グループで案を議論する など

2.1 プログラミング言語の選択と比較

「設計」と「プロトタイピング」のバランスは、 あなたの脳がどちらがより得意か次第とも言える

(アイデアはどちらが思いつきやすい??練りやすい?)

48

Page 49: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

プロトタイピング環境

49

帰納的作業が得意な方は こちらの割合を増やす

動的型付け言語:Matlab, Python, Ruby etc.. 静的型付け言語で:C/C++, Java, C# etc..

「アイデア出し」、 「うまく行くかを試す」

を優先

「設計済み」、 「正しく動く」

を優先演繹的作業が得意な方は こちらの割合を増やす

本番環境

色々試しながら考えたい (勉強中、修行中、新しい問題に

チャレンジ中の)方はこちらが有利

既に熟練している場合や 設計が固まっている場合

はこちらが有利

2.1 プログラミング言語の選択と比較

※作業フロー例

※どちらかのみの使用や、逆の順でも 自分の目的に合致したフローであれば当然OK

Page 50: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

アルゴリズムが複雑で新規なほど(図中右上方向) 簡潔な記述とプロトタイピングが効いてくる

アルゴリズムが 複雑で長い

アルゴリズムが 単純で短い

既存のアルゴリズム

新規設計/研究のアルゴリズム

プロトタイピングほぼ必要なし(OpenCVやscikit-learnのクラス

をつなげるだけの程度)

一気に書いてうまく動くかどうかは怪しい。。(長いアルゴリズムは論文読んだだけでは

理解も難しい)

コードにはすぐ書けるが、 まずは実験的に試していく

2.1 プログラミング言語の選択と比較

未開の地!ジャングル! (プロトタイピングがあなたを助ける!)

Page 51: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

設計済みなものほど、静的型付け言語で

• 静的型付け言語(C,C++,Java,C#など)のメリット:

• 型をコンパイル前に限定できる(※キャストなどにより型変化できるので型不変ではないことには注意)

• 速度最適化をとことんまで突き詰められる(C++の闇)

• テンプレート、ジェネリックコード、メタプログラミングの恩恵を受けられる(C++の闇)

2.1 プログラミング言語の選択と比較

51

アルゴリズムが既に確定している場合C/C++などの静的型付けプログラムで厳格にコーディング!(本番環境向けに洗練されたバグのないものを作る)

※もちろん慣れていればC++/Java/C#などでプロトタイピングするのでもOK ただし、複雑な科学計算アルゴリズムは動的言語+対話環境のほうがおすすめ

Page 52: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

コンパイル時の型推論最近は、静的片付け言語(C#, C++11, Java8 など)でも、

var 変数名 = new クラス名()

とコンパイル時に型推論する仕組みもある (varが何型かの決定をコンパイラにおまかせできる)

52

型推論に頼ると 静的型付け言語の「静的な記述による厳格さ」は減る

v.s. 動的型付け言語的な「簡潔に書けてすぐに試せる」は増える

2.1 プログラミング言語の選択と比較

def function1(input): result = input + 1.0 #この行の実行で、inputが数値型でないとエラー)

※動的型付け言語では、(基本的に)引数の型は実行時に動的にしかチェックできない

※この機能のメリット:コードの冗長性を避ける(varにすれば同じクラス名の表記を繰りかえさずに、短い記述のvarだけで済み、スッキリする)

Pythonでの例

Page 53: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

スクリプト言語での高速化

• 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

Page 54: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

C系言語:SIMDプログラミングやOpenMPで並列化

• 昨年のSSII2014での福嶋先生のチュートリアル「マルチコアを用いた画像処理」を参照

2.1 プログラミング言語の選択と比較

54

Page 55: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

関数型プログラミング• 関数内で再代入不可(Immutable)を推奨するプログラミングスタイル。

• 命令型プログラミングのように計算機への命令やデータ構造の抽象化優先でなく、数学的な「純粋関数」による記述を優先(直感的に記述できる)

• 関数も引数として使えるので(第1級関数)、汎関数(関数の関数)を扱える (例:scipy.opimizeの多項式フィッティングなどでは、当てはめ対象の関数を引数に与える)

• 高階関数(map(), reduce(), filter()など関数を引数として取る関数)を駆使した関数操作

• 遅延評価や、Pythonジェネレータなどにより「簡潔な記述 かつ 繰り返し計算が高速」を実現しやすい。(再帰関数などで、計算中のメモリの温存=高速化につながる)

• 直感的(数式的に)にかつ簡潔にかけるので、対話実行時に有利

55

2.1 プログラミング言語の選択と比較

※「コンピュータビジョン」や「数値計算」に特化したメリットについて、著者がまだ整理できなかったので、ビジョン周辺に特化した話は割愛

Page 56: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

どういった時に関数型プログラミングを優先すべき?• 世の流れ:統計、機械学習周辺では、過去のLisp -> Mathematica等の流れから、近年はR, Juliaなどの関数プログラミング寄りの対話的科学計算環境へ(もちろんPythonやMatlabで関数型プログラミングしてもよい)

56

ただし、関数型プログラミング初心者には手続き型、命令型の方が楽

for やif 無しで、再代入無しというルールは(簡潔で安全になるとはいえ)初心者にはわかりづらい、書きづらい。慣れるまではC++/Java的に書くほうがベター

2.1 プログラミング言語の選択と比較

関数型言語/プログラミングだとC/C++までの速度最適化はしづらい実行速度がやや落ちようとも、記述の綺麗さや見やすさを優先したいなら、関数型プ

ログラミング重視でOK(論文中での抽象的な記述との一致を図れるのもGOOD)

ソフトウェアが中規模以上になってくると「関数だけ」の構成は少し見辛い

クラスも使った方が大きなプログラムだと整理しやすい ? でもアルゴリズムは関数プログラミング的に作ると良い?※私もまだ正しい解が提供できず、今後議論したい点

Page 57: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

RとPython for データサイエンス

フリー、オープンソースで統計や機械学習の共有が: 1. まずはR言語で進む:研究者のプロトタイピング向け 2. その後、実際のデプロイ環境でも解析ルーチンを動かしたいので、Pythonにscikit-learn(これがゲームチェンジャー)などが登場 3. ビジネスでも使用者が多くなり、Webやカンファレンスなどでの情報共有が活発に ( = 統計、機械学習の初歩が学びやすくなっている)

日本では: 日本語のRの教科書が充実したこともあり、Rユーザーは多いが、Pythonによるデータサイエンスの人材はまだ少なめ

欧米では: scipyやPyDataなどのカンファレンスが毎年開かれ、既にWebやデータサイエンスの世界でPythonが使われている

57

2.2 Pythonを実際に研究に使ってみる

Page 58: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Pythonの機械学習系ツールと OpenCVを同時に使う

※「C++/OpenCVのMLモジュールに収録されているものしか機械学習を使いこなせない」とはなっていませんか??

58

2.2 Pythonを実際に研究に使ってみる

OpenCV Pythonインターフェース

scikit-learn

caffe+numpy/scipy

基本的な画像処理や 特徴量計算を担当

特徴量計算や認識モデル と評価(sciki-learn)

を担当

他pystruct

Page 59: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

例: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)

Page 60: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

PythonからOpenCVを使うメリット

• Pythonなのでインラタクティブに作業できる

• cv::Matの代わりに画像をNumpyのArray(2/3次元配列)として使用するので行列操作が(C++,Eigenライブラリなど)より楽に書ける

• Numpy経由で繋がる多くのPython科学計算ライブラリと連携可

• Matlab/Mathematicaライクな環境が全て無料で手に入る

• PythonをC言語のように入門言語として使うと、画像処理の初歩を短時間で身につけやすい

60

2.2 Pythonを実際に研究に使ってみる

Page 61: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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

Page 62: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

MatplotlibMatplotlib:Matlabやgnuplotのような図を、似たような関数 インターフェースを用いて作成できるPythonのplotライブラリ

62

2.2 Pythonを実際に研究に使ってみる

Page 63: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

Python+Matplotlibで 実験評価+可視化

メインのコードはC++などの場合も、実験結果を一旦保存して PythonとNumpyで精度評価計算+結果のグラフ化を実行

「開発はC++で引き続きやる!Pythonには移行しない!」という方や「Excel (+VBAやExcelの関数)で実験結果はまとめています」という方にもオススメ

OpenCV/C++ で実験を実施

Numpy,Pandasで 評価値を計算

実験結果のデータ (CSVファイル)

Matplotlibで 結果や評価値を

グラフ化これらがPythonに

移ることで、 サクサク試せて

やり直しも楽になる

63

2.2 Pythonを実際に研究に使ってみる

Page 64: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

例(機械学習):識別器の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を実際に研究に使ってみる

Page 65: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

チーム開発時には、リッチなIDEの恩恵を 受けながらコーディングしましょう

Emacs/Vimなどのコーディングエディタ(+コマンドライン)だけで開発する悪しき習慣はやめましょう!

画像系など専門性の高い(複雑で規模の大きなソフトウェア)のプログラミングにはIDEの助けが不可欠です

(一般的な開発では「チーム開発」で特に活きるのがIDE)

65

IDEの便利な機能を使わずに、勝つ自信がありますか? 「例:タブ補完、IDE上でのデバッグ、変数の状態確認

クラス構成全体の把握、バージョン管理とのエディタ連携」

2.3 開発テクニックを研究に生かす

Page 66: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

テスト

製品出荷前に行うテスト: 機能テスト 性能テスト

目的:テスト時に発生した不具合の修正を行うことで、設計した通りの 安定したソフトウェアシステムを世の中にリリースする

66

2.3 開発テクニックを研究に生かす

• 研究寄りのコードは、機能テストが「実験」の執筆である程度済む

• しかし「テスト」を行わない限りはコードの正しさは保証されない

• 研究段階では製品をリリースするわけではないので、たとえば「重要な関数だけ単体テストする」などがちょうど良さそう?(※研究レベルの複雑で長い処理に対して、細かいテストを全て実施するのは負荷があまりにも高い)

開発中に(こまめに)行うテスト 単体テスト

Page 67: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

テスト駆動開発(TDD)先にテストコードを書き、そのテストを通過するように、

設計してコードを書いていく手法

メリット: • テストが文章より正確な仕様になる(文書による曖昧な仕様定義を回避)

• 目標地点を提供する(※単体テストが全て通ればその関数は完成、など)

• 毎回テストを行う保証ができるので、ソフトウェアの安定性につながる

• c系の組み込み開発などにも威力を発揮。(言語やアルゴリズムが複雑なほど、テスト駆動が活きる)

67

2.3 開発テクニックを研究に生かす

Page 68: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

(デザイン)パターン/リファクタリング整理された簡潔なコードにこまめに保守することは、規模が大きいシステム/長期的に使うシステム/チームで開発・共有するシステムほど重要 (※一点物の小さいシステムではあまり気にしないでもOK)

研究活動の中での例:実験を終えて、論文を提出した => 3ヶ月後査読が返ってきて、コードを修正して追加実験を行うことに

A. 汚く長いコードの場合:読みづらくてコードの修正に時間がかかり、締め切りギリギリまで苦戦。

B. 綺麗で簡潔なコードの場合:速やかにコードを追加して短時間で 終了。

同時に、コメントや文書にコーディングした内容の説明を こまめにメモしておくことも大切

68

2.3 開発テクニックを研究に生かす

Page 69: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

「アジャイル」開発手法から エッセンスを学ぶ

「昨今のITシステム速い変化」に対応するために、 短期間にシステムを開発/変更するための開発戦略。

(XP, スクラム,リーン開発,かんばん)

69

※アジャイルは自己流での中途半端な導入は返って 混乱や非効率を及ぼす側面もあり、

本格導入にはきちんとした勉強が必要なことに注意

2.3 開発テクニックを研究に生かす

変化の激しいシステムを組んでいる人や 短期間でたくさん修正を加える場合は参考になる発想

Page 70: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

研究寄りのプロジェクトでは バージョン管理まで行うべき?

• Githubが流行しているので、研究専業の方々でもGit等で研究のコードをバージョン管理している方も多いかもしれませんが。。

• MatlabやPythonでのコードをへたにGitなどで管理するとオーバーヘッドが大きい!(REPLの恩恵が減ってしまう!)

• もちろん多人数開発(これが本来のバージョン管理の目的)ではバージョン管理しても良いかもしれませんが、プロトタインピング中や、REPLで試し試し行う段階では、バージョン管理はアイデア捻出の妨げになっている可能性もあることに注意

※一方で、テストする段階ではバージョン管理しておいた 方がベスト:テストとコードの対応も管理できるので

70

2.3 開発テクニックを研究に生かす

Page 71: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

ドキュメント、コード をチームで共有する

• ドキュメント化は大事 (開発の現場でとてもよく言われること) :アウトプットすることで本人の理解度アップ + その文書を元にチームで議論できる

• 問題点をいち早く見つけて対処しやすい

• ドキュメント化すると「そのチームの資産」となる(時間が経ってもどういった設計のソフトウァなのかが読み解ける)

• 共有する文書:プログラムのコード、論文(Mendeley等)、定例報告文書、IPythonノートブックなど

• 開発者がよく行うコードの共有、議論方法

• コードレビュー、ペアプログラミングなど

71

2.3 開発テクニックを研究に生かす

Page 72: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

開発者になりすぎないように!• 会場にいる皆様の多くは「研究者」なので、あくまで勝負するのは高い専門性と新規性です。開発手法は必要なところだけ賢く取り入れましょう

• 定期的に自分に問いかけてみる言葉:

• 「ソースコード管理なんて本当に必要??」

• 「テストをきちんと実施する必要ある??」

• 「皆Python等で研究しているようだけど、自分の問題の特性を考えると、C/C++で厳格なコードにしたほうがよいのでは?」

• 貴方の研究と開発のバランス次第で、実際の仕事に取り入れるべきエッセンスが変わります

72

2.3 開発テクニックを研究に生かす

Page 73: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

本日のtake home message• 前編

• コンピュータサイエンスではライブラリを使いこなして、(時には自分で使わずとも、中身を参考にして)更に高みを狙うことが重要。Python系まったく未知だったかは試してみてください。

• 後編

• プロトタイピング重要。「アイデアを生み出すためにはどうするか」を大切に

• 目的ごとにプログラミング言語を使い分ける

• 研究活動をしているとしてもチーム開発手法の各エッセンスは生かせる

• 最終的にはあなたの編み出すアルゴリズムや研究を大事にしましょう

• ツールに凝ることで効率性やグループ共有度が増せばその分、時間を有意義に確保することができ、たくさん論文も読むことができ、人と人のつながりや連携も増やせます

73

Page 74: コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi

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