論文まとめ：MobileFaceNets: Efficient CNNs for Accurate Real- Time Face Verification on Mobile Devices

# はじめに

CCBR 2018より以下の論文
[1] S. Chen, et. al. "MobileFaceNets: Efficient CNNs for Accurate Real- Time Face Verification on Mobile Devices"
のまとめ

- arXiv: 
https://arxiv.org/abs/1804.07573

- github: 
pytorch実装
https://github.com/Xiaoccer/MobileFaceNet_Pytorch
tensorflow実装
https://github.com/sirius-ai/MobileFaceNet_TF
など

# 概要
- 顔認証を行うモデル
- 大型モデルと比較しても遜色ない精度を達成
- モバイル向けモデルと比較した際には精度を上回り、かつ２倍の推論速度を達成
- mobileNetを用いたモデルと比較した場合、最後のglobal average poolingをglobal depth-wise convolutionに替えていて、これが精度向上に寄与している

# 顔認証タスクにおける global average pooling の問題点

昨今のCNNでは出力前に global average pooling を使う場合が多い。しかし著者らに言わせると、こと顔認証においては問題がある。以下の図で

![スクリーンショット 2021-03-16 8.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/eb9f1430-fab9-945d-5859-565672b7334e.png)

last 7x7のfeature mapにおいて、中央の赤いピクセルは、入力画像において赤い矩形領域が受容野となる。一方で、last 7x7 feature mapにおける緑のピクセルは、入力画像において緑の矩形領域が受容野となり、顔の一部を網羅していない。

そうすると、図中右下 learned spatial importance に示したように中央の値は重要（値が高く）なり、端付近は低くなる。<font color="blue">そうすると、「チャンネルによっては顔の端付近の情報を得たい場合に、得られない」という問題が生じる？？？  -> ここ間違ってたら連絡ください</font>

# global depth-wise convolutionを使った解決法
上記問題に対して、本論文では global average poolingをfeature mapと同じサイズのkernel（つまり7x7）によってdepth-wise convすることで、対応している。

つまり出力 $G$ の $m$ 番目の値は入力のfeaturemap $F$ に対して

```math
G_m = \sum_{i,j}K_{i,j,m} \cdot F_{i,j,m}
```

とする。

# ネットワーク
ネットワークは以下。

![スクリーンショット 2021-03-17 5.44.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/3e33a7b7-283d-0822-0434-e4220da43ef2.png)

基本は MobileNet なので、bottleneck 部分は depth-wise conv＋point-wise convに対して residual なショートカットが加わった形。

# loss
ArcFace[2]で提案されたArcFace lossを用いている。

これはArcFace論文によると additive angular margin loss と言っていて、以下のようなもの。

![スクリーンショット 2021-03-17 6.23.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/e0ded852-1837-e1be-0385-521db751a8de.png)

## lossの全体像

まず、点線で囲われた Additive Angular Margin Penalty 抜きで考えてみる。

![スクリーンショット 2021-03-17 6.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/007c5d78-7b2d-8997-c9e6-8b7121b30008.png)

左上、モデルから出力された d 次元の特徴量が $x\_i$。

これを正規化して $\frac{x\_i}{\| x\_i \|}$

一方で左下のように各クラス（行方向の n ）の典型的な d 次元特徴量（列方向）を行列にした $W$を用意する。

これも各列 j に関して正規化しておく。つまり W の j 列目（クラス目）は $\frac{W\_j}{\| W\_j \|}$

この両者の内積を計算する。両者はもともと正規化されてるので、内積は j クラスのコサイン類似度のようなもの。

```math
\cos \theta_j = \frac{x_i}{\| x_i \|} \cdot \frac{W_j}{\| W_j \|}
```

そうすると、コサイン類似度が高い j 列はモデルが最も確率が高いと予測した j クラスとなるので、softmaxを計算すると、確率が計算される。

これに対して通常のクラス分類ごとく target の one-hot ベクトルとで交差エントロピーを計算すればよい。

## Additive Angular Margin Penalty な部分

これに対して、Additive Angular Margin Penalty は文字通り角度ベースでペナルティを加える。

![スクリーンショット 2021-03-17 6.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/c1557a83-23e6-77ba-12a0-8a322dfa9316.png)

具体的には、正解クラス $y\_i$ に対して角度ベースでマージンを加え、結果的にコサインの値を小さくする。

```math
\cos (\arccos (\cos \theta_{y_i}) + m)
```

そうすると、マージンを加えられてもsoftmaxで最大となるよう、$x\_i$ をより代表ベクトルに近づけるよう学習するだろう。


# 実験と結果
## 他のmobile系のモデルとの精度、速度、パラメータ数の比較
datasetはLFW dataset, AgeDB-30 を用いて、以下の結果。


![スクリーンショット 2021-03-16 8.32.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a0dcc46a-48af-7c09-b9e9-29ae054c28c2.png)

精度もスピードもよい

## 他の精度SOTAなモデルとのモデルサイズ・精度比較
LFW datasetを用いて他のSOTAな巨大モデルとの精度・パラメータ数を比較したものは以下。

![スクリーンショット 2021-03-16 8.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116706/a8973d01-ec29-9e6e-ec74-24296208057c.png)

ArcFace等、巨大モデルとも比肩する精度。

# reference
[2] J. Deng, et. al. "ArcFace: Additive Angular Margin Loss for Deep Face Recognition"