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

  • 53
    いいね
  • 0
    コメント

はじめに

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

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

Dlib FaceLandmark Detector (https://www.assetstore.unity3d.com/en/#!/content/64314)

Dlibとは?

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

dlib-logo.png

landmarked_face2.png

Real-Time Face Pose Estimation (YouTube)
http://dlib.net/

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

Dlib FaceLandmark Detectorのインポート

UnityのAssetStoreから「Dlib FaceLandmark Detector」をダウンロードし、プロジェクトにインポートします。
Assetsのインポートが完了すると、メニューに[Tools/Dlib FaceLandmark Detector/Set Plugin Import Settings]が追加されます。

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

  1. メニューの[Tools/OpenCV for Unity/Set Plugin Import Settings]を選択してプラグインファイルの設定を行う
    QiitaDlibFLD_setup1.jpg

  2. “OpenCVForUnity/StreamingAssets/”フォルダを“Assets/”フォルダ直下に移動する
    QiitaDlibFLD_setup2.jpg

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

4.サンプルを再生

QiitaDlibFLD_sample1.jpg
(驚くほどの精度で顔のランドマークが取得できました)
QiitaDlibFLD_sample2.jpg
(ネコの顔器官検出用の学習データも用意されていました。自分で学習データを作成することも可能っぽいです)

OpenCV for Unityとの連携

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

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

DlibFaceLandmarkDetector×OpenCVサンプル

  1. UnityのAssetStoreから「OpenCV for Unity」をダウンロードし、プロジェクトにインポート(参考記事:UnityでOpenCVを利用した顔検出・画像処理アプリ事始め
  2. Dlib FaceLandmark Detectorフォルダに同梱されている“DlibFaceLandmarkDetectorWithOpenCVSample.zip”をプロジェクト外の場所に解凍して取り出したDlibFaceLandmarkDetectorWithOpenCVSample.unitypackageをインポート

QiitaDlibFLD_setup3.jpg

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

4.サンプルを再生

QiitaDlibFLD_sample3.jpg
(OpenCVのみで同様の事をしている「FaceTracker Sample」では追従不可能な激しい動きの動画なのに、Dlibではピッタリと追従できている!)

(※追記)Dlib FaceLandmark Detectorの初期化時に画面が固まる問題への対策法の記事をアップしました。
「Dlib FaceLandmark Detector」初期化処理を別スレッドで行う方法

関連記事