Transcript
Page 1: Opencv object detection_takmin

第10回CV勉強会 OpenCV祭り物体検出徹底解説!

takmin

Page 2: Opencv object detection_takmin

<質問>

OpenCVで一番有名な機能といったらなんでしょう?

Page 3: Opencv object detection_takmin

<答え>

顔検出(※この発言は個人の見解であり、所属する組織の公式見解ではありません)

Page 4: Opencv object detection_takmin

実は認識出来るのは「顔」だけじゃないんです

というわけで、「物体」検出の仕組みと使い方を徹底解説

Page 5: Opencv object detection_takmin

物体検出徹底解説!

物体検出の仕組み Viola & Johnsのアルゴリズムを解説

物体検出の使い方

2.0以降の変更点

物体検出器を作ってみよう! opencv_createsamples

opencv_traincascade

Page 6: Opencv object detection_takmin

物体検出の仕組み

Page 7: Opencv object detection_takmin

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.

Page 8: Opencv object detection_takmin

物体検出の流れ探索窓

Page 9: Opencv object detection_takmin

学習

学習結果データ

学習フェーズ

特徴量抽出

学習画像学習画像学習画像

認識

認識結果

認識フェーズ

特徴量抽出

入力画像

物体検出の基本原理

Haar-Like

特徴

AdaBoost

Page 10: Opencv object detection_takmin

機械学習とは?

人間が自然に行っている学習能力と同様の機能をコンピュータで実現させるための技術・手法のこと

事前にコンピュータにサンプルデータを与え、そのパターンを統計的に抽出させる。

学習サンプル学習結果

Page 11: Opencv object detection_takmin

・・・・

弱い識別器 強い識別器

正解画像非正解画像

教師信号

学習

AdaBoost

弱い識別器を並べて、強い識別器を作成する機械学習

Page 12: Opencv object detection_takmin

AdaBoostの学習の流れ以下の処理を繰り返し、1ラウンドごとに1つの特徴を選ぶ

1. 学習画像(正解及び非正解)を用意する。(例:顔画像と顔を含まない画像)

2. 各画像ごとの重みを、正解画像、非正解画像ごとに一様にする。(各々の合計は0.5)

3. 以下を指定回数繰り返す。1. 重みの合計が1になるように正規化

2. 各々の識別器に画像の判定を行わせ、学習画像毎の重みを元にエラー率を算出する

3. エラー率が最も小さくなった識別器を選択する。4. その識別器が判別を誤った画像の重みを重くする。

4. 選択した識別器の重み付き和を最終的な強識別器とする。

Page 13: Opencv object detection_takmin

Haar-Like特徴

特徴量 = 白領域の画素値-黒領域の画素値

Page 14: Opencv object detection_takmin

Haar-Like特徴と探索窓

探索窓の中に、1つHaar-Like特徴を持つ。

1つの弱識別器は、1つの探索窓から構成

探索窓内のHaar-Like特徴の「位置」、「サイズ」、「種類」を様々に変えて、約12万個の識別器を用意。

探索窓矩形特徴

(Haar-Like特徴)

Page 15: Opencv object detection_takmin

AdaBoostの学習結果の例

AdaBoostを通して、最適な探索まで自動的に選択される

画像出典:P.Viola and M.J. Jones, "Rapid Object Detection using a Boosted Cascade of Simple

Features", IEEE CVPR, 2001.

選択された特徴の例

Page 16: Opencv object detection_takmin

検出の高速化

1. 積分画像によるHaar-Like特徴計算の高速化

2. Attentional Cascadeによる物体領域選択の高速化

Page 17: Opencv object detection_takmin

高速化の仕組み – 積分画像 -

各画素の値を積分した画像を作成する。(右下に行くほど画素の値が大きくなる)

矩形領域の画素値の総和が非常に高速に計算可能になる。

A B

C D

P1 P2

P4P3

A’

B’

C’

D’P’1

P’2

P’4

P’3

D = P4 – P2 – P3 + P1 D’ = P’4 – P’2 – P’3 + P’1

P1 = 領域Aの画素値の総和P2 = 領域A+Bの画素値の総和P3 = 領域A+Cの画素値の総和P4 = 領域A+B+C+Dの画素値の総和

