2021~2024の顔認証 深層学習モデルまとめ

## はじめに

この記事では自分が業務上使う都合で、直近3年でインパクトが大きく**実用性が高そう**な顔認証に関する深層学習の論文を**5つ**紹介する。

顔認証では深層距離学習という手法が用いられる。同一人物の顔画像は近づけて異なる人物の顔画像は遠くなるように特徴を学習していく。

動向としては顔認証に限らずそうだが二つの方向で差分を出す研究が多い。一つは深層距離学習の**損失関数**をいじって学習の質や効率を高める方向、もう一つは深層距離学習の**バックボーン**を改良するタイプである。



## 1. [EdgeFace](https://arxiv.org/pdf/2307.01838v2)
- 2024 IEEE Transactions on Biometrics, Behavior, and Identity Science
- 主に**バックボーン**を改良
- エッジデバイス上でリアルタイムかつ高精度な顔認識が可能。
- CNNとVision Transformer(ViT)を組み合わせたモデル(EdgeNeXt-inspired)を使用（下図）。
    - EdgeNeXtでは、CNN -> ViTの順に処理が行われ、最初にCNNから得た特徴マップをトークンに変換し、Vision Transformerに与える。これにより局所の特徴と大域的な情報の両者が学習可能。

![スクリーンショット 2024-06-13 17.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680028/7c357fa5-cec1-4f1c-b5ed-2774634cb599.png)

- その他軽量化・高速化のための細かい工夫が多数取り入れられている。
    - 蒸留学習
    - アーキテクチャ内に後述2.の`GhostFaceNets`と同じGhostモジュールを取り入れている
    - 低ランクリニア層（重みを二つの小さな行列に近似的に分解し、パラメータ数を削減）
- 結果
    - LFWデータセットに対して99.73%
    - IJB-B, IJB-Cデータセットに対してそれぞれ93.58%, 95.63%
    - AgeDB-30データセットに対して96.93%
    - LFWデータセットに関しては、パラメータ数1.77M, FLOPs154MでSoTAを達成。
