はじめに
CVPR2019より以下の論文
[1] X. Guo, et. al. "PFLD: A Practical Facial Landmark Detector" CVPR2019
のまとめ
-
公式コード
https://github.com/guoqiangqi/PFLD
その他、有志のpytorch版など多くのコードが存在する -
まとめサイト
akinoriosamura氏のまとめ
https://qiita.com/akinoriosamura/items/657d2ca8cc4163ef13ed
全体像はakinoriosamura氏に譲るとして、ここでは本手法の核心であるloss部分のみまとめ
概要
- 1枚の画像から顔のランドマークを検出する系のモデル
- 従来の精度、特にin-the-wildな環境での精度を上回りつつ、スマホ等でも運用可能な推論速度を達成した
- in-the-wildへの対応としては顔の正面に対する角度が大きいものをより大きなlossとする、一部が隠れたものや特殊な表情のものにより大きなペナルティを与える、等を行っている
- 推論速度への対応としては、back-boneのネットワークにmobileNet-v2を使用している
loss
lossを工夫することで角度、occlusion、表情の変化に対応している。
まず、一般的なlossを以下とする。
\mathcal{L} := \frac{1}{M} \sum^M_{m=1} \sum^N_{n=1} \gamma_n \| {\rm d}^m_n \| \tag{1}
ここで
$M$: data数
$N$: ランドマーク数
$\gamma_n$: ランドマークごとの掛け率
$| {\rm d}_n^m |$: 推論値とtargetとの距離。具体的にはL1やL2。
γに添字 m がないのはなぜ? 意味からすると、この値はデータごとに変わるはずだが。
これを本手法では以下のようにする。
\mathcal{L} := \frac{1}{M} \sum^M_{m=1} \sum^N_{n=1} \left( \sum^C_{c=1} \omega^c_n \sum^K_{k=1} \left( 1 - \cos \theta^k_n \right) \right) \| {\rm d}^m_n \|_2^2 \tag{2}
γが括弧内に置き換わった。
同様に括弧内に添字 m がないのはなぜ?既に右上に添字があるからゴチャゴチャになるのを避けたか?
まず
\sum^K_{k=1} \left( 1 - \cos \theta^k_n \right)
の部分だが、これは顔の正面に対するヨー、ピッチ、ロールの3つの角度。よってこれら角度が大きいほどlossへの掛け率が大きくなり、より重点的に学習される。
次に
\sum^C_{c=1} \omega^c_n
部分。dataを人の属性、顔の角度、表情、オクルージョンで分類し、data数が少ないカテゴリーほどより大きな重みとなるよう、カテゴリーの数の逆数としている。
ネットワーク構造と学習の方法
ネットワーク構造は以下。
下側がランドマークを推定する部分。上側の補助的なブランチは学習時のみ使用し、角度を推定する。
back-boneはmobilenet-v2を用いることで高速化を実現している。
実験と結果
推論速度
まず気になる推論速度から。
(A)はモバイルcpu、(G)はGPU(GTX1080Ti)、(C)パソコンCPUとして、
となる。より小型のPFLD 0.25Xではモバイルでも7m second。
精度
AFLW-full datasetにおける他モデルとの比較は以下。normalized mean errorで見てるので、低い方が精度が良い。
1Xだと当時のSOTA。0.25XでもSOTAに近い。