Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

静岡Developers勉強会コンピュータビジョンvol2

6,954 views

Published on

  • Be the first to comment

静岡Developers勉強会コンピュータビジョンvol2

  1. 1. 実践コンピュータビジョン 第2章 画像の局所記述子
  2. 2. はじめに • 本資料は静岡Developers勉強会コンピュータビジョン vol.2のための資料です • オライリー社の実践コンピュータビジョン www.oreilly.co.jp/books/9784873116075/ (以降では教科書と呼びます) 第2章の説明です
  3. 3. はじめに <共通開発環境> • python 2.7 (3.x系では本書に沿わないのでNG) <私の開発環境> • pyCharm 3.1(IDEはあった方が便利です) • MacOSX 10.9.2 (Windows等でもOKです) ここは皆 えて! 参考までに…
  4. 4. はじめに • サンプルコードを実践コンピュータビジョンのHP( www.oreilly.co.jp/books/ 9784873116075/ )の関連ファイルタブからダウンロードしてください • 今回はサンプル コードを見たり 弄ったりして、 理解を進めます
  5. 5. はじめに • 使用する画像はwww.oreilly.co.jp/pub/ 9784873116075/index.htmlにリンクが貼られた pcv_data.zipにあるので、ダウンロードしてください
  6. 6. はじめに • 第1章までに必要なライブラリ (PIL,SciPy,NumPy,Matplotlib)は、第一回の資料 www.slideshare.net/motimune/ss-d 31241704?cmp_src=analytics&utm_source=anal ytics_dashboard&utm_medium=email&utm_camp aign=analytics_weekly_teaser&cmp_src_from=an alytics_weekly_teaser を参考にインポートしておいてください
  7. 7. 今日の目標 • 本資料を通して、以下のことを修得する • 画像から局所特徴量を抽出し、画像間の特徴点を対応づ けることが出来るようになる • 局所特徴量:Harris特徴量,SIFT特徴量 • マッチング:正規化相互相関,SIFTマッチング • 画像間の関係をPydotを用いてグラフ表示することが出来 るようになる
  8. 8. 第2章の目次 • 2.1 Harrisコーナー検出器 • 2.1.1 画像間の対応点を見つける • 2.2 SIFT • 2.2.1 特徴点 • 2.2.2 記述子 • 2.2.3 特徴点を検出する • 2.2.4 記述子を対応づける • 2.3 ジオタグ付きの画像を対応づける • 2.3.1 Panoramioからジオタグ付きの画像をダウンロードする • 2.3.2 局所記述子を使って対応づける • 2.3.3 関連画像を可視化する • 2.4 演習問題
  9. 9. 2.1 Harrisコーナー検出器 • 周辺に複数方向のエッジがある点=コーナーを検出 画像引用 http://d.hatena.ne.jp/nodamushi/20131206/1386355795 コーナー! エッジ
  10. 10. 2.1 Harrisコーナー検出器 • 周辺に複数方向のエッジがある点=コーナーを検出 ! ! ! • 一次微分ガウシアンフィルタが二階微分相当の物に 変換する処理になる ガウス分布などの重み行列 画像の勾配
  11. 11. 2.1 Harrisコーナー検出器 • ガウス関数を一次微分することでエッジ検出が行える ガウス関数 一次微分ガウス関数
  12. 12. 2.1 Harrisコーナー検出器 • の固有値( )に応じてコーナーか判定する • 実際は固有値を求めず以下の判別関数を使う ! • この判別関数が大きければ            コーナーとする ¯MI 1, 2 行列の判別式 行列の対角成分の和 画像引用 http://www.isl.titech.ac.jp/ nagahashilab/member/longb/iip/LectureNotes/lecture3.pdf
  13. 13. 2.1 Harrisコーナー検出器【実装】 後述する3つの関数を使用してコーナー検出する array:すべての要素は同一の型という     制限を持つリスト(のようなもの) 2.1 harris.py こんな結果が出ればOKです
  14. 14. • harris.pyを作り以下の関数を追加する 1. compute_harris_response 2. get_harris_points 3. plot_harris_points 2.1 Harrisコーナー検出器【実装】
  15. 15. 2.1 Harrisコーナー検出器【実装】 1. compute_harris_response
  16. 16. 2.1 Harrisコーナー検出器【実装】 1. compute_harris_response im : array 入力画像 sigma : ガウシアンフィルタ の標準偏差
  17. 17. 2.1 Harrisコーナー検出器【実装】 1. compute_harris_response Ix Iy Ixx
  18. 18. 2.1 Harrisコーナー検出器【実装】 1. compute_harris_response Ix Iy Ixx 各画素の    の値が格納された行列(Harris応答画像)が返り値(array)
  19. 19. 2.1 Harrisコーナー検出器【実装】 2. get_harris_points
  20. 20. 2.1 Harrisコーナー検出器【実装】 2. get_harris_points harrisim : Harris応答画像(array) min_dist : コーナーや画像境界から 分離する最小ピクセル数 threshold : 最大Harris応答値の 何倍をしきい値とす るかのパラメータ
  21. 21. 2.1 Harrisコーナー検出器【実装】 numpy.nonzero: 要素が0じゃない位置を返す 垂直方向(dim=0) 水平方向(dim=1) 0 1 1 0 1 0 0 1 0 入力画像 垂 直 方 向 水平方向 2. get_harris_points
  22. 22. 2.1 Harrisコーナー検出器【実装】 2. get_harris_points 画像境界付近を除外した領域内に おける候補点位置に1を立てる
  23. 23. 2.1 Harrisコーナー検出器【実装】 2. get_harris_points Harris応答値の大きい特徴点 から順に、見つけたコーナー の周囲min_dist内のコーナー を除外し(allowed_locations の要素を0にし)、 コーナー位置(x,y)を格納した 行列(array)を返り値とする
  24. 24. 2.1 Harrisコーナー検出器【実装】 3. plot_harris_points
  25. 25. 2.1 Harrisコーナー検出器【実装】 3. plot_harris_points image : 入力画像(array) filtered_coords : コーナー位置を格納した行列 (array(array(x,y))) 入力画像のコーナー位置に * を表示する
  26. 26. 2.1 Harrisコーナー検出器【実装】 前述した3つの関数を使用してコーナー検出する こんな結果が出ればOKです 2.1 harris.py min_dist=6 , threshold = 0.1
  27. 27. 2.1.1画像間の対応点を 見つける • 画像間の対応を見つける = 画像間で一致する特徴点を見つける そのためには…各特徴点の記述子どうしの比較が必要 →記述子の記述方法と類似度の評価方法を選択
  28. 28. 2.1.1画像間の対応点を 見つける • 教科書ではまず、Harrisコーナー点を使用した代表 的な方法を紹介している • 記述子:着目点中心の長方形画像パッチのグレー レベル • 類似度の評価方法:正規化相互相関
  29. 29. 2.1.1画像間の対応点を 見つける • 画像パッチ: • 画像パッチの相関: • 関数  は手法により異なる。正規化相互相関は ! !  値が大きいほど、類似度が高いと評価される。 I1(x) I2(x) f(.) 標準偏差 平均輝度値パッチのピクセル数
  30. 30. 2.1.1画像間の対応点を 見つける 後述する5つの関数を使用してコーナー検出する 2.1.1harris_match.py こんな結果が出ればOKです ※結果が出るまで5分くらい待つ
  31. 31. • harris.pyに以下の関数を追加する 1. get_descriptors 2. match 3. match_twosided 4. appendimages 5. plot_matches 2.1.1画像間の対応点を 見つける
  32. 32. 2.1.1画像間の対応点を 見つける
  33. 33. image : 入力画像 filtered_coords : コーナー位置を格納した行列 (array(array(x,y))) wid : 画像パッチの一辺の長さ(pix) 2.1.1画像間の対応点を 見つける
  34. 34. 2.1.1画像間の対応点を 見つける ネストしたリストをフラットにする 例:[[1,2],[3,4]] → [1,2,3,4] image : 入力画像 filtered_coords : コーナー位置を格納した行列 (array(array(x,y))) wid : 画像パッチの一辺の長さ(pix)
  35. 35. ネストしたリストをフラットにする 例:[[1,2],[3,4]] → [1,2,3,4] 一つのパッチの特徴量(輝度値)を一行に表現 したimage画像中のパッチのリスト image : 入力画像 filtered_coords : コーナー位置を格納した行列 (array(array(x,y))) wid : 画像パッチの一辺の長さ(pix) 2.1.1画像間の対応点を 見つける
  36. 36. 2.1.1画像間の対応点を 見つける
  37. 37. desc : パッチ特徴量のリスト threshold : ncc相関値のしきい値 2.1.1画像間の対応点を 見つける
  38. 38. desc : パッチ特徴量のリスト threshold : ncc相関値のしきい値 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 d d e s c 2 desc1 2.1.1画像間の対応点を 見つける
  39. 39. 2.1.1画像間の対応点を 見つける
  40. 40. desc : パッチ特徴量のリスト threshold : ncc相関値のしきい値 2.1.1画像間の対応点を 見つける
  41. 41. desc : パッチ特徴量のリスト threshold : ncc相関値のしきい値 例 : where(a > 5) a の要素が 5より大きな要素のindexを返す where(条件) : 条件を満たす要素のindexを返す 2.1.1画像間の対応点を 見つける
  42. 42. 2.1.1画像間の対応点を 見つける
  43. 43. 2画像間の行数を合わせるため、 少ない行の画像には0を詰める 2.1.1画像間の対応点を 見つける
  44. 44. 2画像間の行数を合わせるため、 少ない行の画像には0を詰める 2画像の結合 2.1.1画像間の対応点を 見つける
  45. 45. 2.1.1画像間の対応点を 見つける
  46. 46. 2画像間で対応する点間を線分でつなぐ 2.1.1画像間の対応点を 見つける
  47. 47. 先述した5つの関数を使用してコーナー検出する 2.1.1harris_match.py こんな結果が出ればOKです ※結果が出るまで5分くらい待つ 2.1.1画像間の対応点を 見つける
  48. 48. 2.1.1画像間の対応点を 見つける 問題点 ! • 正規化相互相関の、記述力が足らず誤対応が多い • スケールや回転に対して不変でない
  49. 49. 2.2 SIFT 局所画像特徴量の代表的な手法:SIFT SIFTは特徴点の検出と記述の両方を行う <SIFT特徴量> • スケール、回転、明度に不変な特徴量
  50. 50. SIFTの参考文献 [1]Lowe氏(SIFT開発者)の論文  http://www.cs.ubc.ca/ lowe/papers/ijcv04.pdf [2]藤吉先生による日本語論文 http://www.vision.cs.chubu.ac.jp/sift/PDF/ sift_tutorial.pdf 一度読むことをオススメします! 本資料もこの論文の図を引用します
  51. 51. SIFTアルゴリズム SIFTアルゴリズムは以下の4ステップで行う 1. スケールとキーポイントの検出 2. キーポイントのローカライズ 3. オリエンテーションの算出 4. 特徴量の記述 検出 記述
  52. 52. 1. 複数の  に対するDoG(Difference of gaussian)画像を生成する スケールとキーポイントの検出 平滑化画像 入力画像 DoG画像 ガウス関数
  53. 53. 2. 注目画素と26近傍を比較し、極大値の画素をキーポ イント候補点として検出する。これを  の小さなDoG 画像から順に行う 特徴を最も含むスケール を自動で決めるため、拡大、 縮小に不変な特徴量となる スケールとキーポイントの検出
  54. 54. 2.2.2 記述子 • また、特徴点の勾配方向から、特徴点の方向を求める。 これにより回転不変の特徴量になる • これ以上の説明は教科書の範囲を超えるので割愛
  55. 55. VLFeatのインストール 2.2.3sift.pyを実行するにはVLFeatが必要 <Windows> HP(http://www.vlfeat.org/)に行きダウンロードする フォルダ(vlfeat-0.9.18)のsift.exeとvl.dllを 2.2.3sift.pyと同じディレクトリに置く ! <Mac> HPに行きダウンロードする フォルダ(vlfeat-0.9.18)下のMaci64フォルダ下の siftとlibvl.dylibを2.2.3sift.pyと同じディレクトリに置く sift.pyの18行目のstr( sift …) -> str( ./sift )に変更する !
  56. 56. 2.2.3 特徴点を検出する 後述する4つの関数を使用してSIFT特徴点を検出する 2.2.3 sift.py こんな結果が出ればOKです
  57. 57. 2.2.3 特徴点を検出する • sift.pyに以下の関数を追加 1. process_image 2. read_features_from_file 3. write_features_to_file 4. plot_features
  58. 58. 2.2.3 特徴点を検出する 1. process_image
  59. 59. 2.2.3 特徴点を検出する 1. process_image imagename : 入力画像の名前 resultname : 出力画像の名前 params :SIFTパラメータ
  60. 60. 2.2.3 特徴点を検出する 2. read_features_from_file !
  61. 61. 2.2.3 特徴点を検出する 2. read_features_from_file ! filename(.sift) 第一列から順に xの座標値 yの座標値 スケール 回転角度記述子の情報(128次元) 特徴点の位置、スケール、回転情報
  62. 62. 2.2.3 特徴点を検出する 3. write_features_to_file
  63. 63. 2.2.3 特徴点を検出する 3. write_features_to_file
  64. 64. 2.2.3 特徴点を検出する 4. plot_features
  65. 65. 2.2.3 特徴点を検出する 4. plot_features 特徴点のスケール
  66. 66. 2.2.3 特徴点を検出する 先述した4つの関数を使用してSIFT特徴点を検出する 2.2.3 sift.py こんな結果が出ればOKです
  67. 67. 2.2.4 記述子を対応づける 後述する4つの関数を使用してコーナー検出する 2.2.4 sift_match.py こんな結果が出ればOKです
  68. 68. 2.2.4 記述子を対応づける • sift.pyに以下の関数を追加する 1. match 2. match_twosided 3. appendimages (harris.pyから移植) 4. plot_matches (harris.pyからほぼ移植)
  69. 69. 2.2.4 記述子を対応づける 1. match
  70. 70. 2.2.4 記述子を対応づける 1. match 内積のarccosが小さい = 特徴量が似ている
  71. 71. 2.2.4 記述子を対応づける 2. match_twosided
  72. 72. 2.2.4 記述子を対応づける 3. appendimages
  73. 73. 2.2.4 記述子を対応づける 4. plot_matches harris.pyとの変更点
  74. 74. 2.2.4 記述子を対応づける 先述した4つの関数を使用してコーナー検出する 2.2.4 sift_match.py こんな結果が出ればOKです
  75. 75. 2.3 ジオタグ付きの画像を 対応づける • ジオタグ:撮影場所の付加情報 • Panoramio:Googleの画像共有サービス • APIが用意されており             プログラムから                アクセス可能
  76. 76. 2.3.1 Panoramioからジオタグ付きの 画像をダウンロードする • urllib.urlopen()で以下のURLを指定してオブジェ クトを読み込む • http://www.panoramio.com/map/get_panoramas.php?order=popularity& set=public&from=0&to=20&minx=-77.037564&miny=38.896662& maxx=-77.035564&maxy=38.898662&size=medium' • ! !!!!!!!!!!!!!!! •ホワイトハウスを中心 0.001の範囲にある画像を、 人気度の高いものから 20 個取得する 人気度順 先頭から20番 目まで選ぶ 最小経度 最小緯度最大経度 最大緯度
  77. 77. 2.3.1 Panoramioからジオタグ付きの 画像をダウンロードする • 結果はJSON形式で得られる • python2.6以上は標準でjson形式が扱える
  78. 78. 2.3.1 Panoramioからジオタグ付きの 画像をダウンロードする simplejsonじゃなくて標準jsonを使用します
  79. 79. 2.3.1 Panoramioからジオタグ付きの 画像をダウンロードする • 実行すると、panoramioフォルダにダウンロードした画像が保存される
  80. 80. 2.3.2 局所記述子を使って 対応づける • 画像からSIFT記述子を抽出して.siftファイルに保存 する • その後、すべてのsiftファイルの組み合わせで特徴 点のマッチングを行い、相互マッチした数を保存す る
  81. 81. 2.3.2 局所記述子を使って 対応づける
  82. 82. 2.3.2 局所記述子を使って 対応づける (画像名前).siftというファイルに (画像名前)のsift特徴量リストを 作成する
  83. 83. 2.3.2 局所記述子を使って 対応づける panoramioフォルダ下の画像数 の正方行列を作成
  84. 84. 2.3.2 局所記述子を使って 対応づける その正方行列に、相互マッチし た特徴点の数を格納
  85. 85. 2.3.2 局所記述子を使って 対応づける panoramio_matchscores.pklに 結果をダンプする
  86. 86. 2.3.2 局所記述子を使って 対応づける 2.3.2 pano_sift_matchを実行すると、panoramioフォルダ下に 各画像の特徴量を記述した.siftファイルが作成される
  87. 87. 2.3.2 局所記述子を使って 対応づける また、2.3.2 pano_sift_matchを実行すると、各画像間の相関値を 記述したpanoramio_matchscores.pklファイルが作成される
  88. 88. 2.3.2 局所記述子を使って 対応づける • 単純な画像間の距離を用いて、 見た目が似た画像同士を結びつ ける ある画像群のmatchscores行列
  89. 89. 2.3.3 関連画像を可視化する • 似たもの同士の画像を図 のように結びつけて表示 したい • 描画ライブラリGraphvis のPythonインターフェー ス:Pydotを使う
  90. 90. 2.3.3 関連画像を可視化する Pydotを使用するには… graphvizとpygraphvizとpyparsing(1.x系)をインストールしたあとにPaydotをインストール (※pyparsingには2.xと1.x系がある。Pydotを使うには1.x系のpyparsingを使う必要がある。) ! < Macでpipを使用してPydotをインストールする方法 > sudo pip uninstall pyparsing #すでに2.x系が入っている人はアンインストール sudo pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/ pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709 brew install graphviz sudo pip install pygraphviz sudo pip install pydot ! ———————————————————————————- ! 2.x系だと(pip install pyparsingとすると標準でインストールされる)以下のエラーが発生する。 >>> import pydot Couldn't import dot_parser, loading of dot files will not be possible.
  91. 91. 2.3.3 関連画像を可視化する < WindowsやMacでpipを使用せずPydotをインストールする方法 > 以下のサイトでダウンロードおよびインストールしてください • Pydotパッケージ(http://code.google.com/p/pydot/)! • Pyparsing(http://pyparsing.wikispaces.com/)! • GraphViz (http://www.graphviz.org/)
  92. 92. 2.3.3 関連画像を可視化する • (ここでジオタグ画像から離れて…)Pydotの描画例 • 深さ2,5つの枝ノードをもつグラフ
  93. 93. 2.3.3 関連画像を可視化する
  94. 94. 2.3.2でダンプした panoramio_matchscores.pklを読み込む 2.3.3 関連画像を可視化する
  95. 95. グラフ化した画像をwhitehouse.pngという 名前で保存する 2.3.3 関連画像を可視化する
  96. 96. 2.3.3 関連画像を可視化する 2.3.3 pano_pydot.pyを実行すると、各画像間の相関値を記述した panoramio_matchscores.pklを読み込み画像間の関係をグラフィ カルに表示した画像whitehouse.pngが作成される
  97. 97. 本日習得したこと • 画像から局所特徴量を抽出し、画像間の特徴点を対 応づけることが出来るようになった • 局所特徴量:Harris特徴量,SIFT特徴量 • マッチング:正規化相互相関,SIFTマッチング • 画像間の関係をPydotを用いてグラフ表示すること が出来るようになった
  98. 98. 今後の展望 • 本章で習得した局所特徴量の抽出方法および画像間 のマッチング手法を用いて、第3章のパノラマ画像 の作成や、ロバストなホモグラフィー推定を行う。 また第4章のカメラキャリブレーションやARにも 応用する。
  99. 99. 演習問題 • 時間のある人だけ挑戦してください
  100. 100. 演習問題 2.4.1 • Harrisコーナー点を対応づける関数を変更して、点の間の 最大距離を指定できるようにし、対 応づけをよりロバス トにしてください。
  101. 101. 演習問題 2.4.2 画像のぼかし(もしくはROFによるノイズ除去)を徐々に強く しながら、Harrisコーナーを抽 出してください。どのように なりますか?
  102. 102. 演習問題 2.4.3 • Harris以外のコーナー検出器に、FASTコーナー検出器と いうものがあります。すべてPython で書かれたもの(http:// www.edwardrosten.com/work/fast.html)など、その実装は たくさんあ ります。この検出器を試して、感度の閾値を セットし Harris コーナーと比較してください。
  103. 103. 演習問題 2.4.4 • 異なる解像度で画像のコピーを作ってください(例 えば、何倍かに拡大します)。それぞれの画 像から SIFT 特徴量を抽出してください。特徴点の対応を 描画し、スケールに対する不変性が 破たんする状 況を確認してください。
  104. 104. 演習問題 2.4.5 • VLFeatのコマンドラインツールには、 MSER(Maximally Stable Extremal Regions)と い う 領 域 検 出 器 の 実 装 も 含 ま れ て い ま す(http://en.wikipedia.org/wiki/ Maximally_stable_ extremal_regions)。MSER 領域を抽出し、--read-frames オプションを使っ て SIFT 記述 子計算処理に渡す関数と、楕円領域 を描画する関数を作ってください。
  105. 105. 演習問題 2.4.6 • 2枚の画像間の特徴点を対応づけ、その対応に基づ いて、スケールの違いや平面内での回転を 推定す る関数を作ってください。
  106. 106. 演習問題 2.4.7 • ホワイトハウスの例のように、選んだ場所の画像を ダウンロードして対応づけしてください。 画像を 関連づけるよい指標を見つけられますか? 地理上の 代表画像を選ぶために、グラフ構 造は使えそうで すか?

×