Python in Computer Vision
片岡 裕雄
http://www.hirokatsukataoka.net/
概要
•  対象
–  CV + Python初学者
–  画像認識の初心者
•  短時間で学んだPythonの知識を記載
–  Pythonの導入
–  アルゴリズムと実装
•  CV + ML周辺に特化
–  さらに言うと,認識寄りのお話です
–  特徴取得: HOG, SIFT
–  クラスタリング: K-means, Affinity Propagation, GMM, DP-GMM
–  コードワード化: Bag-of-words (BoW), Fisher Vector
–  識別器: SVM
Pythonの導入
Windows
•  WindowsでAnaconda, OpenCVを導入
–  Anacondaを導入
•  http://continuum.io/downloads
–  AnacondaにSpyderがIDEとして提供されているのでこれを使用
–  opencv.orgのページからOpenCVをインストール
•  http://opencv.org/
–  OpenCVをAnacondaで使用できるようにする(.pyd, .pyファイルの移動)
•  *opencvbuildpython2.7x64cv.pyd
•  *opencvsourcesmodulespythonsrc2cv.py
•  の2つを*userAnacondaLibssite-packages のフォルダにコピー
※ *はopencvやAnacondaをインストールして生成したフォルダです
Mac
•  Mac OS XでAnaconda, OpenCVを導入
–  Anacondaを導入
•  http://continuum.io/downloads
–  AnacondaにSpyderがIDEとして提供されているのでこれを使用
•  AnacondaのフォルダにLauncherがある
–  condaコマンドでOpenCVをインストール
•  conda install -c https://conda.binstar.org/jjhelmus opencv
•  その他パッケージはBinstarページにて
•  https://binstar.org/search?type=conda&q=opencv
現在の環境
•  Python開発環境
–  Anaconda:Python環境
–  Spyder:エディタ,コンパイラ,デバッガが含まれる統合開発環境
–  OpenCV:画像処理ライブラリ
–  Anacondaに含まれるパッケージ
•  scikit-learn:機械学習ライブラリ
•  scikit-image:python画像処理ライブラリ
•  numpy, Scipy:科学技術計算,行列演算
•  その他:http://docs.continuum.io/anaconda/pkg-docs.html
アルゴリズムの実装
特徴取得:HOG
•  物体形状を把握する特徴量
–  [Dalal, CVPR2005]にて,歩行者の形状を記述
–  歩行者検出のパイオニアとしてその後の研究に寄与
【Python Sample】
HOGによる特徴表現
http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdft
[3, 4] W, Hが縦横ピクセル数
[6] HOGの構造体確保, 入力画像サイズのみしか設定出来ない, 他はセルやブロックサイズ
[7] 画像のロード
[8] hog_vecにHOG特徴量を格納
特徴取得:SIFT
•  回転や大小に対応する特徴点検出・特徴量記述
–  [Lowe, ICCV1999]にて提案, [Lowe, IJCV2004]にて改良
–  特徴点検出・特徴取得の決定版としてCV界に貢献
【Python Sample】
SIFTによる画像マッチング
http://www.cs.ubc.ca/~lowe/keypoints/
[4, 5] 画像を読み込み,グレースケール化
[7] SIFTの構造体確保
[8] キーポイント(kp),特徴量(des)の取得
[10] 画像にキーポイントを描画 (例:右図)
特徴取得参考
–  HOG OpenCV document
•  http://docs.opencv.org/modules/gpu/doc/object_detection.html
–  SIFT OpenCV document
•  http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_sift_intro/
py_sift_intro.html
クラスタリング:K-Means
•  K(=クラス数)を設定して自動でクラス分け
–  クラスタリングの代表例
–  scikit-learnに実装
–  Kを自分で設定する必要がある
【Python Sample】
[4] 特徴空間にてK-meansクラスタリング, n_clusters:クラス数, max_iter: 最大繰り返し回数
features: クラスタリング対象の特徴ベクトルの集合
[6] 各ベクトルの所属ラベルを返却
[7] 各ベクトルの最近傍centroidからの距離を返却
クラスタリング:Affinity Propagation
•  クラス数も自動で設定可能なクラスタリング法
–  クラス数を勝手に決めてくれる
–  scikit-learnに実装
【Python Sample】
[4] 特徴空間にてAffinity Propagation, features: クラスタリング対象の特徴ベクトルの集合
[6] 各ベクトルの所属ラベルを返却
[7] クラスタ数を返却
クラスタリング:GMM
•  ガウス分布の混合を仮定するモデル
–  Gaussian Mixture Model (GMM)によるクラスタリング
–  DP (ディリクレ過程)によるクラスタ数自動決定法も存在
–  scikit-learnに実装
【Python Sample】
[4] GMMモデルを生成, n_components: 混合数,covariance_type: 共分散タイプの引数
[6] 特徴空間XにてGMMクラスタリング
[7] DP-GMMモデルを生成 ※DP: Dirichlet Process (ディリクレ過程)
[8] 特徴空間XにてDP-GMMクラスタリング
クラスタリング参考
–  scikit-learn clustering
•  http://scikit-learn.org/stable/modules/clustering.html#clustering
コードワード化:Bag-of-words (BoW)
•  画像をワード(visual word)の集合体として表現
【実装例】
–  特徴点検出 + 特徴ベクトル取得
–  K-meansクラスタリング
–  特徴点検出と,特徴ベクトルの割り当て
–  ベクトル取得
Class: human
Keypoint detection &
Feature description
コードワード化:Bag-of-words (BoW)
•  SIFT特徴量とK-meansクラスタリングで実装
【Python Sample】
[5] K-meansのKの数を設定(K=“次元数”=100)
[6] BoWベクトルを初期化(“次元数” = 100)
[7] グレースケールで画像をロード
[9-12] SIFT特徴量を計算,各特徴ベクトルに対して対応するクラスタを推定
kmeans_modelは予めフィッティングさせておき,.predict()によりクラスタ推定
[14] BoWベクトルを正規化
コードワード化:Fisher Vector
•  フィッシャーカーネルを用いて特徴を高次元化
–  [Perronnin, CVPR2007]にて提案,[Perronnin, ECCV2010]にて改良
–  特徴ベクトル集合をGMMにてクラスタリング
–  フィッシャーカーネルにより特徴表現
•  ガウス分布の重み(w),平均(µ),分散(σ) により特徴表現
–  Power Normalization (パワー正規化)
–  L2 Normalization (L2正規化)
–  実装はJacobさんにゆずります
•  http://jacobcv.blogspot.jp/2014/12/fisher-vector-in-python.html
•  Fisher VectorのPythonコードをgit上にて公開
fisher.py
•  要点のみ(簡単に)解説
def load_gmm(folder = “”)
•  .npyファイル(重み,平均,分散)の読み込み
def generate_gmm(input_folder, N)
•  画像の存在するフォルダとガウス分布の混合数を設定
•  画像から特徴抽出(SIFT)してGMMによりフィッティング
def fisher_features(folder, gmm)
•  フォルダ,GMMモデルを設定
•  画像からSIFTの特徴ベクトルを取得,Fisher Vectorを計算
Fisher Vector取得後,識別を実行
※注意:multivariate_normalがSciPy 0.14.0以降に追加されたので,それ以降のパッ
ケージを使用してください
コードワード化参考
–  Fisher Vector [CVPR2007]
•  http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4270291&tag=1
–  Jacob’s Computer Vision and Programming Blog
•  http://jacobcv.blogspot.jp/2014/12/fisher-vector-in-python.html
識別器:SVM
•  SVMによる識別,交差検証(Cross-validation)
【Python Sample】
[6, 7] テキストからサンプルとラベルをロード
[9] サンプルとラベルをテストと学習に分割
[11] SVMのモデルを設定
[12] 交差検証により精度を算出(cv=5は5交差検証)
[14, 15] 各試行の精度とその平均値を表示
識別器の参考
–  SVM scikit-learn
•  http://scikit-learn.org/stable/modules/svm.html
–  Cross-validation scikit-learn
•  http://scikit-learn.org/stable/modules/cross_validation.html
まとめ
•  Pythonの導入から短期間で画像認識を実装
–  特徴取得
–  クラスタリング
–  コードワード化
–  識別器
•  コンピュータビジョンは難しくない!
–  Pythonのおかげで簡単に始められる
–  研究者も簡単にアルゴリズムを試せる