Page 18: Opencv object detection_takmin

高速化の仕組み – Attentional Cascade -

画像中は「物体以外」の領域の方が多い

効率よく「物体以外」の領域を削除するために、強識別器を複数連結させ、上位で関係ない領域を早めに削除する。

全ての探索窓

1 2 3 更なる処理

拒否された探索窓

TRUE TRUE TRUE

FALSE FALSE FALSE

Page 19: Opencv object detection_takmin

物体検出器の構造(まとめ)

物体検出器の学習データは以下の構造を持つ

カスケード型検出器

ステージ1(強識別器)

弱識別器1

Haar-Like特徴

弱識別器2

・・・・

ステージ2(強識別器)

弱識別器1

Haar-Like特徴

弱識別器2

・・・・

・・・・・

Page 20: Opencv object detection_takmin

OpenCVで物体検出

Page 21: Opencv object detection_takmin

OpenCVで物体検出

OpenCV 2.0以降の変更点:

CascadeClassifierクラスを追加 CインターフェースのCvHaarClassifierCascadeに対応

弱識別器として使用する特徴量の基底クラス導入 FeatureEvaluatorクラスを継承することで、独自特徴量を実装可能。

現在はHaar特徴とLBP特徴が実装されている。

Page 22: Opencv object detection_takmin

Local Binary Pattern (LBP)

Jo Chang-yeon, “Face Detection using LBP features”, CS 229 Final Project Report

•注目画素の8近傍の値が、注目画素より高いか低いかでラベリングし、符号化

•全画素で符号を計算し、ヒストグラムを作成

Page 23: Opencv object detection_takmin

Local Binary Pattern (LBP) 続き

Jo Chang-yeon, “Face Detection using LBP features”, CS 229 Final Project Report

•顔画像をM個のブロックへ分割(重なりなし)し、それぞれのヒストグラムを求めて結合する(256×M個のビン)

• この結合ヒストグラムの一つのビンが弱識別器

Page 24: Opencv object detection_takmin

物体検出の実行(顔検出の例)/* 正面顔検出器のロード */

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 );

}

/* 画像の表示(略) */

Page 25: Opencv object detection_takmin

物体検出の実行

実行の流れ1. CascadeClassifierクラスへオブジェクトの学習ファイル

(XML)を読み込み

コンストラクタの引数、もしくはload()メソッド

ファイル読み込み時にHaar特徴かLBP特徴かは自動で判断

2. CascadeClassifier::detectMultiScale ()関数で、物体検出

std::vector<cv::Rect>クラスへ結果を格納

Page 26: Opencv object detection_takmin

学習データ

“<OpenCV_HOME>/data/”

“haarcascades/” : Haar特徴を用いた学習データ

正面顔

顔パーツ

横顔

上・下半身

“lbpcascades/” : LBP特徴を用いた学習データ

正面顔

Page 27: Opencv object detection_takmin

物体検出器の作成

Page 28: Opencv object detection_takmin

手順

1. 学習データを集める。(正解画像と非正解画像)

2. 学習用テキストファイルを作成する

3. “opencv_createsamples”を用いて正解画像データを作成する。

4. “opencv_traincascade”を用いて物体情報を学習させて、XMLファイルを生成する。

Page 29: Opencv object detection_takmin

参考資料

私の知る限り、ver2.0以降の物体検出器生成手順を書いた正式なドキュメントはありません(!?)

ただし、ver1.1までのドキュメントでも、使い方はなんとか類推できる。

参考資料:

“/doc/haartraining.htm”

http://lab.cntl.kyutech.ac.jp/~kobalab/nishida/opencv/haa

rtraining_jp.htm(日本語訳)

http://robotik.inflomatik.info/other/opencv/OpenCV_O

bjectDetection_HowTo.pdf

Page 30: Opencv object detection_takmin

学習画像を集める

正解画像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

自分で撮影する

Page 31: Opencv object detection_takmin

学習用テキストを編集する

画像のリストファイルを作成する(非正解画像の例)

NG¥image_0001.jpg

NG¥image_0002.jpg

NG¥image_0003.jpg

NG¥image_0004.jpg

NG¥image_0005.jpg