- BSD 3-clause ライセンスの[コード](https://github.com/otroshi/edgeface.git)が提供されており、学習済みモデルも提供されている


## 2. [GhostFaceNets](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=10098610 "GhostFaceNets")

- 2023 _IEEE Access_
- 主に**バックボーン**を改良
- `GhostNet`という既存の２０２０の画像分類モデルを基盤として、これを微調整。著者は`GhostNet`開発チームとは全然違うチーム。

- GhostNet自体はGhostFaceNets著者らが作ったモデルではないが、簡単に解説：
    - 特徴マップの「冗長性（類似した特徴マップ＝”Ghost”の存在）こそが大事だ」という仮説を立てている。
    - 著者らは下の図のように、冗長なマップは片方させあればもう片方を作り出せるのでは？と考えた。
    - 特徴マップに線形変換を加えたGhostマップを追加して、出力となる特徴マップを取得する。
    - ここで”線形変換”と言っているのは、同じ特徴マップ内のピクセルであれば同じ変換が施される。
<img width=700 alt=ghostnet src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680028/ca1969c7-7ec4-1fbc-6bc5-4c9551da065d.png>


- `GhostNet V2`（v2もGhostFaceNets著者らとは特に関係ない）から以下の点を変更
  - 活性化関数を修正
  - 損失関数がArcFace損失関数
  - データセットが、`MS-Celeb-1M`などの顔認証用のデータ

- 結果
  - LFWデータセットに対して、99.8667% （SoTA）
  - CFP-FPデータセットに対して、99.9143% (SoTA)
  - IJB-B,IJB-Cデータセットでそれぞれ96.48%, 97.75%
  - AgeDBデータセットで、98.62% (SoTA)
  - LFWデータセットではパラメータ数6.88M、FLOPsは272.105M

- MIT ライセンスの[コード](https://github.com/HamadYA/GhostFaceNets.git)が提供されており、学習済みモデルも提供されている。


## 3. [AdaFace](https://arxiv.org/abs/2204.00964)
- 2022 IEEE/CVF conference on computer vision and pattern recognition
- **損失関数**を改良
- 顔認証のスタンダード`ArcFace`損失関数を改良
    - 画像の品質に応じて動的にマージンを調整（Quality Adaptive Margin）
    - 高品質の画像には大きいマージン、低品質の画像には小さいマージンを適用
    - 画像の品質評価は、別個でCNNを事前に学習させ、品質のスコアを予測することができる
- アーキテクチャは特に指定がないが、CNNアーキテクチャに対する適用が想定されている
- 深層距離学習を行う従来のバックボーンに加えて、損失関数を決定するために品質を予測するCNNが追加された（下図(b)よりImage Quality Indicatorの部分）

<img width=700 alt=ghostnet src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680028/cf9c7185-d88f-a11e-1786-01afd2a37be4.png>



- 結果(BackboneはResNet100)
    - LFWデータセットに対して、99.82%
    - IJB-B, IJB-Cデータセットに対して、それぞれ96.03%, 97.39%
    - AgeDBデータセットに対して98.57%
- MITライセンスの[コード](https://github.com/mk-minchul/AdaFace.git)が提供されており、学習済みモデル(BackboneはResNet)も提供されている


## 4. [PartialFC](https://arxiv.org/pdf/2203.15565)
- 2022 IEEE/CVF Conference on Computer Vision and Pattern Recognition
- **損失関数**を改良
- 多数の個人で少数の画像しか存在しないような、いわゆる”ロングテール型”のデータに対する課題を効率良く解決
    - 既存の深層距離学習手法の課題
        - GPU消費が大きい。
        - バッチ処理時に、ヘッド側（＝Majority）のサンプルが採択されやすく、テール側のクラスの特徴は中々更新されない。
        - テール側のサンプルが選ばれたとしても、そいつとは異なる、多数のヘッド側の特徴（＝負例）に引っ張られてしまい、テールクラスの特徴が学習されにくい
        - 解決策
            - ミニバッチのサンプルが損失を求める際に、既存手法は全てのクラス代表値との距離を用いていたが、PartialFCは、ランダムに一部のクラス代表値を採択し、計算量削減と、重み更新の不均衡を解消
- 結果（BackboneはResNet50, ResNet100）
    - IJB-B, IJB-Cデータセットに対して、それぞれ96.1%, 97.3%
    - LFWデータセットで99.83%
    - CFP-FPデータセットに対して99.33%
    - AgeDBデータセットに対して98.57%

- MIT ライセンスの[コード](https://github.com/deepinsight/insightface/tree/master/recognition/partial_fc)が提供されており、学習済みモデル(BackboneはResNet)も提供されている


## 5. [MagFace](https://arxiv.org/abs/2103.06627)
- 2021　IEEE/CVF conference on computer vision and pattern recognition
- **損失関数**を改良
- `ArcFace`損失関数を改良
    - ArcFaceは画像に対応する特徴ベクトルの向きをもとに類似度を算出していたが、ここに「大きさ」の概念を導入。
    - 高品質な画像は、より「大きい」特徴ベクトルであると仮定。
    - この大きさに応じて異なるマージンが設定される。高品質の画像はクラス中心に近づき、低品質の画像はクラス中心から遠ざかるように補正する
    - 下図のようなイメージ。$W$と$W'$はそれぞれ異なるクラスの中心。$B$が決定境界。(a)はArcFace、(b)はMagFaceのマージンを描画。`m1`は高品質の画像、`m3`が最も低品質の画像に対応
    - そして、実験によって特徴ベクトルの「大きさ」が大きくなると、品質が実際に良い画像であることが一部の例を使って示されている。

<img width=700 alt=magface src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680028/d08f0641-8767-d9b2-ff1a-57307f45b307.png>

- 結果（BackboneはResNet100）
    - LFWデータセットで99.83%
    - CFP-FPデータセットに対して98.46%
    - AgeDBデータセットに対して98.17%
    - IJB-B, IJB-Cデータセットでそれぞれ94.51%, 95.97%
- Apache-2.0ライセンスの[コード](https://github.com/IrvingMeng/MagFace.git)が提供されており、学習済みモデル（BackboneはResNet）も提供されている。

## おまけ （InsightFaceという便利ツールの紹介）
　訓練を行ったガッツシ開発する場合には不要だが、実用上これまでのようなモデル部分、損失関数部分で「より良いものを探す」ということにリソースを割くことになるとは思うが、やはり大事なのはどんなデータセットで事前学習させた「何に向いている」モデルを使うかという点も欠かせない。例えば白人をメインで事前学習させたデータセットでアジア人の特徴を取って来ても有意義な特徴は得られない。そこで、それらを包括的にまとめたフレームワークとして**InsightFace**を紹介しておく。これはMITライセンスの[コード](https://github.com/deepinsight/insightface.git)が提供されている。
　 InsightFaceでは、ResNet、MobileFaceNetなど様々なモデルを様々なデータセットに対して事前学習させた学習済みモデルを提供してくれている。損失関数は主にArcFace損失関数(他にもCosFace関数もある)が使われている。このリポジトリの素晴らしいところは以下のような`model_zoo`が提供されているところであり、そこでは
  
- **事前学習データごとに人種の違う様々なデータでどのくらいの精度が出たかという情報**
- **その時の学習済みモデルをONNXで提供してくれている**

という二つの貢献がなされている。これがラクなので最初はここからターゲットにしている問題設定と近いデータセットで最も高精度な事前学習済みモデルを選ぶのもありかなと思う。
![スクリーンショット 2024-08-20 1.27.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680028/ae869948-b6ff-9a0b-09d6-e8957d47e045.png)


# 所感

何を重視するか、そしてどんな難易度を想定しているか次第だと感じた。

- EdgeFaceがとりあえず軽くて手軽で早そう。そして多くの場合、SoTAの精度を叩き出している。
- GhostFaceNetsもEdgeFaceよりはパラメータ数やFLOPsは重く動作が遅い可能性が高いが、精度重視で考えるなら多くの場合はこちらがベターかと思われる。
- GhostFaceNetsは損失関数としてArcFace/CosFaceを使っているが、後半3つの論文はいずれもこれらを改良したものなので、もし一から訓練させる方がいればGhostFaceNets + MagFaceとか色々と組み合わせを試すのもありかもしれない。
- 困ったらInsightFaceを使うと取り敢えずラク。

# 参考
1. EdgeFace : https://arxiv.org/pdf/2307.01838
1. GhostFaceNets : https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=10098610
1. AdaFace : https://arxiv.org/abs/2204.00964
1. PartialFC : https://arxiv.org/pdf/2203.15565
1. MagFace : https://arxiv.org/pdf/2103.06627