Dlibの高性能な顔器官検出をMacでさくっと試す

Dlib http://dlib.net/

> Dlib is a modern C++ toolkit containing machine learning algorithms and tools for creating complex software in C++ to solve real world problems. 

[Real-Time Face Pose Estimation (YouTube)](https://www.youtube.com/watch?v=oWviqXI9xmI)
[![Real-Time Face Pose Estimation](https://qiita-image-store.s3.amazonaws.com/0/83738/968c28b0-1c0b-1ebc-ce97-7376c2c8228c.jpeg)](https://www.youtube.com/watch?v=oWviqXI9xmI)

このDlibは、画像処理、機械学習系のすごーーーいライブラリなんですが、OpenCVなんかに比べて日本語の情報が少ないです。
OpenCVよりも顔検出精度が良かったり、OpenCVにはない顔器官検出など備えてます。PythonのAPIもあって簡単に使える感じですね。
githubはこちら https://github.com/davisking/dlib

# この記事について
今回、ウェブカメラで撮影した画像からリアルタイムで顔器官検出する、Dlibに付属のサンプルコードをMacで試してみました。
下の写真のように顔の中から６８点の特徴点（口角とか鼻のあたまとか）を自動抽出します。
機械学習で、顔の特徴点を自動判定するんですね。ライブラリを使えば最先端の顔器官検出を簡単に使える時代なんですねー。すごいですね。

Dlib: face_landmark_detection
![スクリーンショット 2016-02-05 00.48.47.png](https://qiita-image-store.s3.amazonaws.com/0/83738/6e6060cc-0e47-9ef9-4e28-cd72da1c0780.png)
写真素材: http://www.ashinari.com/



#インストールから実行までの手順
所要時間は30分です。参りましょうー
##わたしの環境
普通のマックです。

- Mac OSX El Capitan 10.11.3
- python2.7

Dlib のバージョンは 18.18 ( 2016/2/4 時点で最新 ) を利用しました。

##必要なソフトウェア
このへんが入ってなければ入れてくださいませ。

- homebrew
- command line tools in Xcode
- boost
- boost-python
- cmake
- opencv (ウェブカメラを使うサンプルを動かすために必要デス)

boost、boost-python、cmake、opencvは入ってなかったらbrewでさくっとインストールしてーー。

boost

```
$ brew install boost
```
boost-python

```
$ brew install boost-python
```
cmake

```
$ brew install cmake
```
opencvはこんな感じでインストールします。

```
$ brew tap homebrew/science
```
```
$ brew install opencv
```

###X11のインストール
GUIのサンプルを実行するのに必要です。
XQuartz http://www.xquartz.org/  から.dmgをダウンロードしてインストールしてください。インストールしたら Xlib.hが見えるように下記のようにシンボリックリンクを張るーー
```
$ ln -s /opt/X11/include/X11 /usr/local/include/X11
```



## Dlibのインストール

Dlib本体のインストールです。ダウンロードして解凍して

```
$ wget http://dlib.net/files/dlib-18.18.tar.bz2
```

```
$ tar zxvf dlib-18.18.tar.bz2
```

セットアップスクリプトを実行してくださいー

```
$ cd dlib-18.18
```

```
$ sudo python setup.py install
```
これでDlibはインストールは完了です。

##サンプルプログラムのビルド
C++のサンプルプログラムをビルドします。buildというディレクトリを作ってそこに実行ファイルを置くことにします。

```
$ cd dlib-18.18/examples
```
```
$ mkdir build
```
```
$ cd build
```
```
$ cmake .. 
```
```
$ cmake --build . --config Release
```
###cmake --buildでDLIB_NO_GUI_SUPPORTエラーになる場合の対処について
自分の環境では、”DLIB_NO_GUI_SUPPORTがオンになってるぞ”という旨のエラーになってbuildが通らなかった。謎い。
とりあえず下記のように CMakeCache.txt を直接編集して解決しました。

```CmakeCache.txt
#（修正前）
# DLIB_NO_GUI_SUPPORT:STRING=ON   # GUIサポートを使わない

#（修正後）
DLIB_NO_GUI_SUPPORT:STRING=OFF　# GUIサポートを使う
```
http://stackoverflow.com/questions/31898245/trouble-installing-dlib-for-python-on-mac-osx-10-10

###顔器官検出用の学習済みデータの準備
顔器官検出のために学習データが必要です。
下記のように顔器官の学習済みデータをダウンロードして解凍してサンプルプログラムと同じ場所に置いてくださいー

```
$ wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 
```
```
$ bzip2 -d shape_predictor_68_face_landmarks.dat.bz2
```
```
$ mv shape_predictor_68_face_landmarks.dat ~/dlib-18.18/examples/build/
```

##サンプルプログラムの実行
example/build/にあるwebcam_face_pose_ex が実行ファイルです。

```
$ ./webcam_face_pose_ex
```
MacのFacetimeカメラが起動して、リアルタイムに顔器官が検出されるはずです。あなたのお顔でぜひお試しくださいー

## 個別の画像データの入力
おなじ example/build/ にある face_landmark_detection_ex を使えばウェブカメラ経由でなく、個別の写真データを読み込ませて顔器官検出することができます。


```
$ ./face_landmark_detection_ex ./shape_predictor_68_face_landmarks.dat ~/myphoto/*.jpg
```

##検出例
少し斜めからでもしっかり検出してますね。
![スクリーンショット 2016-02-05 00.58.13.png](https://qiita-image-store.s3.amazonaws.com/0/83738/035d560e-8a60-7ef1-6964-66643edc037e.png)


ドーナツで隠れてるところまで検出できてるんですが。
![スクリーンショット 2016-02-05 00.58.05.png](https://qiita-image-store.s3.amazonaws.com/0/83738/5016beb7-23a1-2df6-e389-3383dd269286.png)


複数人でもいけます。女性の方は少しずれちゃってますね。
![スクリーンショット 2016-02-05 00.58.22.png](https://qiita-image-store.s3.amazonaws.com/0/83738/21524aa6-1ecd-a91a-c678-7cd9933a757b.png)

写真素材: http://www.ashinari.com/

#感想
Dlibを使って顔器官を検出するサンプルプログラムを動かしました。
画像処理といえばOpenCVが主流ですが、このDlibも高性能ですし、もっと使われていいと思いますねー。
いろいろと応用できそうですねーーー