写真からランドマークの座標を検出する方法を調べている。
以前に、マンガのキャラクターの顔に対して、畳み込みニューラルネットワークから座標を直接回帰する方法を試したことがあったが、それなりに検出できていた。
DCNNによるマンガキャラクターの顔パーツ検出 - TadaoYamaokaの開発日記
DCNNによるマンガキャラクターの顔パーツ検出(追試) - TadaoYamaokaの開発日記
同じ方法を、写真データに対して試したところ、うまくいかなかったため、最新手法はどうなっているか調べてみた。
サーベイ論文
ランドマークの検出は、姿勢推定や顔のランドマーク検出といったタスクに共通した問題である。
顔のランドマーク検出のサーベイ論文によると、変形可能なメッシュにフィッテングする、回帰木や勾配ブースティングを用いた手法の精度は実写画像に対しては精度が不十分で、畳み込みニューラルネットワークを用いた手法により大幅に改善されていることが示されている。
[2101.10808] Fast Facial Landmark Detection and Applications: A Survey
畳み込みニューラルネットワークを用いた手法は、主に、座標を直接回帰する方法と、ヒートマップベースの手法がある。
最新の手法の多くはヒートマップベースもしくは、ヒートマップと回帰を組み合わせた手法である。
ここでは、SOTAのアルゴリズムは顔のランドマークに特化した手法を使っているが、顔以外の画像のランドマークでも使える手法で精度が高いHRNetV2を試してみた。
HRNetV2
HRNetV2は、高解像度から低解像度までの複数の畳み込みニューラルネットワークのブランチで構成されていて、最後に複数解像度の特徴を合計して出力する構成になっている。
出力は、ランドマークごとのヒートマップになる。
[1908.07919] Deep High-Resolution Representation Learning for Visual Recognition
高解像度とはいっても出力は64x64なので、座標の値としてはそれほど解像度が高くない。
ソースリポジトリ
HRNetV2はGitHubでソースコードが公開されている。
GitHub - HRNet/HRNet-Facial-Landmark-Detection: This is an official implementation of facial landmark detection for our TPAMI paper "Deep High-Resolution Representation Learning for Visual Recognition". https://arxiv.org/abs/1908.07919
データセット
COFW、AFLW、WFLW、300Wといったデータセットに対応しているが、ここでは300Wで試してみた。
アノテーションデータは、GitHubのREADMEにOneDriveのリンクが記載されているので、そこからダウンロードする。
画像データは、別途自分でダウンロードする必要がある。
300Wのデータセットへのリンクは、ここにまとまっていた。
landmark-detection/README.md at master · D-X-Y/landmark-detection · GitHub
- To download i-bug: https://ibug.doc.ic.ac.uk/download/annotations/ibug.zip
- To download afw: https://ibug.doc.ic.ac.uk/download/annotations/afw.zip
- To download helen: https://ibug.doc.ic.ac.uk/download/annotations/helen.zip
- To download lfpw: https://ibug.doc.ic.ac.uk/download/annotations/lfpw.zip
テスト用のデータセットは、ibugのサイトにあるpart1~part4のリンクからダウンロードできる。
i·bug - resources - 300 Faces In-the-Wild Challenge (300-W), ICCV 2013
ソースコードの修正
PyTorchとscipiのバージョンが古いため、最新のPyTorchでは動かなかった。以下の通り修正を行った。
PyTorch 1.10対応 · TadaoYamaoka/HRNet-Facial-Landmark-Detection@2834931 · GitHub
300WのData Augmentationのコードにバグがあるのか、たまに画像の範囲外をcropしようとして例外が起きるので、例外時にData Augmentationをやり直すコードを追加した。
例外対応 · TadaoYamaoka/HRNet-Facial-Landmark-Detection@22e6434 · GitHub
テストコード(tools/test.py)の推論結果が、数値しかでないので、画像にランドマークを印して出力するようにした。
推論結果を画像出力 · TadaoYamaoka/HRNet-Facial-Landmark-Detection@cd6efcc · GitHub
訓練実行
以下のコマンドで訓練を実行できる。
python tools/train.py --cfg experiments/300w/face_alignment_300w_hrnet_w18.yaml
1GPUで1時間ほどで30エポックの学習が完了する。
推論
以下のコマンドでテストデータに対して推論を実行できる。
python tools/train.py --cfg experiments/300w/face_alignment_300w_hrnet_w18.yaml --model-file output/300W/face_alignment_300w_hrnet_w18/checkpoint_30.pth
まとめ
実写画像のランドマークを検出するための最新の手法を調査した。
比較的新しく汎用的に使える使える手法であるHRNetV2を試してみた。
CoordConvという手法も画像からデカルト座標に変換に有効そうなので別途調べたい。