アノテーションルールはどう作られるのか　顔検出を例に



画像認識を機械学習で開発することとなって、どのような実装を開発するか決まったとき、
次に決める必要があるものの１つは、アノテーションルールを明らかすることだ。

## 顔検出の場合
### Haar-Cascade 検出器の時代
- Haar-Cascade 検出器で、正面顔の検出器の場合には、両目のそれぞれの目の中央の位置を基準として、正方形の領域を顔位置として検出するものが多かった。
- https://docs.opencv.org/3.4/db/d28/tutorial_cascade_classifier.html
- ![](https://docs.opencv.org/4.5.2/haar.png)
- それらに対して、一定のルールで回転画像を加えて学習させており、基本は、両目の位置が水平になっている画像が基本になっていた。
    - 両目の位置を基準に正規化するやりかたでは、大人の顔と子どもの顔で、口の位置が違ってくるという課題を生じる。
    - 子どもの顔は大人の顔に比べて丸っこく、両目の位置で正規化すると、口の位置が上側になる傾向がある。
- ただ、その流儀では、横向きの顔の検出を行う際に、どの範囲を顔の正解の位置とするかを、だれもが納得する流儀で決定することができなかった。
    - 多くの実装は、目の位置と口の中央の高さが一定になるようにする実装であるようだが、顔の前後方向への傾き具合をどうするのかが、必ずしも一致をみていないようだった。
    - 頭部を前後左右に方向けたときに、どのように正解の傾けたときには、正解のアノテーションの決め方が難しくなった。

検出目的のアノテーション場合には、ターゲットのオブジェクト（この場合は顔）について、共通性が高くなるように顔の正解の位置を定める。
そこで選ばれたのが、両目のそれぞれの中心の位置を一致させるアノテーションルールである。両目のそれぞれの中央の位置があわせられると、鼻の位置、口の位置は共通性が自然と高くなる。


### 深層学習での顔検出の場合
これが、深層学習の実装での顔検出プログラムになると、使われるアノテーションも変わってくる。

- 検出領域が正方形であるという制約はなくなった。
- 顔検出の結果の一例は次のとおりだ。
https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/
- 顔として定義する領域の範囲の定義が、Haar Casecade 検出器の時代とは変わった。

### 顔画像の正規化の重要性

- 顔照合の場合、顔画像の大きさと顔パーツの位置をそろえて比較することが重要になる。
- 顔照合の実装の代表的な１つには、正規化済みの顔の輝度画像を固有顔に展開して、展開係数を元に顔の類似度を評価するものがある。
![固有顔 eigenface](https://docs.opencv.org/4.5.2/eigenfaces_opencv.png)
固有顔(eigenface)
- https://docs.opencv.org/4.5.2/da/d60/tutorial_face_main.html



### 顔のlandmark の決定
顔を見つけるだけではなく、顔照合を考えるのであれば、顔の詳細な情報を必要とする。
その標準的なやり方は、顔のlandmark を求めるものだ。
顔照合を含む顔検出プログラムでは、顔のlandmarkを算出する機能を含むものが多い。
顔のlandmarkとは、目や口、鼻、眉毛、顔の輪郭点などの位置を示すものです。

https://docs.opencv.org/master/d2/d42/tutorial_face_landmark_detection_in_an_image.html

顔のlandmarkの位置は、次のように使われます。

- 顔照合のための特徴を算出するための顔の正規化に使われます。
- 顔のパーツの位置を理解して、顔画像を加工します。
    - 目の大きさを大きくする。
    - ヒゲやメガネを書き加える。
- 顔のパーツの位置の変化で、表情の変化を判断させる入力とする。
- 顔のパーツの位置を元に、顔の向き(head pose)を推定させるための入力とする。

このための顔のlandmark の定義は、それぞれの顔照合のシステムで異なるものになっています。
landmarkの点の数自体も異なります。
顔landmarkの例

### dlib face landmark 
![](https://www.pyimagesearch.com/wp-content/uploads/2017/04/facial_landmarks_68markup-768x619.jpg)
Fig dlib face landmark definition

### [facial-landmarks-35-adas-0002](https://docs.openvinotoolkit.org/2019_R1/_facial_landmarks_35_adas_0002_description_facial_landmarks_35_adas_0002.html)
![](https://docs.openvinotoolkit.org/2019_R1/landmarks_illustration.png)


### [landmarks-regression-retail-0009](https://docs.openvinotoolkit.org/2019_R1/_landmarks_regression_retail_0009_description_landmarks_regression_retail_0009.html)
![](https://docs.openvinotoolkit.org/2019_R1/landmarks-regression-retail-0009.png)

https://qiita.com/nonbiri15/items/e097066a9d39972b994b

### 参考にするべき実装
- [dlib](http://dlib.net/) の顔ライブラリ
- dlib ベースの顔ライブラリ[Face Recognition](https://github.com/ageitgey/face_recognition)
    - [pip でのインストール](https://pypi.org/project/face-recognition/)
- [OpenVino の顔照合の例](https://docs.openvinotoolkit.org/2020.3/_demos_python_demos_face_recognition_demo_README.html)
- [Face Recognition using Tensorflow](https://github.com/davidsandberg/facenet) 
- [OpenFace](https://cmusatyalab.github.io/openface/)

### いまのタイミングで考慮する項目
- マスクをしたときの顔での顔検出
    - [Real-World Masked Face Dataset（RMFD)](https://github.com/X-zhangyang/Real-World-Masked-Face-Dataset#real-world-masked-face-datasetrmfd)
- マスクをしたときの顔での顔照合

## あなたの利用目的では何が必要かを考えよう

- あなたの目的がパスポートの照合ならば、マスクをした顔の検出やマスクをした顔での顔照合は不要だ。
    - マスクを外した状態で顔照合をする必要があり、その状態での顔照合に成功すれば十分なのだから。
 
### 顔照合を元に決済をしようとする場合：
- 例：スマートフォンのオーナーの顔だけを照合すればよい場合
- 十分に照合できる条件について、他人のなりすましを排除できればいい。
- ユーザーには協力行動をしてもらえることを前提としてよい。

### 顔照合をだけ元に決済をしようとする場合：
- 例：コンビニでの顔照合による決済
- 実験的な店舗で、顔だけを元に決済をする(クレジットカードなどの提示はしない)。
-  似ている人が出てくると、スマートフォンでのオーナーの顔照合に比べて格段に難しくなる。

### あなたの利用目的では、何を実現しようとするのか
- 検出漏れがあったときの影響は？
- 誤検出があったときの影響は？ 
- そういったことを考えて、どのような範囲で顔を検出・顔を照合をしたいのかを考えることだ。


## カメラの特性とカメラの設置条件は
- 顔の検出器を考えるときに、カメラの特性は無視できない。
- カメラが広角で歪みが生じるカメラの場合には、歪みを生じた顔画像を検出できるようにしなくてはならない。

### カメラの設置条件
- 人の視線の高さか、天井から見下ろすものか、人よりも低い高さから見上げるものか（例：aibo）
- それによって人の顔の見え方が変わってくる。
- 天井から３０度の角度で見下ろすカメラの場合だと、その分、顔を見下ろした画像になる。
- 一方aiboからの画像だと、人のあごが突き出したような顔になりやすい。
- model zoo にあるモデルがADAS用だったり,retail用だったりするのは、そのようなカメラの設置条件の違いがあるからだ。
  

## もし、既存の学習結果があなたの目的に不十分な場合
- 可能な限り既存の検出器と整合性がある定義をしましょう。
- 検出位置の定義やlandmarkの位置が共通であれば、既存のデータセットが利用できたりします。また、既存の検出器を使って、仮のアノテーションを作成することができます。
- 顔のlandmarkを検出させるのが、仮に東洋人について精度が出なかったとします。その場合、landmarkの位置を検出させるための学習をやり直しても、landmarkの位置から顔の向き(head pose)を推定させる部分については、そのまま使える可能性があります。

## アノテーションルールを決めて、学習用データを構築することは、ほぼほぼ検出器を作りあげること
### どの程度まで劣化した画像を学習のポジティブサンプルに加えるか？
- ピントがボケた画像
- 動きでブレた画像
- 暗い環境での画像
- 検出対象物に隠れ（オクルージョン）がある画像
- ガラス越しの対象物の画像
- 対象物がポスターに写っている場合の扱い
- 小さく写った対象物の画像
- 偏った照明条件での対象物の画像

これらの画像をどこまでポジティブサンプルに加えるかは、学習結果の利用目的によって変わってくる。
それらを考えて、あなたの場合の学習用・評価用のデータセットを作ることだ。

## 検出してもしなくてもよいどっちつかずのものは、学習用・評価用の画像から外すことも考えること

- 再現率・適合率を考える際には、どっちつかずの対象物は、トラブルの元になる。
    - 安全な対処方法は、画像からその部分を塗りつぶしておくこと。
    - 例：顔のイラストがあった場合
    - 顔のイラストに正解枠を付与すると、見つけなければならない対象にしてしまうこと。
    - 顔のイラストに正解枠を付与しないと、見つけてしまうと誤検出と判定してしまうことになる。
    - だから、検出してもよいししなくてもよい画像は、その部分を塗りつぶしておくのが得策だ。