Github: https://github.com/deepinsight/insightface
InsightFace:2D / 3D顔分析プロジェクト
Jia GuoとDian Jiankang
ライセンス
InsightFaceのコードは、MITライセンスの下で公開されています。
最近の更新
2018.04.23
: 2018.04.23
実装が利用可能になりました。 この軽量で強力なネットワークバックボーンの使用方法の詳細については、 トレーニングセクションを確認してください。
2018.03.26
:組み合わせマージン(損失タイプ= 5)でトレーニングすることができます。併合マージンの検証結果を参照してください。
2018.02.13
: MegaFace-Challengeで最先端のパフォーマンスを達成しました。 実装の詳細については、当社の論文とコードをご確認ください。
内容
深い顔認識
前書き
このリポジトリでは、深い顔認識のための訓練データ、ネットワーク設定、および損失設計を提供しています。 トレーニングデータには、正規化されたMS1MおよびVGG2データセットが含まれています。このデータセットは、すでにMxNetバイナリ形式でパックされています。 ネットワークバックボーンには、ResNet、InceptionResNet_v2、DenseNet、DPN、MobiletNetがあります。 損失関数には、Softmax、SphereFace、CosineFace、ArcFace、Triplet(Euclidean / Angular)Lossがあります。
- 損失タイプ= 0:ソフトマックス
- 損失型= 1:SphereFace
- 損失型= 2:CosineFace
- 損失型= 4:ArcFace
- 損失型= 5:複合マージン
- 損失型= 12:トリプル損失
我々の方法であるArcFaceは、当初、 arXivのテクニカルレポートで説明されていました。 このリポジトリを使用することで、LFW 99.80%+とMegaface 98%+を単一のモデルで簡単に達成できます。 このリポジトリは、研究者/エンジニアが、バイナリデータセットをダウンロードしてトレーニングスクリプトを実行するという2つのステップによって、迅速な顔認識アルゴリズムを迅速に開発するのに役立ちます。
トレーニングデータ
すべての顔画像がMTCNNによって整列され、 112×112にトリミングされます。
- Refined-MS1M @ BaiduDrive 、 Refined-MS1M @ Googleドライブ
- VGGFace2 @ BaiduDrive 、 VGGFace2 @ Googleドライブ
- バイナリ顔データセットの作成方法については、 src / data / face2rec2.pyを確認してください。 公開されているすべてのMTCNNを使用して顔を整列させることができ、パフォーマンスは変化しません。 私たちは最近、完全なポーズアライメント方法によって顔の正規化ステップを改善します。
注意:洗練されたMS1Mデータセットと切り取られたVGG2データセットを使用する場合は、元の論文を引用してください。
列車
- GPUをサポートした
MXNet
をインストールする(Python 2.7)。
pip install mxnet-cu80
- InsightFaceリポジトリをクローンします。 ディレクトリ
INSIGHTFACE_ROOT
ます。
git clone --recursive https://github.com/deepinsight/insightface.git
- トレーニングセット(
MS1M
)をダウンロードし、$INSIGHTFACE_ROOT/datasets/
ます。 各トレーニングデータセットには、次の7つのファイルが含まれます。
faces_ms1m_112x112/
train.idx
train.rec
property
lfw.bin
cfp_ff.bin
cfp_fp.bin
agedb_30.bin
最初の3つのファイルはトレーニングデータセットであり、最後の4つのファイルは検証セットです。
- 深い顔認識モデルを訓練する。 この部分では、
$INSIGHTFACE_ROOT/src/
ディレクトリにいると仮定しています。
export MXNET_CPU_WORKER_NTHREADS=24
export MXNET_ENGINE_TYPE=ThreadedEnginePerDevice
以下にいくつかの例を示します。 私たちの実験はTesla P40 GPUで行われました。
(1)。 LResNet100E-IRでArcFaceをトレーニングしてください。
CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train_softmax.py --network r100 --loss-type 4 --margin-m 0.5 --data-dir ../datasets/faces_ms1m_112x112 --prefix ../model-r100
2,000バッチごとにLFW 、 CFP-FF 、 CFP-FP 、 AgeDB-30の検証結果を出力します。 train_softmax.pyのすべてのコマンドラインオプションを確認できます。 このモデルはLFW 99.80+とメガファース98.0%+を達成することができます。
(2)。 LResNet50E-IRを使用してCosineFaceをトレーニングします。
CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train_softmax.py --network r50 --loss-type 2 --margin-m 0.35 --data-dir ../datasets/faces_ms1m_112x112 --prefix ../model-r50-amsoftmax
(3)。 LMobileNetEでSoftmaxをトレーニングする。
CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train_softmax.py --network m1 --loss-type 0 --data-dir ../datasets/faces_ms1m_112x112 --prefix ../model-m1-softmax
(4)。 上のソフトマックスモデルを三重項ロスで微調整してください。
CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train_softmax.py --network m1 --loss-type 12 --lr 0.005 --mom 0.0 --per-batch-size 150 --data-dir ../datasets/faces_ms1m_112x112 --pretrained ../model-m1-softmax,50 --prefix ../model-m1-triplet
(5)。 VGGFace2データセットでSoftmaxが失われたLDPN107Eネットワークをトレーニングします。
CUDA_VISIBLE_DEVICES='0,1,2,3,4,5,6,7' python -u train_softmax.py --network p107 --loss-type 0 --per-batch-size 64 --data-dir ../datasets/faces_vgg_112x112 --prefix ../model-p107-softmax
(6)。 MS1Mデータセット上のArcFaceでMobileFaceNetネットワークをトレーニングします。
CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train_softmax.py --network y1 --loss-type 4 --margin-s 128 --margin-m 0.5 --per-batch-size 128 --emb-size 128 --data-dir ../datasets/faces_ms1m_112x112 --wd 0.00004 --fc7-wd-mult 10.0 --prefix ../model-mobilefacenet-128
- 検証結果。
ArcFaceの損失を伴うMS1MデータセットでトレーニングされたLResNet100E-IRネットワーク:
方法 | LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) |
---|---|---|---|---|
私たちのもの | 99.80+ | 99.85+ | 94.0+ | 97.90+ |
ArcFaceの損失を伴うVGGFace2データセットでトレーニングされたLResNet50E-IRネットワーク:
方法 | LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) |
---|---|---|---|---|
私たちのもの | 99.7+ | 99.6+ | 97.1+ | 95.7+ |
訓練集合重複を除去した後の検証精度を、評価基準に厳密に従うように報告する。 (C) means after cleaning
データセット | アイデンティティ | イメージ | 同意者(C) | 画像(C) | Acc | Acc(C) |
---|---|---|---|---|---|---|
LFW | 85742 | 3850179 | 80995 | 3586128 | 99.83 | 99.81 |
CFP-FP | 85742 | 3850179 | 83706 | 3736338 | 94.04 | 94.03 |
AgeDB-30 | 85742 | 3850179 | 83775 | 3761329 | 98.08 | 97.87 |
事前トレーニングされたモデル
$INSIGHTFACE/src/eval/verification.py
を使用して、事前に訓練されたすべてのモデルをテストすることができます。
- LResNet50E-IR @ BaiduDrive 、 @ GoogleDriveパフォーマンス:
方法 | LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) | メガファース(%) |
---|---|---|---|---|---|
私たちのもの | 99.80 | 99.83 | 92.74 | 97.76 | 97.64 |
- LResNet34E-IR @ BaiduDriveパフォーマンス:
方法 | LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) | メガファース(%) |
---|---|---|---|---|---|
私たちのもの | 99.65 | 99.77 | 92.12 | 97.70 | 96.70 |
Caffe
LResNet50E-IR @ BaiduDrive 、上記MXNetモデルで変換。 パフォーマンス:
方法 | LFW(%) | CFP-FF(%) | CFP-FP(%) | AgeDB-30(%) | メガファース1M(%) |
---|---|---|---|---|---|
私たちのもの | 99.74 | -TBD- | -TBD- | -TBD- | -TBD- |
複合マージンの検証結果
目標ロジット値とオリジナルθ
関数として合成マージン法を提案した。
COM(θ) = cos(m_1*θ+m_2) - m_3
m1=0.9, m2=0.4, m3=0.15
トレーニングの場合は、次のコマンドを実行します。
CUDA_VISIBLE_DEVICES='0,1,2,3' python -u train_softmax.py --network r100 --loss-type 5 --margin-a 0.9 --margin-m 0.4 --margin-b 0.15 --data-dir ../datasets/faces_ms1m_112x112 --prefix ../model-r100
方法 | m1 | m2 | m3 | LFW | CFP-FP | AgeDB-30 |
---|---|---|---|---|---|---|
W&Fノルムソフトマックス | 1 | 0 | 0 | 99.28 | 88.50 | 95.13 |
球面 | 1.5 | 0 | 0 | 99.76 | 94.17 | 97.30 |
CosineFace | 1 | 0 | 0.35 | 99.80 | 94.4 | 97.91 |
ArcFace | 1 | 0.5 | 0 | 99.83 | 94.04 | 98.08 |
複合マージン | 1.2 | 0.4 | 0 | 99.80 | 94.08 | 98.05 |
複合マージン | 1.1 | 0 | 0.35 | 99.81 | 94.50 | 98.08 |
複合マージン | 1 | 0.3 | 0.2 | 99.83 | 94.51 | 98.13 |
複合マージン | 0.9 | 0.4 | 0.15 | 99.83 | 94.20 | 98.16 |
メガファースのテスト
この部分では、あなたがディレクトリ$INSIGHTFACE_ROOT/src/megaface/
いると仮定します。
注:私たちは、facescrubデータセットとMegafaceディストラクターの間に重複するIDがあることを発見しました。これは識別性能に大きな影響を与えます。 このリストは、 $INSIGHTFACE_ROOT/src/megaface/
下にリリースされています。
- facecrubデータセットとメガグラウンドディストラクターのすべての顔画像を整列させます。
$INSIGHTFACE_ROOT/src/align/
ある整列スクリプトを確認してください。 - facecrubとmegafaceの両方の画像ファイルを生成する。
python -u gen_megaface.py
- 新しい機能ファイルを生成するMegafaceノイズを除去する。
python -u remove_noises.py
- メガフェイス開発キットを実行して最終結果を作成します。
512-Dフィーチャー埋め込み
この部分では、 $INSIGHTFACE_ROOT/deploy/
ディレクトリにいると仮定しています。 入力された顔画像は、一般に中央が切り取られるべきである。 画像埋め込みネットワークに送信する前に、画像をさらに整列させるために、 MTCNNのRNet + ONetを使用します。
- 事前に訓練されたモデルを準備する。
- モデルを
$INSIGHTFACE_ROOT/models/
下に置きます。 たとえば、$INSIGHTFACE_ROOT/models/model-r34-amf
ます。 - テストスクリプト
$INSIGHTFACE_ROOT/deploy/test.py
ます。
シングルクロップド顔画像(112×112)の場合、テストサーバー(Intel E5-2660 @ 2.00GHz、Tesla M40、 LResNet34E-IR )の合計推論時間はわずか17msです。
サードパーティの再実装
- TensorFlow: InsightFace_TF
フェイスアライメント
Todo
顔検出
Todo
引用
InsightFaceが研究に役立つことがわかった場合は、以下の関連論文を引用することを検討してください。
@article{deng2018arcface,
title={ArcFace: Additive Angular Margin Loss for Deep Face Recognition},
author={Deng, Jiankang and Guo, Jia and Zafeiriou, Stefanos},
journal={arXiv:1801.07698},
year={2018}
}
接触
[Jia Guo](guojia[at]gmail.com)
[Jiankang Deng](jiankangdeng[at]gmail.com)