UnityでDlibFaceLandmarkDetectorを利用した顔器官検出アプリ事始め

# はじめに

**ついに人物の顔、眉、目、鼻、口の輪郭ポイントが検出できるUnity Assetが登場！**

UnityのAssetStoreで多機能な画像処理Asset「[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)」を販売しているEnox Softwareさんが、今度はDlibという機械学習のライブラリの中から**顔検出および顔器官検出機能**を利用可能にするAssetを公開されました。
こちらも**Windows、Mac、Android、IOS、Linux、Windows10 UWP、WebGL**などのマルチプラットフォームに対応しています。

v1.2.6の更新履歴によるとAssetに同梱されている顔器官検出用学習データファイル（sp_human_face_68.dat、sp_human_face_17.dat、sp_human_face_6.datなど）は**商用利用が可能**であるとのことです。

>
1.2.6
[Common]Changed the training dataset of Shape Predictor model. Since the training dataset consists of Flickr CC0 licensed images, the Shape Predictor model files are available for commercial use.

**[Dlib FaceLandmark Detector](https://assetstore.unity.com/packages/tools/integration/dlib-facelandmark-detector-64314) (https://assetstore.unity.com/packages/tools/integration/dlib-facelandmark-detector-64314)**

- **[オフィシャルサイト](https://enoxsoftware.com/dlibfacelandmarkdetector/)**
- **[Android Demo](https://play.google.com/store/apps/details?id=com.enoxsoftware.dlibfacelandmarkdetectorsample)**
- **[WebGL Demo](https://enoxsoftware.github.io/DlibFaceLandmarkDetector/webgl_example/index.html)** (ブラウザ上で動作確認できるのでオススメ)
- **[チュートリアルビデオ](https://www.youtube.com/watch?v=pwm66AC7lFk&feature=youtu.be)**
- **[
Dlib FaceLandmark Detector APIリファレンス](http://enoxsoftware.github.io/DlibFaceLandmarkDetector/doc/html/index.html)**


# Dlibとは？

最新の機械学習、線形代数アルゴリズムや画像処理機能が実装されているオープンソースのC++ライブラリです。
特に顔検出や「Real-Time Face Pose Estimation」と呼ばれる顔器官検出の精度はOpenCVよりも優れていると言われています。(**当記事で紹介するAssetではこの機能を利用できるようになります**)
検出性能比較動画：[dlib vs OpenCV face detection](https://www.youtube.com/watch?v=LsK0hzcEyHI)
（OpenCV（青丸）のパラメータ設定によっても違うと思いますが、誤検出が少ないという点でDlib（赤矩形）の方が安定しているように見えます）


> ![dlib-logo.png](https://qiita-image-store.s3.amazonaws.com/0/28558/56e26d2e-e384-fd86-9052-1139bb1c10f2.png)
>
> ![landmarked_face2.png](https://qiita-image-store.s3.amazonaws.com/0/28558/3e470d07-3377-2fed-d384-d72fdb2d5514.png)
> 
> [![Real-Time Face Pose Estimation (YouTube)](http://img.youtube.com/vi/oWviqXI9xmI/0.jpg)](https://www.youtube.com/watch?v=oWviqXI9xmI)
> [http://dlib.net/](http://blog.dlib.net/2014/08/real-time-face-pose-estimation.html)

さらに詳しいことは以下のページが参考になると思います。

- [20160417dlibによる顔器官検出](http://www.slideshare.net/takmin/20160417dlib)
- [Xcode で dlib を使用して顔認識を行う](http://qiita.com/ryohey/items/aeb6bfdbc135ce020f02)
- [Dlibの高性能な顔器官検出をMacでさくっと試す](http://qiita.com/naoyu822/items/7cce2f2dbad24931cc87)

# Dlib FaceLandmark Detectorのインポート

UnityのAssetStoreから「[Dlib FaceLandmark Detector](https://assetstore.unity.com/packages/tools/integration/dlib-facelandmark-detector-64314)」をダウンロードし、プロジェクトにインポートします。
Assetsのインポートが完了すると、メニューに[Tools/Dlib FaceLandmark Detector/Set Plugin Import Settings]が追加されます。

# Dlib FaceLandmark Detectorセットアップとサンプル実行

1. メニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択してプラグインファイルの設定を行う
![QiitaDlibFLD_setup1.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/76767abd-2ac3-3ce2-a6f9-0f7ad99a13cd.jpeg)

2.  “OpenCVForUnity/StreamingAssets/”フォルダを“Assets/”フォルダ直下に移動する
![QiitaDlibFLD_setup2.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/e2dbd3b8-9296-980b-1219-df5c36678d77.jpeg)

3. “DlibFaceLandmarkDetector”フォルダ以下にある全ての “***.unity” ファイルを [Build 
Settings] – [Scene In Build]に登録する.

4.サンプルを再生

![QiitaDlibFLD_sample1.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/d73f1fe0-9281-329f-60aa-97dc6180962a.jpeg)
（驚くほどの精度で顔のランドマークが取得できました）
![QiitaDlibFLD_sample2.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/d6b0f2fa-cd89-517f-5924-4074732a8c4e.jpeg)
(ネコの顔器官検出用の学習データも用意されていました。自分で学習データを作成することも可能っぽいです)

# OpenCV for Unityとの連携

**OpenCVと組み合わせることで検出した輪郭ポイントを基に高度な画像処理が可能に！**
「Dlib FaceLandmark Detector」単体でも顔検出と顔器官検出は可能ですが、「OpenCV for Unity」と組み合わせることで、たとえば写真の人物の顔のパーツを変形したり、二人の人物の顔を交換するなどの高度な写真加工アプリ等の作成が可能になるわけです。

```csharp
//「OpenCVForUnity」の画像Matデータを「DlibFaceLandmarkDetector」にセットするコードサンプル
faceLandmarkDetector.SetImage ((IntPtr)imgMat.dataAddr (), imgMat.width (), imgMat.height (), (int)imgMat.elemSize ());
```

### DlibFaceLandmarkDetector×OpenCVサンプル

1. UnityのAssetStoreから「[OpenCV for Unity](https://assetstore.unity.com/packages/tools/integration/opencv-for-unity-21088)」をダウンロードし、プロジェクトにインポート（参考記事:[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め](http://qiita.com/utibenkei/items/fb93623a7ccaabb342f2)）
2. Dlib FaceLandmark Detectorフォルダに同梱されている“DlibFaceLandmarkDetectorWithOpenCVSample.zip”をプロジェクト外の場所に解凍して取り出したDlibFaceLandmarkDetectorWithOpenCVSample.unitypackageをインポート

![QiitaDlibFLD_setup3.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/d908cc0e-eec6-db31-8ccd-f23bb55096bc.jpeg)

3. “DlibFaceLandmarkDetectorWithOpenCVSample”フォルダ以下にある全ての “***.unity” ファイルを [Build 
Settings] – [Scene In Build]に登録する。

4.サンプルを再生

![QiitaDlibFLD_sample3.jpg](https://qiita-image-store.s3.amazonaws.com/0/28558/868c02b0-2029-55e7-6bec-83075dc23761.jpeg)
（OpenCVのみで同様の事をしている「[FaceTracker Sample](https://www.assetstore.unity3d.com/en/#!/content/35284)」では追従不可能な激しい動きの動画なのに、Dlibではピッタリと追従できている！）

（※追記）Dlib FaceLandmark Detectorの初期化時に画面が固まる問題への対策法の記事をアップしました。
[「Dlib FaceLandmark Detector」初期化処理を別スレッドで行う方法](http://qiita.com/utibenkei/items/b0dfb91d9176969c5aac)


# 関連記事
- [「コワすぎ」るカメラアプリ１～歪む顔編～【Unity × OpenCV × Dlib】](http://qiita.com/utibenkei/items/9bfe8f273a0cdbbc492b)
- [「コワすぎ」るカメラアプリ２～地獄だぞ編～【Unity × OpenCV × Dlib】](http://qiita.com/utibenkei/items/a282d277e234ee4c2b29)
- [FaceRig無しでも中の人(二次元)になりたい！【Unity × OpenCV × Dlib × Live2D】](http://qiita.com/utibenkei/items/15925db826721f6bb00c)
- [「Dlib FaceLandmark Detector」初期化処理を別スレッドで行う方法](http://qiita.com/utibenkei/items/b0dfb91d9176969c5aac)
[UnityでOpenCVを利用した顔検出・画像処理アプリ事始め](http://qiita.com/utibenkei/items/fb93623a7ccaabb342f2)