概要
顔の姿勢推定モデルimg2poseを提案している論文を読んだので紹介してみます。
本手法の特徴は、既存の多くの顔の6自由度(6DoF)の姿勢推定手法において事前処理として採用されている顔検出やランドマーク定位を行わず、直接に、リアルタイム(400x400の画像に対して、41FPS@Titan Xp GPU)での3次元顔姿勢推定を実現しているという点です。
また、本手法は、推定された3次元姿勢をもとに生成された矩形領域を用いることで、一般的な顔検出タスクにも流用することができます。顔の矩形領域を検出する一般的な顔検出タスクにおいて、専用のデータセットで訓練していないにも関わらず、本手法はと同程度複雑さを持つ先端的な顔検出手法を凌駕する精度を達成しています。
本稿では、本モデルのネットワーク構造と6DoFのパラメータの扱い方、訓練に使用される損失関数、データセットの活用の工夫である弱教師あり学習の設定について確認していきます。
書誌情報
- Albiero, Vitor, et al. "img2pose: Face Alignment and Detection via 6DoF, Face Pose Estimation." arXiv preprint arXiv:2012.07791 (2020).
- arxiv
- 公式実装
ネットワーク構造と6DoFの扱い方
ネットワーク構造
img2poseのネットワーク構造は、Faster R-CNNをベースとした比較的単純なものです。
まず、入力された画像から、バックボーンであるResNet-18をもとにしたFeature Pyramid Network(FPN)によって、特徴ピラミッドが抽出されます。次に、特徴ピラミッドの各階層で、Region Proposal Network(RPN)によってRoIが提案されます。最後に、RoI Poolingによって特徴ピラミッドから固定サイズの特徴マップが抽出され、FC層によって2種類のパラメータが推定されます。
2種類のパラメータのうち1つ目は、RoIが顔領域か否かを表すFaceness Scoreです。もう1つは、顔の姿勢である6DoFのパラメータ$\mathbf{h}_i^{prop}$です。
6DoFの扱い方
RoI Poolingによって得られる特徴マップは画像全体から切り取られているために、それをもとに推定されたパラメータ$\mathbf{h}_i^{prop}=(r_x, r_y, r_z, t_x, t_y, t_z)$は、RPNによって提案されたRoIの座標系でのものです。最終的には、画像全体の座標系でのパラメータを得たいため、RoIの座標系から画像全体の座標系へと変換してあげる必要あります。
透視投影モデルを前提として、画像全体系の投影行列$\mathbf{K}_{i m g}$とRoI Poolingによって切り取られた座標系の投影行列$\mathbf{K}_{b o x}$は、以下のように定義されます。$w, h$は画像の幅と高さを表し、$c_x, c_y$はRoIの座標を表します。
\mathbf{K}_{i m g}=\left[\begin{array}{ccc} w+h & 0 & w / 2 \\ 0 & w+h & h / 2 \\ 0 & 0 & 1 \end{array}\right]
\mathbf{K}_{b o x}=\left[\begin{array}{ccc} w+h & 0 & c_{x}+x \\ 0 & w+h & c_{y}+y \\ 0 & 0 & 1 \end{array}\right]
これらの投影行列を使うと、$\mathbf{h}_i^{prop}=(r_x, r_y, r_z, t_x, t_y, t_z)$は、以下のようなアルゴリズムで画像全体の座標系へと変換されます。$\mathbf{B}$は、RoIの位置やサイズに関する情報$(c_x,c_y,w_{bb},h_{bb})$を表します。
- 2: 焦点距離は画像サイズ$(w, h)$で決められます。
- 3: RoIの大きさ$(w_{bb}, h_{bb})$に反比例するように、深度$t_z$を変換します。これは、顔の大きさはすべての人でおおむね一定であるという前提のもと、RoIが小さければカメラから遠くに存在するはず、という変換になります。
- 4-5:並進パラメータ$(t_x, t_y, t_z)$をRoI座標から全体座標に変換しています。
- 6-8:回転パラメータ$(r_x, r_y, r_z)$をRoI座標から全体座標に変換しています。
以上の手順で、画像の座標系における6DoFパラメータ$\mathbf{h}_{i}^{img}$が得られます。
また、この手順の$\mathbf{K}_{i m g}$と$\mathbf{K}_{b o x}$の役割を入れ替えれば、画像座標系から特定のRoIの座標系へといった逆方向の変換も可能です。
損失関数
本モデルの訓練には、3つの損失関数が使われます。
Face Classification Loss
まず、RPNによって提案された領域が、本当に顔領域なのか否かを表すFaceness Scoreに対する損失関数として、単純なbinary cross entropy lossが使用されます。
ターゲットは、真の顔領域とのIoUによって決められます。
Face Pose Loss
推定された6DoFパラメータに対する損失関数は、以下のような形で与えられます。
L_{\text {pose}}\left(\mathbf{h}_{i}^{\text {prop}}, \mathbf{h}_{i}^{\text {prop} *}\right)=\left\|\mathbf{h}_{i}^{\text {prop}}-\mathbf{h}_{i}^{p r o p *}\right\|_{2}^{2}
$\mathbf{h}_{i}^{p r o p *}$は、画像座標系でアノテーションされているポーズのターゲット$\mathbf{h}_{i}^{i m g *}$から、上述の変換によって得ることができます。
Calibration Point Loss
最後に、得られた6DoFをもとに3次元の顔モデルを動かしたときに、主要なランドマークが2次元画像上の正しい位置に投影されているかを表す損失を考えます。主要なランドマークは例えば、以下の画像のような5点で定義されます。
事前に定義されたランドマーク$\mathbf{P}\in \mathbb{R}^{n\times3}$から、投影したときの座標$\mathbf{Q}\in\mathbb{R}^{n\times2}$を求め、ターゲットとなるランドマーク位置$\mathbf{Q}_{i}^{c *}$と比較して損失を計算します。
[\mathbf{Q}, \mathbf{1}]^{T} \sim \mathbf{K}[\mathbf{R}, \mathbf{t}][\mathbf{P}, \mathbf{1}]^{T}
L_{\text {calib}}=\left\|\mathbf{Q}_{i}^{c}-\mathbf{Q}_{i}^{c *}\right\|_{1}
弱教師あり学習
img2poseの訓練には、6DoFの姿勢アノテーションが行われたデータセットが必要になります。大規模な顔検出データセットであるWIDER Faceデータセット1には顔の矩形領域のアノテーションは施されていますが、姿勢まではアノテーションされていません。
一方、RetinaFace2という既存手法では、WIDER Faceデータセットの一部について、5点のランドマーク(鼻、目の端、口の端)をアノテーションしています。参照となる3次元点を用意してPnP問題を解くことで、2次元平面上にアノテーションされた5点から、6DoFのパラメータを推定することができます。
本モデルの訓練では、学習済みのRetinaFaceモデルによってWIDER Faceデータセットに対するランドマーク検出を行い、それをもとに大量の姿勢アノテーション付きのデータセットを得ています。当然、RetinaFaceモデルは完璧な検出器ではないので、WIDER Faceに付与されている真の顔領域とのIoUが0.5以上の場合のみ、姿勢のアノテーションを付与し、アノテーションが付与されていない顔領域はモデルの訓練時には無視します。
まとめ
以上、img2poseについて、簡単にまとめてみました。
RoIにおける6DoFパラメータと画像全体から見たときのパラメータとの相互の変換というシンプルな工夫によって、ネットワーク構造と損失関数を簡潔にすることができている手法だと思います。
-
Deng, Jiankang, et al. "Retinaface: Single-stage dense face localisation in the wild." arXiv preprint arXiv:1905.00641 (2019). ↩