O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Hough forestを用いた物体検出

5.051 visualizações

Publicada em

Hough forestを用いた物体検出

Publicada em: Tecnologia
  • Seja o primeiro a comentar

Hough forestを用いた物体検出

  1. 1. 1 Hough Forestを用いた物体検出 http://mprg.jp/tutorials/hough-forest 機械知覚&ロボティクス研究グループ(中部大学) 中部 工学 助手 中部大学 工学部 情報工学科 講師 大学 部 ロボット理工学科 中部大学 工学部 ロボット理工学科 助手 山内 悠嗣 機械知覚&ロボティクスグル 487-8501 愛知県春日井市松本町120 Tel 0568-51-8249 Fax 0568-51-9409 yuu@vision.cs.chubu.ac.jp http://vision.cs.chubu.ac.jp MACHINE PERCEPTION AND 中部大学 工学部 情報工学科 講師 山下 隆義 機械知覚&ロボティクスグループ 487-8501 愛知県春日井市松本町1200 Tel 0568-51-9670 Fax 0568-51-1540 yamashita@cs.chubu.ac.jp http://vision.cs.chubu.ac.jp 博士(工学) MACHINE PERCEPTION AND ROBOTICS GROUP 中部大学 工学部 ロボット理工学科 教授 藤吉 弘亘 機械知覚&ロボティクスグループ 487-8501 愛知県春日井市松本町1200 Tel 0568-51-9096 Fax 0568-51-9409 hf@cs.chubu.ac.jp http://vision.cs.chubu.ac.jp 博士(工学) MACHINE PERCEPTION AND ROBOTICS GROUP
  2. 2. Hough Forestを用いた物体検出 1. 前処理 ‒ 学習用画像の生成 2. Hough Forestの学習 ‒ 学習用画像の入力, パッチの切り出し ‒ 決定木の構築 3. Hough Forestによる検出 ‒ テスト画像の入力 – 決定木を用いた投票処理 ‒ 検出ウィンドウの統合 4. ソースコード詳細 2
  3. 3. 前処理 • Hough Forestを用いて物体検出を行うために
 学習画像を生成する ‒ 物体を検出する際に想定される姿勢の画像を準備する必要あり 3 アルゴリズム解説
  4. 4. • ダウンロード先 ‒ URL : http://vision.cs.chubu.ac.jp/MPRG/SRC/ HoughForest/makeRotateImage.zip • 作成環境 ‒ Visual Studio Ver. 2010, C++ ,OpenCV2.4.3 ソースコード 4
  5. 5. フォルダ構造 • 学習画像生成プログラムのフォルダ構造 5 フォルダ構造 makeRotateImage.sln makeRotateImage/ image/ dst/ src/ makeRotateImage/ inPos/ inNeg/ outPos/ outNeg/ 入力画像の配置先 出力画像の保存先
  6. 6. • 1枚の物体画像から学習用画像を生成 – 入力画像を回転して切り出し – プログラム:makeRotateImage • 物体の重心が画像の中心になるよう撮影された画像を入力 • 360度回転し切り出した画像を出力 – 入力画像からトリミングするため出力画像は縮小 – 回転角度は変更可能(デフォルトでは10度刻みで回転) 学習用画像の生成 6 ・・・ 入力画像 生成される学習用画像 0度 10度 20度 360度 0.bmp 1.bmp 2.bmp 35.bmp画像中心 アルゴリズム解説 36枚
  7. 7. 学習用画像の生成 • 入力画像:指定したフォルダ内に配置 ‒ 物体重心が画像の中心になるよう撮影 ‒ 入力する画像の枚数に合わせてIMG_NUMを変更 • 入力画像名は0始まりの連番 例: 0.jpg 1.jpg … 9.jpg 10.jpg • 画像の形式によってIMAGE_TYPEを変更(デフォルトは jpg) • 出力画像:指定したフォルダ内に連番で書き出し ‒ ANGLE_STEPで指定したずらし幅でANGLEで指定した度数
 まで回転 ‒ 画像形式はpngで固定 7 プログラム解説
  8. 8. 共通設定(1/5) 1. ダウンロードしたソリューション(.sln)を開く ‒ VS2010にてプログラムを作成しているためVS2013の場合
 ソリューションのアップデートが始まります • 完了したら次へ 8 作業手順の解説 注意:今回はVS2010(64bit版)を対象
  9. 9. 共通設定(2/5) 2. OpenCVを使用するためパスを通す ‒ メニューバーのプロジェクトから「プロパティ」を開く ‒ 構成プロパティを一度クリック 9 作業手順の解説
  10. 10. 共通設定(3/5) ‒ 構成(C):「アクティブ」から「すべての構成」に変更 ‒ 「C/C++」の全般の「追加のインクルードディレクトリ」に
 使用するOpenCVのincludeフォルダを指定 10 作業手順の解説
  11. 11. 共通設定(4/5) ‒ 「リンカー」の全般の「追加のライブラリディレクトリ」に
 使用するOpenCVのlibフォルダを指定 ‒ 2013の場合 opencv2.49/build/x64/vc12/libで動作します 11 作業手順の解説
  12. 12. ‒ includeCV.h内で必要なライブラリを読み込んでいるので
 ライブラリのリンクを設定する必要は無し • ただしopencvのバージョンを変更した場合「249」を
 バージョンに合わせて変更して下さい
 共通設定(5/5) 12 作業手順の解説
  13. 13. 前準備:作業手順 1. 入力画像を指定のフォルダに配置 ‒ 指定フォルダ:inPos/, inNeg/ • 今回はあらかじめ配置されております 2. パラメータの設定 ‒ 設定の必要があるパラメータ ‒ 今回はデフォルトのままでOK 3. 実行 ‒ 出力保存先フォルダoutPos/, outNeg/にそれぞれ
 連番画像が生成されていれば実行完了 13 作業手順の解説 #define POS_IMG_NUM 1 //ポジティブ画像枚数 #define NEG_IMG_NUM 2 //ネガティブ画像枚数 #define ANGLE 360 //回転角度 #define ANGLE_STEP 10 //回転角のずらし幅 #define RESIZE 400 //切り出し後の画像サイズ
  14. 14. Hough Forestを用いた物体検出 1. 前処理 ‒ 学習用画像の生成 2. Hough Forestの学習 ‒ 学習用画像の入力, パッチの切り出し ‒ 決定木の構築 3. Hough Forestによる検出 ‒ テスト画像の入力 – 決定木を用いた投票処理 ‒ 検出ウィンドウの統合 4. ソースコード詳細 14
  15. 15. Hough Forestの学習 1. 学習用画像の入力とパッチ画像の作成 ‒ 特徴量の算出: HOG特徴量 2. 決定木の構築 ‒ 分岐関数の設計 ‒ 末端ノードの作成 15 アルゴリズム解説
  16. 16. ソースコード • ダウンロード先 ‒ URL : http://vision.cs.chubu.ac.jp/MPRG/SRC/ HoughForest/HoughForest.zip • 作成環境 ‒ Visual Studio Ver. 2010, C++ ,OpenCV2.4.3 • プログラムの構成 ‒ 学習, 認識のプログラムが統合 • common.h #define MODEを1に設定で
 学習プログラムが動作 16
  17. 17. フォルダ構造 • HoughForestの学習プログラムのフォルダ構造 17 フォルダ構造 src/ 入力画像の配置先 学習結果の保存先 HoughForest/ HoughForest/ HoughForest.sln forest/ Learning_sample/ learning_images/ Pos/ Nos/ result/ Test_sample/ test_images/
  18. 18. • 入力された学習用画像からパッチを作成 ‒ 指定したサンプリング幅でパッチを切り出し ‒ ポジティブパッチのみ物体重心までの
 オフセットベクトルを算出 学習用画像の入力とパッチ画像の作成 18 アルゴリズム解説 重心 オフセットベクトル ポジティブ画像 ネガティブ画像 なし なし なし 切り出し ポジティブパッチ ネガティブパッチ ・・・ ・・・ オフセットベクトル
  19. 19. • 生成した学習用画像の読み込み ‒ 使用関数:LearningImage() ‒ 入力:前準備で生成した学習画像を指定フォルダに配置 • パッチ画像の作成 ‒ 使用関数:extractPatch() 学習用画像の入力とパッチ画像の作成 19 学習用画像の入力とパッチ画像の作成のため設定するパラメータ #define LEARNING_IMAGE_PATH “./Learning_sample/learning_images/“ //学習画像のパス //指定したパス以下のフォルダ Pos/ 内にポジティブ画像, Neg/ 内にネガティブ画像を置いてください #define NEG_NUM 36 //ネガティブ画像の枚数 #define POS_NUM 36 //ポジティブ画像の枚数 #define SCALE .25 //画像スケール係数 //学習画像が大きい場合 1.0以下 学習画像が小さい場合 1.0以上 (係数を小さくするとパッチが切り出せない場合があります) #define WINDOW_WIDTH 32 //パッチの縦サイズ(偶数に設定) #define WINDOW_HEIGHT 32 //パッチの横サイズ(偶数に設定)
  20. 20. 特徴量の算出 20 • 使用する特徴量 ‒ Histograms of Oriented Gradients[Dalal, CVPR 05] ‒ 局所領域におけるエッジ(勾配)の方向を
 ヒストグラム化した特徴量  エッジ方向の方向ヒストグラム アルゴリズム解説 メリット:明るさの変化などの影響を受けにくい      形状の変化に頑健
  21. 21. 21 HOG特徴量の算出アルゴリズム 1. 輝度の勾配方向と勾配強度の算出 2. ヒストグラムの作成 3. 閾値処理と正規化 アルゴリズム解説
  22. 22. 1. 輝度の勾配方向と強度の算出 2. ヒストグラムの作成 ‒ 0 から180 までを、20 ずつ9方向に分割 22 HOGの算出法(1/2) fx(x, y) = L(x + 1, y) L(x 1, y) fy(x, y) = L(x, y + 1) L(x, y 1) m(x, y) = fx(x, y)2 + fy(x, y)2 (x, y) = tan 1 fy(x, y) fx(x, y) 勾配強度: 勾配方向: (x, y) (x + 1, y) (x 1, y) (x, y 1) (x, y + 1) アルゴリズム解説
  23. 23. 3. 閾値処理と正規化 ‒ あるn番目のHOG特徴量について正規化 • 背景から算出される小さな勾配は閾値処理で除外 ‒ 32 32の入力画像 • 1セル:8 8ピクセル、1ブロック:1 1セル 23 HOGの算出法(2/2) (1) (4 4) 18 = 228個(次元)のHOG特徴量 正規化回数 セル数 勾配方向数 アルゴリズム解説 v(n) = 8 < : 0 : qPN k=1 v(k)2 < th v(n) pPN k=1 v(k)2 : otherwise 今回はブロックの正規化なし N:勾配方向数 th:閾値
  24. 24. 特徴量の算出 • パッチ画像からHOG特徴量の算出 ‒ 使用関数:CompHist() • この関数はパッチが切り出されるたびに呼び出され
 Init関数によって初期化を行う 24 HOG特徴量の算出のために設定するパラメータ #define WIDTH_SELLNUM 4 //分割数(HOG特徴量算出時の横のセル数) #define HEIGHT_SELLNUM 4 //分割数(HOG特徴量算出時の縦のセル数) #define BLOCK WIDTH_SELLNUM * HEIGHT_SELLNUM //ブロック数 #define ORIENTATION 18 //勾配パターン数 HOG特徴量の可視化 パッチ画像 HOG特徴量 プログラム解説
  25. 25. 決定木の構築 • 作成した学習データを使ってHough Forestsを学習 • 作成する木の数だけサブセットを生成 ‒ サブセット用いて決定木を構築 ‒ サンプルは分岐関数にしたがって分岐 25 サブセットを用いて
 決定木を構築 ・・・ サブセット1 Tree1 サブセット2 Tree2 サブセットT TreeT 分岐ノード 末端ノード アルゴリズム解説
  26. 26. 決定木の構築 • サブセットの作成 ‒ 使用関数:splitPatch() • サンプルの重複, 未使用を許容しつつPER_SUBSETで設定した
 割合でサブセットをNUM_TREESの数だけ作成 • 決定木の構築 ‒ 使用関数:Learn() • 設定したパラメータで決定木を構築する起点になる関数 ‒ build関数を再帰的に呼び出し決定木を構築 26 決定木の構築のために設定するパラメータ #define NUM_TREES 10 //木の本数 #define MAX_DEPTH 60 //木の深さ #define PER_SUBSET 1.0 //サブセットの割合 プログラム解説
  27. 27. 分岐関数の設計 • 分岐関数はパッチが持つHOG特徴量と閾値を比較 ‒ HOG特徴量がしきい値以下の場合は左, それ以外は右に分岐 27 パッチの持つHOG特徴量 > Th 右に分岐 分岐ノード アルゴリズム解説
  28. 28. 分岐関数の決定方法 • 評価関数の値が最小の候補を分岐関数に決定 • 2つの評価関数を階層とサンプル数に応じて選択 ‒ クラスラベルのエントロピー ‒ オフセットベクトルの分散の値 28 Ir = InIl (5) ∆E = E(In) − |Il| |In| E(Il) − |Ir| |In| E(Ir) (6) E(I) = − N n=1 Pnlog2Pn (7) p(C = P|S) = 1 T T t=1 SP t SP t + SN t (8) U1(A) = |A|(−c · logc − (1 − c) · log(1 − c)) (9) U2(A) = i:ci=1 (di − dA)2 (10) Ir = InIl (5) ∆E = E(In) − |Il| |In| E(Il) − |Ir| |In| E(Ir) (6) E(I) = − N n=1 Pnlog2Pn (7) p(C = P|S) = 1 T T t=1 SP t SP t + SN t (8) U1(A) = |A|(−c · logc − (1 − c) · log(1 − c)) (9) U2(A) = i:ci=1 (di − dA)2 (10) k k A : パッチ集合 c : Aのポジティブクラスの確率 tk : k番目の分岐関数の候補 Hough ImageV 歩行者検出結果 図 6: 投票処理を用いた歩行者検出 ここで dA はオフセットベクトル di の平均値であるので,U2 はオフセットベクトルの分散に相 当する.2 つの評価関数を用いて,各ノードの分岐関数は以下の手順で選択される.まず,式 (2) の分岐関数のプール {tk} を生成する.そして,式 (10) を用いて背景パッチと物体パッチの 不確実性が最小となる分岐関数を選択する. argmin k (U⋆({pi|tk (Ii) = 0) + U⋆({pi|tk (Ii) = 0)) (10) ここで,⋆ は 1 か 2 のいずれかをランダムに選択することを表している.しかし,入力される パッチ集合に含まれる背景パッチの数があまりに少ない場合,オフセットの不確実性が最小と なるように分岐関数を選択するため ⋆ には 2 が適用される.また,⋆ に 1 と 2 を交互に選択す ることで,末端ノードでは確実に双方の不確実性が減少していると考えられる.このように構 築した木を用いてオブジェクトの検出を行う. 識別 HF による物体検出では,入力画像に含まれる対象オブジェクトを投票処理により,重心を求 めることでオブジェクトを検出することができる.第 1 段階により検出された歩行者候補領域 から抽出したパッチを各決定木に入力する.末端ノードに到達した,画像中のある位置 y のパッ チ I(y) が画像中の異なる位置 x を中心としたオブジェクトに含まれる確率を式 (11) により算 出して,木の本数 T で平均する. : パッチ画像 dA : Aのオフセットベクトルの平均 pi :サンプル集合 argmin k (U ({pi|tk (Ii) = 0}) + U ({pi|tk (Ii) = 1})) 左の子ノードに分岐した
 サンプル集合 右の子ノードに分岐した
 サンプル集合 アルゴリズム解説
  29. 29. 分岐関数の設計, 決定方法 • 分岐関数を候補の中から選択 ‒ 使用関数:selectsplitfunctionGrad() • 分岐の評価が最も良かった分岐のパラメータを保存 ‒ 選択した特徴次元 ‒ 選択した閾値 • 決定した分岐関数を使用しサンプルを分岐 ‒ 使用関数:splitSamplesGrad() • 現在のノードで分岐したサンプルを左右の子ノードに受け渡し 29 分岐関数の設計, 決定方法のために設定するパラメータ #define TH_TESTS 10 //閾値選択回数 // #define SPLIT_SELECT_MIN 30 //分岐関数を選択する条件 //ノードに到達したサンプルが設定した数値以下なら, 評価に分散を使用 プログラム解説
  30. 30. • 木の深さが条件を満たした場合末端ノードを作成 ‒ 作成条件1:木の深さが設定した最大の深さに達する ‒ 作成条件2:ノードのサンプル数が設定した数以下になる • 末端ノードに到達したサンプルの情報を保存 ‒ ボルトのクラス尤度とオフセットベクトル 末端ノードの作成 30 ボルトのクラス尤度 オフセットベクトル 保存される情報 深さ 分岐ノード 末端ノード 指定した深さ 指定られた最大の深さでなくとも 最小サンプル数以下ならば末端ノードを作成 アルゴリズム解説
  31. 31. 末端ノードの作成 • 条件を満たしたとき末端ノードを作成 ‒ 使用関数:selectsplitunctionGrad() • 作成条件を満たした場合ノードに末端ノードのフラグを立て
 保持しているサンプルの情報を保存 31 末端ノード作成のために設定するパラメータ #define SAMPLE_MIN 5 //末端ノード作成する条件 //ノードに到達したサンプルが設定した数値以下なら, 末端ノードを作成 プログラム解説
  32. 32. Hough Forestの学習:作業手順 1. 生成した学習用画像を指定した入力フォルダコピー ‒ 指定フォルダ:learning_images/Pos/, learning_images/Neg 2. パラメータの設定 ‒ #define MODE 1 になっていることを確認 • 1でない場合は学習プログラムが動きません ‒ SAMPLING_WSTEP, SAMPLING_HSTEPをそれぞれ 2 に設定 ‒ その他パラメータは解きたい問題によって変更 • 今回はデフォルトのまま 3. 実行 ‒ 学習が終了すると作成した木構造がforest/に保存 ‒ 検出時はこのフォルダから作成した木構造を読み込む 32 作業手順の解説
  33. 33. Hough Forestを用いた物体検出 1. 前処理 ‒ 学習用画像の生成 2. Hough Forestの学習 ‒ 学習用画像の入力, パッチの切り出し ‒ 決定木の構築 3. Hough Forestによる検出 ‒ テスト画像の入力 – 決定木を用いた投票処理 ‒ 検出ウィンドウの統合 4. ソースコード詳細 33
  34. 34. Hough Forestによる検出 1. テスト画像の入力 2. 決定木を用いた投票処理 ‒ 決定木の走査 3. 検出ウィンドウの統合 – MeanShiftクラスタリング – Nearest Neighbor 34
  35. 35. ソースコード • 学習と同一のものを使用 • プログラムの構成 ‒ 学習, 認識のプログラムが統合 • common.h #define MODEを0に設定で
 検出プログラムが動作 35
  36. 36. フォルダ構造 • HoughForestの検出プログラムのフォルダ構造 36 フォルダ構造 src/ 入力画像の配置先 学習結果の読み込み先 HoughForest/ HoughForest/ HoughForest.sln forest/ Learning_sample/ learning_images/ Pos/ Nos/ result/ Test_sample/ test_images/ 検出結果の保存先
  37. 37. • テスト画像をラスタスキャン ‒ 画像中のどこに物体が存在するか探索 ‒ 画像中を網羅的に走査 • それぞれ検出ウィンドウ領域の情報を決定木に入力 テスト画像の入力 37 テスト画像をラスタスキャン 検出ウィンドウ アルゴリズム解説
  38. 38. テスト画像の入力 • 検出テストを行うためボルトをランダムに配置した
 テスト画像を入力 ‒ 使用関数:testImage 38 テスト画像の入力のための設定パラメータ #define TEST_IMAGE_PATH "./Test_sample/test_images/" //テスト画像のファイルパス //画像の名前は0から始まる連番にしてください //例 11枚のテスト画像があるとき 0.bmp, 1.bmp, ∼9.bmp, 10.bmp #define TEST_NUM 3 //テスト画像枚数
  39. 39. • 探索ウィンドウから特徴量の抽出 ‒ HOG特徴量の算出 • 決定木に入力 ‒ 到達した末端ノードのオフセットベクトルを投票マップに投票 決定木を用いた投票処理 39 ボルトの尤度 オフセットベクトル 投票マップ HOG特徴量を
 算出し入力 投票 決定木の走査 入力画像 アルゴリズム解説
  40. 40. • 各ノードに保存されている分岐関数の情報をもとに
 決定木を走査 ‒ 決定木の走査は作成した木の数だけ行う 決定木の走査 40 分岐ノード 末端ノード 検出ウィンドウをすべての
 決定木に入力 ・・・ Tree1 Tree2 TreeT クラスの尤度 オフセットベクトル クラスの尤度 オフセットベクトル クラスの尤度 オフセットベクトル 到達した
 末端ノードの情報 アルゴリズム解説
  41. 41. 決定木の走査,投票処理 • 再帰的に決定木を走査 ‒ 使用関数:Traversal() • ノードの分岐条件をもとに決定木をたどり
 末端ノードの情報を返す • 末端ノードの情報を統合し一つの投票マップに統合 ‒ 使用関数:makeMap() • Traversal関数により到達した末端ノードの情報を統合 • 統合後viewMap関数に投票マップを渡し画像として描写 • 閾値より小さい投票値は削除(後のクラスタリング処理のため) 41 木の走査のための設定パラメータ #define LIKELIHOOD_TH 0.6 //尤度の閾値 //閾値以下の投票は削除 プログラム解説
  42. 42. 42 検出ウィンドウの統合 • 一つのボルトに対して複数のウィンドウが検出 – MeanShiftクラスタリングにより点の密度が極値となる点へ移動 – Nearest Neighborにより検出ウィンドウを統合 ウィンドウ統合前 ウィンドウ統合後 アルゴリズム解説
  43. 43. MeanShiftクラスタリング • x方向、y方向、scaleの3次元でのクラスタリング ‒ ボルトとして判定された検出ウィンドウの中心座標 からMeanShift Vectorを算出 – ウィンドウの半径hの範囲を探索 43 MeanShift Vector: カーネル関数: m(x) = n⌅ i=1 xik ⇥ x xi h 2⇤ n⌅ i=1 k ⇥ x xi h 2⇤ x アルゴリズム解説
  44. 44. MeanShiftによる効果 • MeanShiftクラスタリングにより投票密度が
 高い座標に物体重心座標を移動 44 クラスタリング後クラスタリング前 アルゴリズム解説 h = 64
  45. 45. MeanShiftによる効果 • 探索ウィンドウの半径hによってMeanShiftの
 結果は変化 45 クラスタリング前 クラスタリング後 アルゴリズム解説 h = 10 h = 20
  46. 46. MeanShiftクラスタリング • 複数検出された物体重心座標をクラスタリング ‒ 使用関数:meanShift() • 探索範囲内の密度が高い方へ物体重心座標を移動 • 物体重心座標をクラスタごとにまとめることで
 NearestNeighborにより同一クラスタを統合 46 MeanShiftクラスタリングのための設定パラメータ #define RADIUS 64 //探索範囲の半径 プログラム解説
  47. 47. • 各サンプル点の座標上の距離を観測し 最も近いサンプル点を探索 – クラスタリングされた検出ウィンドウの中心座標を点に統合 • 距離dが閾値thを下回ればサンプル点を統合 47 d = (x xi)2 + (y yi)2ユークリッド距離: Nearest Neighbor(最近傍決定則) アルゴリズム解説
  48. 48. Nearest Neighbor(最近傍決定則) • Meanshiftによりクラスタリングされた
 検出ウィンドウの中心座標を統合 ‒ 使用関数:NearestNeighbor() • 距離の閾値以上 ‒ 別のクラスタと判定し検出ウィンドウを残す • 距離の閾値以下 ‒ 同一クラスタと判定し検出ウィンドウを統合 48 Nearest Neighborのための設定パラメータ #define WIN_TH 80 //ウィンドウ統合閾値 //閾値以上だと別の検出対象として保存 以下だと統合 プログラム解説
  49. 49. Hough Forestによる検出:作業手順 1. テスト画像を指定のフォルダに配置 ‒ 指定フォルダ:test_images/ 2. パラメータの設定 ‒ #define MODE 0 になっていることを確認 • 0の場合検出プログラムが動作 ‒ 検出時は学習時と同じパラメータを使用 • SAMPLING_WSTEP, SAMPLING_HSTEPはそれぞれ 1 に設定 ‒ 検出のみに使用するパラメータは変更可 • 今回はデフォルト 3. 実行 ‒ 検出処理が終了するとresult/に検出結果の画像と投票マップが出力 49 作業手順の解説
  50. 50. 検出例 50 投票マップ出力画像 最終的に検出した物体重心点 探索範囲 : h = 64
  51. 51. 検出処理時間 • 画像1枚の実行時間(490 490画素):7217.78msec ‒ 内訳 • ラスタスキャン+特徴算出:4574.32 msec • 投票処理:2586.09 msec • 投票マップの正規化:15.04 msec • MeanShift:12.94 msec • NearestNeighbor:18.41 msec • 検出結果の書き出し:10.98msec ‒ 1検出ウィンドウ毎の実行時間 • ラスタスキャン+特徴算出:0.02msec • 投票処理:0.01msec 51
  52. 52. • 本プログラムは物体位置のみ検出 ‒ 物体がどのように置かれているか姿勢も推定したい場合 ‒ 学習データの教師情報に物体の姿勢を追加 ‒ x軸, y軸, 角度の3次元マップに確率を投票 改良のためのヒント1 52 0° 360° :投票点 x軸 y軸 3次元MeanShiftクラスタリング θ軸
  53. 53. 改良のためのヒント2 • weighted Hough Forest ‒ 決定木を階層毎にサンプルの重みを更新しながら学習 • 階層が深くなる毎に特徴的なサンプルの重みが上昇 53 重み更新 階層 1 0 2 D 重み(ポジティブ) 重み(ネガティブ) クラス 尤度算出 重み更新 クラス 尤度算出 Murai et al., “Weighted Hough Forest for object detection”, MVA 2015
  54. 54. 改良のためのヒント2 • weighted Hough Forestの効果 ‒ 類似した形状のサンプルへの誤投票を抑制 54 Hough Forest Weighted Hough Forest 検出対象 Murai et al., “Weighted Hough Forest for object detection”, MVA 2015
  55. 55. Hough Forestを用いた物体検出 1. 前処理 ‒ 学習用画像の生成 2. Hough Forestの学習 ‒ 学習用画像の入力, パッチの切り出し ‒ 決定木の構築 3. Hough Forestによる検出 ‒ テスト画像の入力 – 決定木を用いた投票処理 ‒ 検出ウィンドウの統合 4. ソースコード詳細 55
  56. 56. Hough Forest:ソースファイル • プログラム構成(.cpp) – main.cpp (学習・識別のメイン関数) – HoughForests.cpp (HFの生成に関する処理関数) – Decisiontree.cpp (決定木の生成に関する処理関数) – Detector.cpp (物体検出時に使用する処理関数) – ImportSample.cpp (サンプルの入力に関する処理関数) – makeSubset.cpp
 (パッチの切り出し, サブセットの作成に関する処理関数) – HoG.cpp (パッチからHOG特徴量を算出する処理関数) – node.cpp (Nodeに関するデフォルトコンストラクタ) – sample.cpp (サンプル情報の入出力に関する関数) 56
  57. 57. Hough Forest:ソースファイル • プログラム構成(.h) ‒ common.h (学習時, 識別時のパラメータを定義するヘッダ) ‒ HoughForests.h
 (学習時の決定木のパラメータに関するヘッダ) – Decisiontree.h (決定木の生成に関するヘッダ) ‒ Detector.h (識別時の決定木のパラメータに関するヘッダ) – ImportSample.h (サンプルの入力に関するクラス) – makeSubset.h (サブセット作成に関するクラス) – HoG.h (HoG特徴量に関するクラス) ‒ node.h (各ノードの情報を格納するクラス) ‒ sample.h (各パッチの情報を格納するクラス) ‒ includeCV.h (OpneCVのライブラリを読み込むヘッダ) 57
  58. 58. Hough Forest:データ構造 • サンプル ‒ 特徴ベクトル • cv::Mat patch;(パッチ画像の輝度値) • std::vector<std::vector<double>> DOP;(エッジの勾配情報) ‒ 教師信号 • int label;(パッチのクラス情報) • cv::Point offset;(パッチのオフセットベクトル) ‒ オフセットベクトルを持つのはポジティブパッチのみ 58
  59. 59. Hough Forest:データ構造 • ノード – int grad; //勾配方向 ‒ int block; //ブロックインデックス – double t; //threshold – int depth; //depth – int index; //node index – bool nodeType; //true:splitnode false:leafnode – vector<double> distribution;//distribution histogram – vector<Point> offsetList; //node offset List – Node *right; //right node – Node *left; //left node 59
  60. 60. Hough Forest:プログラム概要 60
  61. 61. 学習過程:Forestに必要な関数 61 Learn - Forestsを生成するための関数 - 引数:なし - サンプルの読み込みに必要な関数を呼び出し - Decisiontree の Learn を呼び出し Initilizer - Forests の 情報を初期化するための関数 - 引数:Forests のパラメータ - Decisiontree の Initilizer を呼び出し Save - Forests を保存する関数 - 引数:保存するファイル名 - Decisiontree のSaveを呼び出し HoughForests.cpp
  62. 62. 学習過程:サンプルの読み込みに必要な関数 62 learningImage - 学習時に用いる画像を読み込む関数 - 戻り値:ポジティブ画像, ネガティブ画像 ImportSample.cpp extractPatch - 読み込んだ画像からパッチ画像を生成する関数 - ポジティブパッチに対してオフテットベクトルを取得 - 引数:ポジティブ画像, ネガティブ画像 - HOG特徴量算出に必要な関数を呼び出し splitPatch - サブセットを作成する関数 - 引数:木の数, 全パッチ数に対するサブセットの割合 makeSubset.cpp CompHist - パッチ画像からHOG特徴量を算出する関数 - 引数:パッチ画像 HoG.cpp
  63. 63. 学習過程:Treeの作成に必要な関数 63 Learn - 再帰でノードを生成する関数 - 引数:学習用サンプル, ラベルに対する重み - selectsplitfunctionGrad, splitSamplesGradを呼び出し Decisiontree.cpp selectsplitfunctionGrad - 分岐関数を候補の中から選択する関数 - 引数:ルートノードのアドレス, 学習用サンプル, ラベルに対する重み, ノードの深さ,ノード番号 - selectsplitfunctionGrad, splitSamplesGradを呼び出し - ノードを末端ノードと判定した場合クラス確率とオフセット量を保存 splitSamplesGrad - 分岐関数を用いてサンプルを分岐する関数 - 引数:ノードに到達したサンプル - selectsplitfunctionGrad, splitSamplesGradを呼び出し
  64. 64. 識別過程:物体検出に必要な関数 64 computeError - Forestsを走査するための関数 - 引数:なし - testimage, loadNode, viewDetection,
 makeMapを呼び出し Detector.cpp loadNode - 再帰でForestsを読み込む関数 - 引数:ファイル名 Traversal - 再帰により決定木を走査する関数 - 引数:ルートノードのアドレス, パッチ画像 - 末端ノードのオフセット量を返す viewMap - 尤度マップの可視化する関数 - 引数:尤度マップ,未知入力画像の番号 - 尤度マップの閾値処理,正規化処理を行う
  65. 65. 識別過程:物体検出に必要な関数 65 meanShift - クラスタリングのための関数 - 引数:尤度マップ Detector.cpp NearestNeighbor - 検出統合する関数 - 引数:クラスタリング後の尤度マップ - 閾値により検出ウィンドウを統合するかを判定 makeMap - 末端ノードのオフセット量を尤度マップに投票する関数 - 引数:未知入力画像の番号 - extractPatch,Traversal, viewMap, meanShift, NearestNeighborを呼び出し viewDetection - 物体位置を描写するための関数 - 引数:検出した物体位置
  66. 66. 識別過程:サンプルの読み込みに必要な関数 66 testImage - 識別時に用いる画像を読み込む関数 - 戻り値:評価用画像 ImportSample.cpp extractPatch - 読み込んだ画像からパッチ画像を生成する関数 - 引数:未知入力画像 - HOG特徴量算出に必要な関数を呼び出し makeSubset.cpp CompHist - パッチ画像からHOG特徴量を算出する関数 - 引数:パッチ画像 HoG.cpp
  67. 67. 67

×