.

.

.

.

NG.txt

image_0002.jpg

image_0003.jpg

NG

image_0001.jpg

<作業ディレクトリ>

image_0002.jpg

image_0003.jpg

image_0001.jpg

OK

OK.txt

NG.txt

Page 32: Opencv object detection_takmin

学習用テキストを編集する

画像のリストファイルを作成する(正解画像の例)

OK¥image_0001.jpg 1 120 100 45 45

OK¥image_0002.jpg 2 100 200 50 50 50 30 25 25

OK¥image_0003.jpg 1 40 55 60 60

OK¥image_0004.jpg 1 104 98 40 40

OK¥image_0005.jpg 2 62 70 50 50 120 162 30 30

.

.

.

.

NG.txt

image_0002.jpg

image_0003.jpg

NG

image_0001.jpg

<作業ディレクトリ>

image_0002.jpg

image_0003.jpg

image_0001.jpg

OK

OK.txt

OK.txt

ファイル名物体数

物体の位置×物体数(x,y,width,height)

Page 33: Opencv object detection_takmin

(X, Y)

(0, 0) x

y

Width

Heigh

t

物体座標の表記

以下のサイトから、”ObjectMaker”というプロットツールをダウンロード可能!http://opencv.willowgarage.com/wiki/ObjectDetection

“ObjectMarker”を日本語化他、色々と使いやすく改造した物http://www.hvrl.ics.keio.ac.jp/~takuya/profile_j.html

Page 34: Opencv object detection_takmin

正解画像データの作成

2通りの正解データ作成方法

1. 1枚の画像を、歪めたり、回転させたり、色の分布を変えるなどして、大量の学習データを作成する場合。(ロゴなど)

正直精度悪くてあんまり使えない。

2. 大量の学習画像を集めて、オブジェクトの領域をプロットする場合。(顔、バイク、車など)

コマンドラインで“opencv_createsamples”という実行ファイルを使用して、正解画像を変換する。

Page 35: Opencv object detection_takmin

正解画像データの作成

場所:<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による確認

画像ファイルリストから生成する場合

このファイルを次のカスケード学習時に使用する

Page 36: Opencv object detection_takmin

学習の開始

場所:“<OpenCV_HOME>/bin/opencv_traincascade”

コマンド例:

opencv_traincascade -data uiuc_car -vec uiuc_car.vec -bg NG.txt -numPos 500 -numNeg 1327 -w 50 -h 20 -numStages 9 -featureType HAAR -mode ALL

-data: 作成するファイル名。拡張子に”.xml”が付与される。

-vec: createsamplesで作成した正解画像データ名

-bg: 非正解画像ファイル名

-numPos:正解画像数

-numNeg:非正解画像数

-w, -h: 画像サイズ。createsamplesで指定したものと同じにする。

-numStages: 作成するステージ数

-featureType: 特徴の型。HAARまたはLBP

-mode: Haar-Like特徴の種類を指定

Page 37: Opencv object detection_takmin

学習の開始

===== 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>

学習の様子

Page 38: Opencv object detection_takmin

実験

UIUC Car Datasetを使って車を学習させてみる

正解画像:500枚 非正解画像:500枚

学習画像サイズ100x40

更にCaltech256のclutterデータ827枚を非正解画像として追加

HAAR特徴は50x20の画像サイズに対し、LBP特徴は100x40

の画像サイズに対して学習

学習画像例

positive negative

Page 39: Opencv object detection_takmin

結果HAAR特徴

LBP特徴

Page 40: Opencv object detection_takmin

結果HAAR特徴

LBP特徴

Page 41: Opencv object detection_takmin

結果

特徴量 Recall Precision F-measure

HAAR特徴 64% 23% 34%

LBP特徴 70% 46% 56%

Page 42: Opencv object detection_takmin

まとめ

OpenCVの物体検出は顔以外にも使える

物体検出の原理の解説

原理を分かっていたほうが、学習パラメータの意味も理解しやすい

OpenCVで検出器を作成する方法の解説

学習画像をたくさん集める必要

createsamplesで正解画像データを作成し、traincascadeで学習データXMLを生成

Page 43: Opencv object detection_takmin

Any Question?


Top Related