単一画像からの最新ディープラーニング顔アルゴリズムを試す(2017 年 7 月 14 日時点) (2020 年 1 月 1 日追記)

漢なら, 単一画像から顔認識したり顔メッシュを復元したりをディープラーニングでやりたいですね!

やりましょう!

## DenseReg

DenseReg: Fully Convolutional Dense Shape Regression In-the-Wild
https://arxiv.org/abs/1612.01202

https://github.com/ralpguler/DenseReg

顔のセグメンテーション(目, 鼻, 眉とか)と形状推定ができます.

Semantic Image Segmentation 用に DeepLab http://liangchiehchen.com/projects/DeepLab.html を使っています.

独自 python caffe layer を使っているので, コンパイルするときには注意です!

```
$ make pycaffe
```

として python caffe module をビルドすることも忘れずに.

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ねんがんの DenseReg: Fully Convolutional Dense Shape Regression In-the-Wild の実行に成功したぞ!!! 😻😻😻😻💪💪💪 <a href="https://t.co/QcBrj1JyRO">pic.twitter.com/QcBrj1JyRO</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/872479206080303106">June 7, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">DenseReg すごい <a href="https://t.co/FzULKzSmLe">pic.twitter.com/FzULKzSmLe</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/872482619425816576">June 7, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">時代は DenseReg <a href="https://t.co/bdl3UArwCi">pic.twitter.com/bdl3UArwCi</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/872487480724865025">June 7, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## pix2vertex

Unrestricted Facial Geometry Reconstruction Using Image-to-Image Translation

https://arxiv.org/abs/1703.10131

https://github.com/matansel/pix2vertex

pix2vertex では, image space で最近流行りの Image-to-Image 変換でまずは顔の position と depth を推定します. その後 non-rigid ICP でテンプレート顔メッシュをフィッティングし, そのあとより詳細な法線を復元することになるのですが, そのためのプログラム `postprocess.p` が, まと⭐️らぼのバイナリプログラムっぽくて, 誰でも試せなくてほんとうにかなしい...

**まと⭐️らぼ つかうのは本当にやめてほしいですね!**

頑張って mattorch とか使わずに lua だけで動かしました(position と depth 推定のみ). image 読み込み関連は An Image toolbox for Torch https://github.com/torch/image を使いました.

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ねんがんの pix2vertex の実行に まと⭐︎らぼを使わずに成功したぞ!!! しかし実際はここから non-rigid ICP でメッシュ作らなければなりません. 優秀な ICP 若人を合法的なあらゆるどんな手段を使ってでも探し出し ICP お仕事発注したい. 日々精進. <a href="https://t.co/V7a1rKHmp8">pic.twitter.com/V7a1rKHmp8</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/882665579538137088">July 5, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">たいせつな pix2vertex <a href="https://t.co/pEX3LiiWX9">pic.twitter.com/pEX3LiiWX9</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/883018086084771840">July 6, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">時代は pix2vertex <a href="https://t.co/iLyRoI8VHW">pic.twitter.com/iLyRoI8VHW</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/883018242633027584">July 6, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

なんか position の推定がおかしいようなきもしますが, non-ridig ICP でテンプレートメッシュをフィッティングするプログラムを書かないことにはこれ以上進められないので, あまり深追いしないことにします.

## Deep Alignment Network(DAN)

Deep Alignment Network: A convolutional neural network for robust face alignment
https://arxiv.org/abs/1706.01789

https://github.com/MarekKowalski/DeepAlignmentNetwork

Facial landmark 検出します. 横顔とかでも強い.

最近流行りの顔ライブラリ Menpo http://www.menpo.org/ 使っているっぽい?

