OpenFace について調査中


## 注意：異なるプロジェクトを１つのものと勘違いして書いてしまっていました。修正中

OpenFaceの記事についてのリンクを別項目として抜き出しました。
OpenFace がOpenCVやDlibに依存しつつも、それらにない機能を提供していることに気づいたからです。
顔の動作を分析するための機能もその一つです。

この記事を書いた後に、OpenFaceのバージョンも上がっていること。
[OpenFace 2.0.3: an open source facial behavior analysis toolkit](https://github.com/TadasBaltrusaitis/OpenFace)
[OpenFace 2.2.0: an open source facial behavior analysis toolkit] 14 Jul 2019

次のような論文も書かれているなどもあります。

OpenFace 2.0: Facial Behavior Analysis Toolkit Tadas Baltrušaitis, Amir Zadeh, Yao Chong Lim, and Louis-Philippe Morency, IEEE International Conference on Automatic Face and Gesture Recognition, 2018

https://fg2018.cse.sc.edu/FG2018-booklet.pdf

2018年7月の時点でみるに、頻繁にメンテナンスされているようです。


## **OpenFace の論文**
OpenFace の性能を論文ベースで理解するには次の論文を参照してください。

[OpenFace: an open source facial behavior analysis toolkit](https://www.cl.cam.ac.uk/research/rainbow/projects/openface/wacv2016.pdf)

![OpenFace_table1.png](https://qiita-image-store.s3.amazonaws.com/0/83761/92036823-2278-5b6e-40e6-07b0219d735d.png)


論文中のTable 1には、各ライブラリが、どのような機能を実現しているのかの一覧となっています。

OpenFaceが機能の網羅性が高いことがそれらの比較の中でわかります。
Facial Action Unit Recognitionを実現しているライブラリはそう多くないことがわかります。
視線推定(Gaze)も実現しているライブラリはそう多くありません。

![OpenFace_Table3_4_5.png](https://qiita-image-store.s3.amazonaws.com/0/83761/e6e6be61-e86f-f62a-caaf-861c74434ba4.png)


Head　Pose esitmationの誤差が他の比較したライブラリに比べて少ないことがTable4, Table5 で示されています。
最新の顔ライブラリとしては、着目すべきライブラリが抜けていることがあることに注意が入ります。


## **インストールしたいライブラリかどうかを見極めよう**
OpenFace がインストールするに値するライブラリかどうかは、YoutubeにあるOpenCvに関する動画などを参考にして調べてみてください。



## **Githubから入手する**
- OpenFace
https://github.com/TadasBaltrusaitis/OpenFace

>Commercial license
>For inquiries about the commercial licensing of the OpenFace toolkit please contact innovation@cmu.edu

### **OpenFaceのインストール(Docker)**
[Quickstart usage of OpenFace with Docker (thanks Edgar Aroutiounian)](https://github.com/TadasBaltrusaitis/OpenFace/wiki#quickstart-usage-of-openface-with-docker-thanks-edgar-aroutiounian)

私としては、Dockerを利用したインストールを推奨します。そうでなければ、PythonやOpenCVやdlibなどのバージョンの組み合わせで苦労するはずです。私の場合もDockerの設定を利用してようやく、各種の例題が使えるようになったところです。

```
# build/bin/FaceLandmarkImg -f sample1.jpg
```

![sample1.jpg](https://qiita-image-store.s3.amazonaws.com/0/83761/f819db1a-e163-096b-f333-a14fb70d101d.jpeg)sample1.jpg

![processed.jpg](https://qiita-image-store.s3.amazonaws.com/0/83761/3325bee7-e8d4-b1ea-3789-a0923a37c13a.jpeg)

![face_det_000000.png](https://qiita-image-store.s3.amazonaws.com/0/83761/efb1c5f5-b0cb-7280-5b6f-b44a34bd6e51.png) face_det_000000.bmp

検出結果のなどが以下のファイルに出力されます。
processed/sample1.csv

その中にはAU(Facial Action Unit)の結果も含まれています。以下はその一部を表示させたものです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/83761/6d0492f3-5e38-7ec5-769b-ee6ccb441083.png)


### **OpenFaceのインストール手順**
 https://github.com/TadasBaltrusaitis/OpenFace/wiki/Unix-Installation

Requirement TBB, dlib, OpenBLAS, and OpenCV 




頭部の向きの推定も含んでいる。


## **Facial Action Unit**
OpenFaceには顔の動作を分析するための機能[Facial Action Coding System (FACS)](https://en.wikipedia.org/wiki/Facial_Action_Coding_System)も含まれている。これは商用の顔ライブラリであってもなかなか含まれていないものです。
- [Facial Action Unit Recognition](https://github.com/TadasBaltrusaitis/OpenFace/wiki/Action-Units)

```
-aus output the Facial Action Units
```

![](https://raw.githubusercontent.com/wiki/TadasBaltrusaitis/OpenFace/images/AUs.jpg)

> OpenFace is able to recognize a subset of AUs, specifically: 1, 2, 4, 5, 6, 7, 9, 10, 12, 14, 15, 17, 20, 23, 25, 26, 28, and 45.

それぞれの番号のAUが何を意味するのかはWikipediaを参照してください。


Gaze tracking (image of it in action)

## **コマンドラインでの使い方**
https://github.com/TadasBaltrusaitis/OpenFace/wiki/Command-line-arguments
github の wiki上にある記述はWindowsを想定した次のような記述になっています。

```
FaceLandmarkImg.exe -f "C:\my images\img.jpg"
```

それらは適宜、次のように読みかえます。

```
# build/bin/FaceLandmarkImg -f sample1.jpg
```

[OpenFace wiki Documentation](
https://github.com/TadasBaltrusaitis/OpenFace/wiki/Command-line-arguments#documentation)

コマンドの使い方は、１枚の画像ファイルを指定することも、期別に複数のファイルを指定することも、入力画像ディレクトリを指定することもできるように作られている。

```
Single image analysis

-f <filename> the image file being input, can have multiple -f flags

Batch image analysis

-fdir <directory> - runs landmark detection on all images (.jpg, .jpeg, .png, and .bmp) in a directory
```

ライブラリの使い方を見るには
それぞれのサンプルプログラムのソースコードを読むのがよさそうです。


今の時点ではpythonバインディングはないようです。
腕に覚えのある人は、pythonバインディングを作って提供する手があります。


YoutubeでOpenFaceを検索する。
https://www.youtube.com/results?search_query=OpenFace


OpenFaceを利用したもの
[FACSvatar v0.2.7-Alpha](https://github.com/NumesSanguis/FACSvatar)
![](https://camo.githubusercontent.com/a3000739a7bdb898030c924ca75084cbe15a9d72/68747470733a2f2f696d672e796f75747562652e636f6d2f76692f664930356c7a58426a33732f302e6a7067)


PyPI [openface-reader 0.2.4 ](https://pypi.org/project/openface-reader/)
github [A small Python package for reading OpenFace files. ](https://github.com/akvail/openface_reader)


PyPi [exploface 0.0.0.dev5 ](https://pypi.org/project/exploface/)


### OpenFaceのダウンロード後のディレクトリ
以下のライブラリが含まれているので巨大なディレクトリになります。

lib/3rdParty/CameraEnumerator 
lib/3rdParty/OpenBLAS 
lib/3rdParty/OpenCV3.4 
lib/3rdParty/boost 
lib/3rdParty/dlib 
lib/3rdParty/tbb



## 未確認の内容
Age, Genderについては、このメモを書いている時点では、OpenFaceには含まれていない様子。
十分に顔画像の正規化ができているのだから、十分な数のデータとしかるべき学習があれば、性能が高いものが作られても不思議ではない。
dlibでの画像の正規化を持ちている開発中の各種オープンソースがOpenFaceに合流してくれればうれしいな。

### 私見：
- OpenFaceを使う際には、Cudaを使えるマシンを使用することです。
- 商用ライブラリを導入する際には、性能の比較をする際の一つのリファレンスにOpenFaceを用いることが考えられます。
    - **５年前に改良が止まってしまった商用ライブラリ**の場合には、深層学習ベースのOpenCVの顔検出、dlibの顔検出などの方が、顔検出の性能が上回っている場合があります。
    - オープンソースの顔ライブラリが向上しているといっても、実効速度のチューニングは、**よくメンテナンスされている種類の商用ライブラリ**の方が性能が高いことが多いです。そのような商用ライブラリは、国内外を十分に調査することです。
   
- 顔の特徴点landmarkの導出は、顔照合や顔の属性判定など多くの顔ライブラリの性能のベースを決めるものです。十分に性能の高い顔の特徴点を決めるライブラリを用いて、それをベースに発展的な機能を開発すべきでしょう。
- 顔のライブラリを選択する際の注意点としては、アジア系の顔に対しても十分な性能があるのかをしかるべきデータベースで確認することです。
- 顔ライブラリの機能のうち必要な機能が少ない場合（検出だけ）や、顔の検出が正面顔だけとれればよいなどの条件のときには、負荷量の少ないライブラリを選択する可能性もあります。


### 商用ライブラリの開発者へのお願い
オープンソースのライブラリの性能ががあっているといっても、サポートのある商用ライブラリの価値はあります。
オープンソースのノウハウは開示されています。オープンソースに負けないでそれ以上の性能を維持し続けてください。
オープンソースの性能はえてして偏ったデータセットで性能が優れているだけであって、あなたが使いたいデータの入力に対して性能が高いとは限りません。（例：東洋人やアフリカ系の顔に対しては、西洋系の顔ほど性能が確保できていないことがあります、西洋系で訓練された年齢推定ライブラリは、東洋系の人に対して適切な値を返しません。）


### 関連情報
qiita [深層学習が用いられている顔の属性推定について調査中](https://qiita.com/nonbiri15/items/e097066a9d39972b994b)


---

顔照合のOpenFaceの情報は
[OpenFace(顔照合) について調査中](https://qiita.com/nonbiri15/items/c720dbf17c8eaf229c54)に別項目にいたしました。