Contenu connexe Similaire à Opencv object detection_takmin Similaire à Opencv object detection_takmin (20) Plus de Takuya Minagawa (20) Opencv object detection_takmin3. <答え>
顔検出
(※この発言は個人の見解であり、所属す
る組織の公式見解ではありません)
5. 物体検出徹底解説!
物体検出の仕組み
Viola & Johnsのアルゴリズムを解説
物体検出の使い方
2.0以降の変更点
物体検出器を作ってみよう!
opencv_createsamples
opencv_traincascade
7. Viola & Johnsのアルゴリズム
OpenCVの物体検出は、以下の手法を実装している
Rainer Lienhart and Jochen Maydt, "An Extended Set of Haar-like
Features for Rapid Object Detection", IEEE ICIP 2002,Vol. 1, pp. 900-903,
Sep. 2002.
Ojala and M. Pietikainen, “Multiresolution Gray-Scale and Rotation
Invariant Texture Classification with Local Binary Patterns”, IEEE Trans on
PAMI,Vol. 24. No.7, July, 2002. (LBPの論文)
ここでは、大元となった以下の論文を元に解説する
Paul Viola and Michael J. Jones,
"Rapid Object Detection using a Boosted Cascade of
Simple Features",
IEEE CVPR, 2001.
9. 物体検出の基本原理
学習フェーズ 認識フェーズ
学習画像
学習画像
学習画像 入力画像
Haar-Like
特徴
特徴量抽出 特徴量抽出
AdaBoost
学習 認識
学習結果
認識結果
データ
10. 機械学習とは?
人間が自然に行っている学習能力と同様の機能をコン
ピュータで実現させるための技術・手法のこと
事前にコンピュータにサンプルデータを与え、そのパターンを
統計的に抽出させる。
学習サンプル
学習結果
11. AdaBoost
弱い識別器を並べて、強い識別器を作成する機械学習
非正解画 教師
正解画像 像 信号
学習
弱い識別器 強い識別器
・・・・
12. AdaBoostの学習の流れ
以下の処理を繰り返し、1ラウンドごとに1つの特徴を選ぶ
1. 学習画像(正解及び非正解)を用意する。(例:顔画像と顔を含まない画
像)
2. 各画像ごとの重みを、正解画像、非正解画像ごとに一様にする。(各々
の合計は0.5)
3. 以下を指定回数繰り返す。
1. 重みの合計が1になるように正規化
2. 各々の識別器に画像の判定を行わせ、学習画像毎の重みを元にエラー率を
算出する
3. エラー率が最も小さくなった識別器を選択する。
4. その識別器が判別を誤った画像の重みを重くする。
4. 選択した識別器の重み付き和を最終的な強識別器とする。
14. Haar-Like特徴と探索窓
探索窓の中に、1つHaar-Like特徴を持つ。
1つの弱識別器は、1つの探索窓から構成
探索窓内のHaar-Like特徴の「位置」、「サイズ」、「種類」
を様々に変えて、約12万個の識別器を用意。
矩形特徴
探索窓 (Haar-Like特徴)
15. AdaBoostの学習結果の例
AdaBoostを通して、最適な探索まで自動的に選択される
選択された特徴の例
画像出典:
P.Viola and M.J. Jones, "Rapid Object Detection using a Boosted Cascade of Simple
Features", IEEE CVPR, 2001.
16. 検出の高速化
1. 積分画像によるHaar-Like特徴計算の
高速化
2. Attentional Cascadeによる物体領域選
択の高速化
17. 高速化の仕組み – 積分画像 -
各画素の値を積分した画像を作成する。(右下に行くほど画
素の値が大きくなる)
矩形領域の画素値の総和が非常に高速に計算可能になる。
P1 = 領域Aの画素値の総和
P2 = 領域A+Bの画素値の総和
P3 = 領域A+Cの画素値の総和
P4 = 領域A+B+C+Dの画素値の総和
P’2
A B B’
P1 P2
C D A’ P’1 D’ P’4
P4
P3
C’ P’3
D = P4 – P2 – P3 + P1 D’ = P’4 – P’2 – P’3 + P’1
18. 高速化の仕組み – Attentional Cascade -
画像中は「物体以外」の領域の方が多い
効率よく「物体以外」の領域を削除するために、強識別器を複
数連結させ、上位で関係ない領域を早めに削除する。
全ての探索窓
TRUE TRUE TRUE
1 2 3 更なる処理
FALSE FALSE FALSE
拒否された探索窓
19. 物体検出器の構造(まとめ)
物体検出器の学習データは以下の構造を持つ
カスケード型検出器
ステージ1(強識別器) ステージ2(強識別器)
弱識別器1 弱識別器1
Haar-Like特徴 Haar-Like特徴
弱識別器2 弱識別器2 ・・・・・
・ ・
・ ・
・ ・
・ ・
21. OpenCVで物体検出
OpenCV 2.0以降の変更点:
CascadeClassifierクラスを追加
CインターフェースのCvHaarClassifierCascadeに対応
弱識別器として使用する特徴量の基底クラス導入
FeatureEvaluatorクラスを継承することで、独自特徴量を実
装可能。
現在はHaar特徴とLBP特徴が実装されている。
22. Local Binary Pattern (LBP)
• 注目画素の8近傍の値が、注目画素より高いか低いかで
ラベリングし、符号化
• 全画素で符号を計算し、ヒストグラムを作成
Jo Chang-yeon, “Face Detection using LBP features”, CS 229 Final Project Report
23. Local Binary Pattern (LBP) 続き
• 顔画像をM個のブロックへ分割(重なりなし)し、それぞれ
のヒストグラムを求めて結合する(256×M個のビン)
• この結合ヒストグラムの一つのビンが弱識別器
Jo Chang-yeon, “Face Detection using LBP features”, CS 229 Final Project Report
24. 物体検出の実行(顔検出の例)
/* 正面顔検出器のロード */
cv::CascadeClassifier cascade( "haarcascade_frontalface_alt.xml" );
std::vector<cv::Rect> faces;
std::vector<cv::Rect>::iterator face_itr;
/* 顔検出 */
fcascade.detectMultiScale( image, faces);
/* 顔領域の描画 */
for( face_itr = faces.begin(); face_itr != face_itr.end(); face_itr++ )
{
cv::rectangle( image, *face_itr, CV_RGB(255,0,0), 3 );
}
/* 画像の表示(略) */
25. 物体検出の実行
実行の流れ
1. CascadeClassifierクラスへオブジェクトの学習ファイル
(XML)を読み込み
コンストラクタの引数、もしくはload()メソッド
ファイル読み込み時にHaar特徴かLBP特徴かは自動で
判断
2. CascadeClassifier::detectMultiScale ()関数で、物体検出
std::vector<cv::Rect>クラスへ結果を格納
26. 学習データ
“<OpenCV_HOME>/data/”
“haarcascades/” : Haar特徴を用いた学習データ
正面顔
顔パーツ
横顔
上・下半身
“lbpcascades/” : LBP特徴を用いた学習データ
正面顔
28. 手順
1. 学習データを集める。(正解画像と非正解画像)
2. 学習用テキストファイルを作成する
3. “opencv_createsamples”を用いて正解画像データ
を作成する。
4. “opencv_traincascade”を用いて物体情報を学習さ
せて、XMLファイルを生成する。
30. 学習画像を集める
正解画像3000枚、非正解画像7000枚程度
Google Image
http://images.google.co.jp/
Flickr
http://www.flickr.com/
研究用データ
Pascal VOC
http://pascallin.ecs.soton.ac.uk/challenges/VOC/
MITの顔画像データ
http://cbcl.mit.edu/software-datasets/FaceData2.html
カリフォルニア工科大学の物体画像データ
http://www.vision.caltech.edu/Image_Datasets/Caltech101/Caltech101.html
http://www.vision.caltech.edu/Image_Datasets/Caltech256/
etc
自分で撮影する
31. 学習用テキストを編集する
画像のリストファイルを作成する(非正解画像の例)
NG.txt
<作業ディレクトリ> NG¥image_0001.jpg
NG.txt NG¥image_0002.jpg
OK.txt NG¥image_0003.jpg
NG¥image_0004.jpg
NG NG¥image_0005.jpg
image_0001.jpg .
image_0002.jpg .
.
image_0003.jpg
.
OK
image_0001.jpg
image_0002.jpg
image_0003.jpg
32. 学習用テキストを編集する
画像のリストファイルを作成する(正解画像の例)
OK.txt
<作業ディレクトリ>
OK¥image_0001.jpg 1 120 100 45 45
NG.txt
OK¥image_0002.jpg 2 100 200 50 50 50 30 25 25
OK.txt OK¥image_0003.jpg 1 40 55 60 60
OK¥image_0004.jpg 1 104 98 40 40
NG
OK¥image_0005.jpg 2 62 70 50 50 120 162 30 30
image_0001.jpg
.
image_0002.jpg .
image_0003.jpg .
.
OK
image_0001.jpg
image_0002.jpg ファイル名 物体の位置×物体数
物体数 (x,y,width,height)
image_0003.jpg
33. 物体座標の表記
(0, 0) x
(X,Y)
Heigh
t
Width
y
以下のサイトから、”ObjectMaker”というプロットツールをダウンロード可能!
http://opencv.willowgarage.com/wiki/ObjectDetection
“ObjectMarker”を日本語化他、色々と使いやすく改造した物
http://www.hvrl.ics.keio.ac.jp/~takuya/profile_j.html
35. 正解画像データの作成
画像ファイルリストから生成する場合
場所:
このファイルを次のカス
<OpenCV_HOME>/bin/opencv_createsamples” ケード学習時に使用する
コマンド例:
opencv_createsamples -info OK.txt -vec uiuc_car.vec -num 500 -w
50 -h 20 –show
-info: 正解画像リストファイル
-vec: 出力データファイル名
-num: 正解画像数
-w: 学習時の画像幅
-h: 学習時の画像高さ
-show: 学習画像のGUIによる確認
37. 学習の開始
学習の様子
===== TRAINING 0-stage =====
<BEGIN
POS count : consumed 500 : 500
NEG count : acceptanceRatio 1327 : 1
Precalculation time: 44.686
+----+---------+---------+
| N | HR | FA |
+----+---------+---------+
| 1| 1| 1|
+----+---------+---------+
| 2| 1| 1|
+----+---------+---------+
| 3| 1| 1|
+----+---------+---------+
| 4| 0.998| 0.517709|
+----+---------+---------+
| 5| 0.996| 0.37679|
+----+---------+---------+
END>
38. 実験
UIUC Car Datasetを使って車を学習させてみる
正解画像:500枚 非正解画像:500枚
学習画像サイズ100x40
更にCaltech256のclutterデータ827枚を非正解画像として追
加
HAAR特徴は50x20の画像サイズに対し、LBP特徴は100x40
の画像サイズに対して学習
学習画像例
positive negative
41. 結果
特徴量 Recall Precision F-measure
HAAR特徴 64% 23% 34%
LBP特徴 70% 46% 56%
42. まとめ
OpenCVの物体検出は顔以外にも使える
物体検出の原理の解説
原理を分かっていたほうが、学習パラメータの意味も理解しや
すい
OpenCVで検出器を作成する方法の解説
学習画像をたくさん集める必要
createsamplesで正解画像データを作成し、traincascadeで学習
データXMLを生成