
【deepfacelab】顔を部分的、一部のみ変更する方法【XSeg】
2022-2-25
2021-8-11
deepfacelabでは、face typeに応じておでこから顎まで、または頭全体を標準でスワップさせます。
ただ、表情をうまく再現できなかったり、顔でない部分まで顔として認識してしまうケースが起こりえます。
この対策としてdeepfacelabには、こちらから能動的に「どこまでが顔なのか」を指示できる「XSeg」という機能があります。
さらに、この機能を利用することで、学習効率・学習品質を大きく向上させることも可能です。
今回はその使い方について説明していきます。
face typeについて詳しく知りたい方は以下の記事をご覧ください。 頭全体をスワップする方法などを紹介しています。
【顔によって最適が異なる】フェイスタイプ(Face type)の正しい選び方
ちなみにそもそもPCのスペックが低く、高度な学習設定を利用できない場合は、Googleが提供しているGoogle Colaboratoryを利用することで、業務用GPUを無料で利用することができます。
こちらの記事を参考にしてみてください。
XSegとは
Xsegとは、通常は学習により自動的に検出される顔の輪郭情報を、ユーザーが能動的に設定することができる機能です。
バージョン2.0にアップデートされる前に存在していた、FANSegを代替する機能になります。
XSegには通常の学習時に作成される通常のモデルデータとは別に、専用のXSegモデルデータを持っています。
ユーザーが行う作業の手順
XSegは専用のモデルデータをもっているため、通常のモデルと同様に、学習によって作成されます。
通常のモデルデータには学習素材としてフェイスセットが必要でしたが、XSegモデルの場合は学習時の「正解」にあたる、基準となる輪郭情報をユーザーがいくつか定義する必要があります。
通常ユーザーが行う作業としては、
- 学習時の正解となる輪郭情報を、手動で数個~数十個定義
- XSegモデルをトレーニング
- 作成されたXSegモデルを使って、全ての顔データに輪郭情報を反映
- 通常のモデルデータをトレーニング
といった流れになります。
DeepFaceLabには輪郭情報を登録するためのツールが含まれていますので、これを使って正解データを作成します。詳細は後述しますが、以下が登録ツールです。
- 5.XSeg) data_dst mask - edit.bat
- 5.XSeg) data_src mask - edit.bat
手っ取り早く実現する
ジェネリックXSegモデルを活用する
前述した通りXSegモデルを作成するためには、ユーザーがある程度正解データを用意する必要があります。
ただ、DeepFaceLabにはジェネリックXSegと呼ばれる、様々なフェイスセットを使って予め学習を行ったモデルデータが存在します。
これを呼び出してフェイスセットに適用させることで、自分でXSegモデルを用意しなくてもある程度の障害物を除いた輪郭を定義することができます。
- 5.XSeg Generic) data_dst whole_face mask - apply.bat
- 5.XSeg Generic) data_src whole_face mask - apply.bat
上記のバッチファイルがそれぞれdst, srcに対応しています。
事前学習を活用する
もしご自身でXSegモデルを作成する場合、通常のモデルと同様に事前学習機能が存在します。
こちらを活用することで、学習効率を高めることが可能です。
事前学習については、以下の記事をご覧ください。
deepfacelabでうまく学習させるために注意すべきポイント、コツを紹介
XSegに関係するその他のバッチの説明
XSegに関係するバッチファイルを紹介します。
後述するバッチファイルには、data_dstとdata_srcが存在し、それぞれスワップ先、スワップ元に対応します。
5.XSeg) data_dst mask - edit
ここで輪郭情報を手動で定義できます。
専用のトレーナーアプリが立ち上がります。
5.XSeg) data_dst mask - fetch
フェイスセットの中から、editを使って手動で定義した画像データだけを、別フォルダへコピーします。
学習リソースの再利用に活用することができます。
5.XSeg) data_dst mask - remove
手動で定義した輪郭情報を削除し、標準の情報を復元します。
5.XSeg) train
XSegモデルデータを学習により作成します。
5.XSeg) data_dst mask - edit および 5.XSeg) data_src mask - editで作成したフェイスセットのみが使用されます。
5.XSeg) data_dst trained mask - apply
trainによって作成したモデルデータを使って、data_dst内の全てのデータセットへ輪郭情報を反映します。
5.XSeg) data_src trained mask - remove
trained mask - applyを使って反映した輪郭情報を削除します。
手動で定義した輪郭情報は保持されます。
TL;DR
非常にわかりやすい動画がありました。
こちらを見ていただくだけでも、全体の流れを理解できると思います。