以下はFaceSwapについてFaceSwap: ExtractとFaceSwap: Trainingの内容を整理したものです。
顔生成のニューラルネットワークではデータセット(顔写真)をvectorにエンコーディングして、デコーダーでvectorから顔を生成する。入力された顔と出力された顔の乖離度を損失として評価して、改善されている場合はWeightsを更新する。
上記NNでは顔を認識しreconstructすることができるが、DeepFakeの目的は「Aの顔を認識して、Bの顔に差し替える」ことなので、FaceSwapは上記NNにShared Encoder
とSwitched Decoders
という概念を追加して拡張させる。
Trainingにおいて2人のデータセットを一つのEncoderにfeedし、2つのDecoderを学習させる。Decoder AはAの顔を、Decoder BはBの顔を生成する。
Convertingにおいて、Aの顔を入力して学習させたDecoder Bに通すことで、AとBの顔を差し替える。
2. Extract
ディープラーニングにあたえるデータセット(Facial sets)を準備する。
Facial setsは次の3段階を経て作成される。
- Detection 対象の写真から顔を認識し、正方形の写真に切り抜く。
- Alignment 正方形の顔写真に対して68個のlandmarksをつける。landmarksの座標情報は正方形写真のメタデータに追記される。
- Mask 正方形の顔写真に対して背景から顔の箇所を抽出する。この情報も正方形写真のメタデータに追記される。
- 様々な角度、表情、光の加減の写真データを1,000〜10,000集めて学習させる。
- 全体的に写真データは明瞭であるべき(sharp and detailed)。しかしながら一部のデータが不明瞭(blurry/partially obscured)なのはモデルの学習にプラスなのでOK。割合は5%未満を目処にする。
複数の人物が写っている写真をExtractした場合、対象の人物以外もFacial Setsに含まれてしまう。また同じ人物の同じ写真が複数含まれてしまった場合も、Facial setsの品質が落ち、学習の精度が落ちてしまうので不本意な顔写真を目視で削除する必要がある。
大量の写真から不要データを目視で削除するのは大変である。そこでSort By Face
で似た写真をグルーピングする(教師なし学習によるクラスタリング)。そうすることで同じ写真は同じグループに収まり、別人物の画像はまとめてフォルダに配置されるので削除作業の効率能率的になる。
Sort By Face
で不要な顔写真を削除したら、再度Extactを実行してfsaファイルを更新する。
3. Training
Extractで準備したFacial Setsを学習させる。Trainingでは設定(Configure)の組み合わせを試行錯誤することで訓練の質を改善できる。ベストな組み合わせは決まっておらず、またアウトプットの評価は主観的になるため(スワップがどれくらいの精度でできたかは判定できないthere are no real-world examples of a swapped face for the NN to compare against.
)、本格的に運用する際には体系的な比較フローを構築すると良さそう。詳細はconfig/train.ini
を参考。
利用可能なモデルを一部抜粋。モデルは進化&新しいものが追加されるのでウォッチする。
モデル | 概要 | input/ output | カスタム設定 |
---|---|---|---|
Lightweight | 開発用の超軽量モデル。本番では使用しないがローカルでのコーディングやデバッグ時には良さそう | 64px/ 64px | ? |
IAE | EncoderとDecoderの間にIntermediate layersを追加したモデル。deepfakes/faceswap#251 | 64px/ 64px | ? |
Dfaker | input画像を高解像度にアップスケールしてoutputすることに強いモデル。RealfaceやDlightに継承されている | 64 or 128px/ 128 or 256px | ☓ |
Villain | ハイスペックなVRAMと十分な訓練が必要なモデル。 | 128px/ 128px | ☓ |
Realface | B Decoderに重きをおいたモデルでAからBへのスワップに強い(逆は弱い)。Dfakerも継承してアップスケールもできる。 | 64-128px/ 64-256px | ◯ |
Dlight | Dfakerを継承した最新版。アップスケールに強い。 | 128px/ 128-384px | ◯ |
Phaze-A | 複雑なモデルで専用のスレッドがある。初学者が使うのは敷居が高いらしい。https://forum.faceswap.dev/viewtopic.php?f=27&t=1525 | ? | ◯ |
initializerは学習初期のWeightを決めてくれ学習を効率的にする。現在対応しているinitializerはhe_uniform(default)
, ICNR Init
, Conv Aware Init
の3つ。それぞれの特徴は論文を読まないとわからない。
ICNR Init
Conv Aware Init
最適化(Optimizer)についてはこちらの記事を参照。
- アルゴリズムは定評があるAdamを使うのが推奨されている。
- オプション的にはAdaBeliefやNadamなども準備されている 。
- Learning Rate: 小さいと収斂まで時間がかかる。とりあえずデフォルトで良さそう。
- Batch Size: 一度に何個のデータを学習させるか?1-32で指定できる。大きいほど学習の質は上がるが学習速度が遅くなる。
- Epsilon Exponent:
divide by zero errors
を避けるためのもの。これもデフォルトで良さそう。
- デフォルトではSSIM (Structural Similarity)が設定されている。損失関数は正則化関数を組み合わせたりできる。
学習中はiterationごとにTotal Iterations: 87 | Loss A: 0.0411 Loss B: 0.0451
というフォーマットでDecoderA, Bの損失を出力してくれる。しかしながらこの損失はインプットデータから人物A、Bをうまく生成できたかの指標で、人物AをBに差し替えたスワップ写真の品質を示すものではない。そもそもそのようなスワップ写真はこの世に存在せず、スワップにおける損失を測ることができない。そのため最終的な品質は目視で確認することになる。
modelが保存されるたびにスワップ実行時のpreview画像が作成されるので、それらを目視して十分な品質に達したと判断したら学習を終える。目の光加減と歯の形は最後に学習される傾向にあるので、この2つに注目して判断すると良いらしい。
一般にスクラッチでモデルを作るのではなく事前学習モデルをファインチューニングするほうが学習の効率・質が上がりそうだが、FaceSwapに事前学習モデルは準備されていない。どういったモデルが事前学習に使えるのかなど検討が必要。 Deepfake Video Forensics based on Transfer Learning
Trainingで使った人物AのAlignment Fileとは違う人物Aの動画データをExtractしてスワップを行う。
コーディングとデバッグはローカル環境で行い、GPUが必要な学習はColabなど別環境で行う