PythonによるCVアルゴリズム実装

  • 1.
    Python in ComputerVision 片岡 裕雄 http://www.hirokatsukataoka.net/
  • 2.
    概要 •  対象 –  CV+ Python初学者 –  画像認識の初心者 •  短時間で学んだPythonの知識を記載 –  Pythonの導入 –  アルゴリズムと実装 •  CV + ML周辺に特化 –  さらに言うと,認識寄りのお話です –  特徴取得: HOG, SIFT –  クラスタリング: K-means, Affinity Propagation, GMM, DP-GMM –  コードワード化: Bag-of-words (BoW), Fisher Vector –  識別器: SVM
  • 3.
  • 4.
    Windows •  WindowsでAnaconda, OpenCVを導入 – Anacondaを導入 •  http://continuum.io/downloads –  AnacondaにSpyderがIDEとして提供されているのでこれを使用 –  opencv.orgのページからOpenCVをインストール •  http://opencv.org/ –  OpenCVをAnacondaで使用できるようにする(.pyd, .pyファイルの移動) •  *opencvbuildpython2.7x64cv.pyd •  *opencvsourcesmodulespythonsrc2cv.py •  の2つを*userAnacondaLibssite-packages のフォルダにコピー ※ *はopencvやAnacondaをインストールして生成したフォルダです
  • 5.
    Mac •  Mac OSXでAnaconda, OpenCVを導入 –  Anacondaを導入 •  http://continuum.io/downloads –  AnacondaにSpyderがIDEとして提供されているのでこれを使用 •  AnacondaのフォルダにLauncherがある –  condaコマンドでOpenCVをインストール •  conda install -c https://conda.binstar.org/jjhelmus opencv •  その他パッケージはBinstarページにて •  https://binstar.org/search?type=conda&q=opencv
  • 6.
    現在の環境 •  Python開発環境 –  Anaconda:Python環境 – Spyder:エディタ,コンパイラ,デバッガが含まれる統合開発環境 –  OpenCV:画像処理ライブラリ –  Anacondaに含まれるパッケージ •  scikit-learn:機械学習ライブラリ •  scikit-image:python画像処理ライブラリ •  numpy, Scipy:科学技術計算,行列演算 •  その他:http://docs.continuum.io/anaconda/pkg-docs.html
  • 7.
  • 8.
    特徴取得:HOG •  物体形状を把握する特徴量 –  [Dalal,CVPR2005]にて,歩行者の形状を記述 –  歩行者検出のパイオニアとしてその後の研究に寄与 【Python Sample】 HOGによる特徴表現 http://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdft [3, 4] W, Hが縦横ピクセル数 [6] HOGの構造体確保, 入力画像サイズのみしか設定出来ない, 他はセルやブロックサイズ [7] 画像のロード [8] hog_vecにHOG特徴量を格納
  • 9.
    特徴取得:SIFT •  回転や大小に対応する特徴点検出・特徴量記述 –  [Lowe,ICCV1999]にて提案, [Lowe, IJCV2004]にて改良 –  特徴点検出・特徴取得の決定版としてCV界に貢献 【Python Sample】 SIFTによる画像マッチング http://www.cs.ubc.ca/~lowe/keypoints/ [4, 5] 画像を読み込み,グレースケール化 [7] SIFTの構造体確保 [8] キーポイント(kp),特徴量(des)の取得 [10] 画像にキーポイントを描画 (例:右図)
  • 10.
    特徴取得参考 –  HOG OpenCVdocument •  http://docs.opencv.org/modules/gpu/doc/object_detection.html –  SIFT OpenCV document •  http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_sift_intro/ py_sift_intro.html
  • 11.
    クラスタリング:K-Means •  K(=クラス数)を設定して自動でクラス分け –  クラスタリングの代表例 – scikit-learnに実装 –  Kを自分で設定する必要がある 【Python Sample】 [4] 特徴空間にてK-meansクラスタリング, n_clusters:クラス数, max_iter: 最大繰り返し回数 features: クラスタリング対象の特徴ベクトルの集合 [6] 各ベクトルの所属ラベルを返却 [7] 各ベクトルの最近傍centroidからの距離を返却
  • 12.
    クラスタリング:Affinity Propagation •  クラス数も自動で設定可能なクラスタリング法 – クラス数を勝手に決めてくれる –  scikit-learnに実装 【Python Sample】 [4] 特徴空間にてAffinity Propagation, features: クラスタリング対象の特徴ベクトルの集合 [6] 各ベクトルの所属ラベルを返却 [7] クラスタ数を返却
  • 13.
    クラスタリング:GMM •  ガウス分布の混合を仮定するモデル –  GaussianMixture Model (GMM)によるクラスタリング –  DP (ディリクレ過程)によるクラスタ数自動決定法も存在 –  scikit-learnに実装 【Python Sample】 [4] GMMモデルを生成, n_components: 混合数,covariance_type: 共分散タイプの引数 [6] 特徴空間XにてGMMクラスタリング [7] DP-GMMモデルを生成 ※DP: Dirichlet Process (ディリクレ過程) [8] 特徴空間XにてDP-GMMクラスタリング
  • 14.
    クラスタリング参考 –  scikit-learn clustering • http://scikit-learn.org/stable/modules/clustering.html#clustering
  • 15.
    コードワード化:Bag-of-words (BoW) •  画像をワード(visualword)の集合体として表現 【実装例】 –  特徴点検出 + 特徴ベクトル取得 –  K-meansクラスタリング –  特徴点検出と,特徴ベクトルの割り当て –  ベクトル取得 Class: human Keypoint detection & Feature description
  • 16.
    コードワード化:Bag-of-words (BoW) •  SIFT特徴量とK-meansクラスタリングで実装 【PythonSample】 [5] K-meansのKの数を設定(K=“次元数”=100) [6] BoWベクトルを初期化(“次元数” = 100) [7] グレースケールで画像をロード [9-12] SIFT特徴量を計算,各特徴ベクトルに対して対応するクラスタを推定 kmeans_modelは予めフィッティングさせておき,.predict()によりクラスタ推定 [14] BoWベクトルを正規化
  • 17.
    コードワード化:Fisher Vector •  フィッシャーカーネルを用いて特徴を高次元化 – [Perronnin, CVPR2007]にて提案,[Perronnin, ECCV2010]にて改良 –  特徴ベクトル集合をGMMにてクラスタリング –  フィッシャーカーネルにより特徴表現 •  ガウス分布の重み(w),平均(µ),分散(σ) により特徴表現 –  Power Normalization (パワー正規化) –  L2 Normalization (L2正規化) –  実装はJacobさんにゆずります •  http://jacobcv.blogspot.jp/2014/12/fisher-vector-in-python.html •  Fisher VectorのPythonコードをgit上にて公開
  • 18.
    fisher.py •  要点のみ(簡単に)解説 def load_gmm(folder= “”) •  .npyファイル(重み,平均,分散)の読み込み def generate_gmm(input_folder, N) •  画像の存在するフォルダとガウス分布の混合数を設定 •  画像から特徴抽出(SIFT)してGMMによりフィッティング def fisher_features(folder, gmm) •  フォルダ,GMMモデルを設定 •  画像からSIFTの特徴ベクトルを取得,Fisher Vectorを計算 Fisher Vector取得後,識別を実行 ※注意:multivariate_normalがSciPy 0.14.0以降に追加されたので,それ以降のパッ ケージを使用してください
  • 19.
    コードワード化参考 –  Fisher Vector[CVPR2007] •  http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4270291&tag=1 –  Jacob’s Computer Vision and Programming Blog •  http://jacobcv.blogspot.jp/2014/12/fisher-vector-in-python.html
  • 20.
    識別器:SVM •  SVMによる識別,交差検証(Cross-validation) 【Python Sample】 [6,7] テキストからサンプルとラベルをロード [9] サンプルとラベルをテストと学習に分割 [11] SVMのモデルを設定 [12] 交差検証により精度を算出(cv=5は5交差検証) [14, 15] 各試行の精度とその平均値を表示
  • 21.
    識別器の参考 –  SVM scikit-learn • http://scikit-learn.org/stable/modules/svm.html –  Cross-validation scikit-learn •  http://scikit-learn.org/stable/modules/cross_validation.html
  • 22.
    まとめ •  Pythonの導入から短期間で画像認識を実装 –  特徴取得 – クラスタリング –  コードワード化 –  識別器 •  コンピュータビジョンは難しくない! –  Pythonのおかげで簡単に始められる –  研究者も簡単にアルゴリズムを試せる