python ライブラリ群の依存関係が面倒なので, virtualenv とかで DAN 専用の python 環境を作ったほうがよいかもしれません(が, 私はやり方がよくわからないのでとりあえず miniconda2 https://conda.io/miniconda.html でなんとか無理やりセットアップしました)

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ねんがんの Deep Alignment Network の実行に 成功したぞ!!!! これを機運に, Deep Alignment Network を C++ で書き直してくれる, 下北沢近辺の優秀な機械学習若人を探し出し, 機械学習お仕事発注したい. 日々精進あるのみですね. <a href="https://t.co/g2vMHplQ4H">pic.twitter.com/g2vMHplQ4H</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/883263439920963585">July 7, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">時代は Deep Alignment Network <a href="https://t.co/XoCgOeK76M">pic.twitter.com/XoCgOeK76M</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/883267131093073920">July 7, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Deep Alignment Network があれば勝てる!!! <a href="https://t.co/cTX7prtFW5">pic.twitter.com/cTX7prtFW5</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/883272665087188992">July 7, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network(3DMM_CNN)

3DMM(3D Morphable Models)をで 3D 形状とテクスチャを復元します.
3DMM を CNN でいい感じにしました.

依存関係の問題で, dlib や opencv は conda で入れましたが, caffe のビルドでは  boost は conda で入れた dlib/opencv を見るようにしつつも protobuf は apt で入れるみたいなことをしないとうまく動きませんでした.
優秀な若人さまでしたら dlib, opencv も自前ビルドしたほうが問題が少ないかもしれません.

また, caffe python binding で, モデルの読み込みのときにエラーがでますので, 以下のように `std::string` を `char *` で置き換える fix が必要になります.

https://github.com/BVLC/caffe/issues/3220

(そもそも `std::string` なシグネチャは python 側から呼べなそうな気もしますが...?)

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">ねんがんの Regressing Robust and Discriminative 3D Morphable Models<br>with a very Deep Neural Network(3dmm_cnn) の実行に 成功したぞ!!!! 😍😍😍😍😍😍💪💪💪💪💪💪 <a href="https://t.co/WNE4lPzYzq">pic.twitter.com/WNE4lPzYzq</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/885565407121219584">July 13, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">3dmm_cnn すごい... これは勝てます, ありがとうございます. <a href="https://t.co/WxspYR9ufu">pic.twitter.com/WxspYR9ufu</a></p>&mdash; Syoyo Fujita (@syoyo) <a href="https://twitter.com/syoyo/status/885565623085838336">July 13, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## おまけ

InverseFaceNet: Deep Single-Shot Inverse Face Rendering From A Single Image
https://arxiv.org/abs/1703.10956

実装がないですが, 期待なアルゴリズムですね!

## 学習したい

今回は forward(推論) を実行しただけです.

学習をするにはどうするか? 昨今は顔のデータセットを CG で用意するのが流行りつつあります(depth などの真値を取れるので)

照明環境をを変えて学習用の顔のレンダリングなどは, Blender を使ったり, NanoRT https://github.com/lighttransport/nanort/ などを使って自前レンダラーを書けばできますが, テンプレートメッシュや 3DMM をどうするか, ですね.
(研究に限定して使える 3DMM などはあったりしますが, Basel Face Model or Sully Face Model くらいしかない?)

## 追記

各人がいろいろ切磋琢磨され, このあたりいろいろ発展していますね.

A collection of deep learning frameworks ported to Keras for face analysis.
https://github.com/shaoanlu/face_toolbox_keras/

いろいろ顔アルゴリズムをまとめて動かせます. ありがとうございます.

## まとめ

北欧美人女優アリシア・ヴィキャンデルがかわい過ぎてやばい！
https://ciatr.jp/topics/58021

リファレンス実装が Torch とか Caffe とか Teano とかいろいろばらばらでつらいので C/C++ で全部書き直したい...!

## TODO

* まと⭐️らぼのコードを, C/C++ or GNU octave で書き直してくれる, 優秀な若人を探す旅に出たい.
* 優秀な若人が, 最新ディープラーニング顔アルゴリズムを試し, 日々お互い切磋琢磨することで, 優秀な若人が人類史上最速で優秀なディープラーニング顔若人へと昇華されるスキームを確立する旅に出たい.