第33回CV勉強会@関東 発表資料
dlibによる顔器官検出
皆川卓也(takmin)
自己紹介
2
テクニカル・ソリューション・アーキテクト
皆川 卓也(みながわ たくや)
フリーエンジニア(ビジョン&ITラボ)
「コンピュータビジョン勉強会@関東」主催
博士(工学)
略歴:
1999-2003年
日本HP(後にアジレント・テクノロジーへ分社)にて、ITエンジニアとしてシステム構築、プリ
セールス、プロジェクトマネジメント、サポート等の業務に従事
2004-2009年
コンピュータビジョンを用いたシステム/アプリ/サービス開発等に従事
2007-2010年
慶應義塾大学大学院 後期博士課程にて、コンピュータビジョンを専攻
単位取得退学後、博士号取得(2014年)
2009年-現在
フリーランスとして、コンピュータビジョンのコンサル/研究/開発等に従事
dlib
3
 http://dlib.net/
 様々なコンピュータビジョンや機械学習、線形代数等の
アルゴリズムを実装したオープンソースのC++ライブラリ
 Boost Software License
 http://dlib.net/license.html
 最新の論文やアルゴリズムが次々と実装されている
 Davis Kingなる個人開発者が中心に開発。
 ドキュメントは少ない。
Real-Time Face Pose Estimation
4
 顔の画像を入力すると、目、鼻、口、眉、顎などの輪郭を抽出
する機能が実装されている。
 iBUG 300-Wデータセットで学習したモデルを以下からダウン
ロード可能
 http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
Real-Time Face Pose Estimation
5
 以下の論文が実装されている
 Kazemi, V., & Josephine, S. (2014). One Millisecond Face
Alignment with an Ensemble of Regression Trees.
Computer Vision and Pattern Recognition (CVPR), 2014.
 著者はスウェーデン王立工科大学の人
 dlibの実装では学習用プログラムもついている。
 OpenCVではついていないことが多い。。。
 顔以外の形状モデルに適用可能
One Milliseconde Face Alignment with an
Ensemble of Regression Tree
 HELENデータセットでの結果例
One Milliseconde Face Alignment with an
Ensemble of Regression Tree
 HELENデータセットでの結果例
One Milliseconde Face Alignment with an
Ensemble of Regression Tree
 回帰による顔器官検出
 顔の形状をベクトル𝑺で表す

















fp
fp
N
N
y
x
y
x
S 
1
1
One Milliseconde Face Alignment with an
Ensemble of Regression Tree
 回帰による顔器官検出
 顔の形状をベクトル𝑺で表す
 形状𝑺(𝒕)と画像Iを入力すると正解との差分形状∆𝑺(𝒕)を返す
関数𝑟𝑡 𝐼, 𝑺(𝒕) を学習する
𝑺(𝟎) 𝑺(𝟏) 𝑺(𝟐) 𝑺(𝟑) 𝑺(𝟏𝟎)
+𝑟0 𝐼, 𝑺(𝟎) +𝑟1 𝐼, 𝑺(𝟏)
+𝑟2 𝐼, 𝑺(𝟐)
One Milliseconde Face Alignment with an
Ensemble of Regression Tree
 形状差分𝑟𝑡 𝐼, 𝑺(𝒕)
の学習にGradient Boostingというア
ルゴリズムを使用
 特徴量はピクセル間差分
 ピクセルの相対位置は各特徴点を基準に
 特徴点から離れるほど点が選ばれずらくなるようなPrior
 現在の形状を平均顔へWarpingしてから
 弱識別器は回帰木
サンプルプログラム
11
 画像ファイルを読み込んで顔器官検出
 http://dlib.net/face_landmark_detection_ex.cpp.html
 OpenCVのCamera Captureを使用してWebCamから読み
込んだ画像で顔器官検出
 http://dlib.net/webcam_face_pose_ex.cpp.html
 学習サンプル
 http://dlib.net/train_shape_predictor_ex.cpp.html
検出の仕方
12
// 学習済みファイル
std::string trainfile = “shape_predictor_68_face_landmarks.dat”;
// 顔器官検出器の生成
dlib::shape_predictor sp;
dlib::deserialize(filename) >> sp;
///// 中略 /////
// img 入力画像
// rectangle 顔検出器が検出した顔位置
dlib::full_object_detection shape = sp(img, rectangle);
実行結果例
13
学習の仕方
14
1. 顔画像に対して目、鼻、口などの位置にラベルを付与
する
 dlibではラベル付けのためのGUIツールが用意されている
 dlib/tools/imglab
 顔以外の対象も可
2. ラベル情報を記述したXMLファイルを読み込んで、学
習
imglabの使い方
15
機能の詳細はヘルプを参照。コマンドラインでは-hオプ
ション、GUIではメニューバーから“help”を選択
1. 画像フォルダを指定して画像リストxmlを作成
2. 画像リストxmlを引数に再度imglabを起動
 --parts オプションでラベル名を指定
imglab –c ibug.xml ./ibug
出力ファイル
名
画像ファイルを格納
したフォルダ
imglab --parts “1 2 3 4 5 6 7 8” ibug.xml
imglabの使い方
16
3. GUIが開くので顔の領域をSHIFTキー+マウスドラッグ
で選択
imglabの使い方
17
4. ダブルクリックで描画した矩形を選択し、ラベル付けしたい
画素で右クリックすると、--partsで指定したラベル名一覧
が出るので、つけたいラベルを選択
imglabの使い方
18
5. 一通りラベルを付けたら、下キーで次の画像を選択。
imglabの使い方
19
6. 全てラベルをつけたら、“File->Save As”でファイル名
をつけて保存
 以下のようなXMLファイルが生成される
<?xml version='1.0' encoding='ISO-8859-1'?>
<?xml-stylesheet type='text/xsl' href='image_metadata_stylesheet.xsl'?>
<dataset>
<name>imglab dataset</name>
<comment>Created by imglab tool.</comment>
<images>
<image file='ibug¥image_003_1.jpg'>
<box top='163' left='317' width='183' height='226'>
<part name='1' x='441' y='234'/>
<part name='2' x='343' y='220'/>
.
.
.
</box></image>
<image file='ibug¥image_004_1.jpg'>
.
.
.
学習の仕方
20
// ラベル付きファイル
std::string labelfile = “face_labels.xml”;
// ラベルデータ読み込み
dlib::array<dlib::array2d<unsigned char> > images_train
std::vector<std::vector<dlib::full_object_detection> > faces_train;
dlib::load_image_dataset(images_train, faces_train, labelfile
// 訓練器
dlib::shape_predictor_trainer trainer;
///// パラメータ設定 中略 /////
// トレーニング
shape_predictor sp = trainer.train(images_train, faces_train);
// トレーニング結果の保存
serialize(“face_8point.dat") << sp;

20160417dlibによる顔器官検出