deepfacelabでうまく学習させるために注意すべきポイント、コツを紹介
deepfacelab は操作がコンソールベースで取り扱いには慣れが必要ですが、学習には Google が開発する TensorFlow を利用しており、頻繁にアップデートもされているため、学習能力はとても秀逸です。
ですが、いざ学習、エンコードし出力結果を確認してみると、完成度の低いものができてしまうケースがよくあるかと思います。
そういった場合に確認すべきことをまとめましたので、宜しければご活用ください。
学習の仕組みを知る必要がないという方は、手順に沿って作業していただくことで高品質なモデルデータを作成することのできるロードマップを用意しています。
こちらのページをご参照ください。
説明はいいから、パラメータだけ教えて
[y] Enable random warp of samples ( y/n ?:help ): n
[0.0] GAN power ( 0.0 .. 5.0 ?:help ): 0.1
すでに学習させたモデルデータの設定から、上記の通り変更し、もう少し学習させてみてください。
モデルの状態にもよりますが、精度が飛躍的に向上する可能性があります。
また、src との類似性を少し犠牲にしてでも、モデルを複数の角度にも対応させたい場合は以下のオプションを有効にします。
[n] Flip SRC faces randomly ( y/n ?:help ) : y
十分に学習したモデルデータを使用してください。また、GAN power の設定によりモデルデータが崩壊する可能性があるため、必ずバックアップをとるようにしましょう。
過学習・過剰適合を避ける
「長く学習させたら、それだけいいものができるだろう」と思い、何日も学ばせたにも拘らず、望ましい結果が得られなかったことはないでしょうか。
ディープラーニング、AI による学習の分野では、過学習と呼ばれる、いわゆる AI の学びすぎが問題視されることがあります。
通常、学習アルゴリズムは一連の訓練データを使って訓練される。つまり、典型的な入力データとその際の既知の出力結果を与える。学習者はそれによって、訓練データでは示されなかった他の例についても正しい出力を返すことができるようになると期待される。しかし、学習期間が長すぎたり、訓練データが典型的なものでなかった場合、学習者は訓練データの特定のランダムな(本来学習させたい特徴とは無関係な)特徴にまで適合してしまう。このような過剰適合の過程では、訓練データについての性能は向上するが、それ以外のデータでは逆に結果が悪くなる。
過学習とは、訓練データに対しての適合率があまりに高くなってしまうことで、その訓練データに対しては高い正答率を出しても、異なるデータに対しては正答率が下がってしまう。という問題です。
deepfacelab で言えば、素材となる data_src に対しての適合率は学ぶほど高くなっていても、主観的な実際の人物との適合率は下がっていってしまうということです。
deepfacelab は際限なく学び続けるよう(ドロップアウトしないよう)設計されているので
、過学習を防ぐにはユーザからの何らかの干渉が必要になります。
※2020/02/29 追記
deepfacelab にも、ドロップアウトできるオプションが追加されたようです。より汎用的なモデル作成を行いたい場合は、
[n] Use learning rate dropout :
上記のオプションに Yes(y)を選択してください。
現在の仕様では、このオプションを ON にすると、かなり早々に学習を打ち切ってしまうようです。ある程度学習が進んでから、オプションを切り替えたほうが良いかもしれません。
過学習の対策
学習データを増やす
学習精度の向上と過学習の防止を同時に実現する、最も有効な方法です。
データのバリエーションを増やすことで、未知のパターンにも対応しやすくなるため、コンバート後の適合率も高くなりますし、学習にかかる時間が、そのまま過学習を防ぐ役割を果たしてくれます。
学習を打ち切る
こちらもシンプルですが、有効な方法です。
deepfacelab では、学習状況を視覚的に表示させる機能があるため、データを監視し、評価が悪化する前に打ち切るという方法です。
目安はモデルデータによって曖昧なので明確な数値は提示できませんが、学ばせていると、どこかで数値がなかなか伸びず、頭打ちになるポイントがあることが確認できるはずです。
それ以降は学ばせても結果が大きく変わることはないので、その時点で学習を打ち切ってしまうのも手段の一つと言えます。
事前学習(pretrain)を活用する
deepfacelab には、事前学習と呼ばれる機能が用意されています。
事前学習とは言葉の通り、DFL が提供する様々なフェイスセットを利用し、汎用的なモデルデータをあらかじめ作成する機能です。
[n] Enable pretraining mode ( y/n ?:help ) : y
学習時、上記の設定を「y」に設定することで、事前学習が実行されます。この場合はフェイスセットを用意する必要はありません。
事前学習の有無によって作成されるモデルデータの品質がどれだけ変わるかについては、以下の動画を参考にしてみてください。
XSeg を活用する
少し上級者向けになりますが、deepfacelab には XSeg という、顔の輪郭情報をユーザーが能動的に定義する機能があります。
こちらを用いることで、学習では判断できなかった、顔に重なっている障害物をより正確に取り除くことができます。
また、この XSeg で作成されたモデルデータを前提とした学習オプションもいくつか存在するため、学習効率を上昇させることができます。
詳細については、以下の記事で触れています。
各学習データのふるまい
コンピュータサイエンスや社会調査の格言に、「Garbage in Garbage out」というものがあります。
言葉の通り、「無意味なデータ(ゴミ)を入れても、無意味な結果(ゴミ)しか生まない」という意味です。
「フェイスセットは散らかってるけど、賢いプログラムなら有効に生かしてくれるはず!」と考えたくなりますが、deepfacelab において生かせるのはあくまで「顔のデータ」だけです。プログラムが誤って顔と認識した「顔でないデータ」は、ゴミでしかないのです。
プログラムだけでは至らない部分を、人が補助することでより高いパフォーマンスを発揮させることができます。
具体的な方法を説明していきます。
data_src\aligned
ご存知の方も多いかと思いますが、deepfacelab において、data_src は モデルデータを学習させるためだけにあります。
ですので、誤検出されている顔画像は少ない方が良いですし、素材数は多い方が良いです。
必ずしも 1 つの動画から抽出しなければならないというわけでもないので、一度顔画像を抽出した後、aligned フォルダをバックアップし、別の動画から再度顔画像を抽出するなどすれば、より多くの素材を用意することができるため、学習の精度を上げることが可能です。
また、誤って顔と認識してしまっている部分や、スワップさせたい対象の顔とは異なる人物の顔が検出されてしまっている場合は、予め削除しておくことで、より高い精度で学習させることが可能です。
data_dst\aligned
deepfacelab において、data_dst で出力された顔画像は、モデルデータの学習のみでなく、エンコードする際にも利用されています。
例えば、1 つのフレームに 2 人の顔が検出されてしまった際、data_dst\aligned 内の、対象フレームの顔データを片方削除すれば、エンコード時に削除した顔は無視してくれます。
src と同様に、 誤って顔と認識してしまっている部分や、スワップさせたい対象の顔とは異なる人物の顔が検出されてしまっている場合は、予め削除しておくことで、より高い精度で学習させることが可能です。
aligned に共通すること
上記で data_src\aligned、 data_dst\aligned どちらにおいても、予め誤った画像は減らし、正しい画像を増やすことが重要と説明しましたが、どちらにも共通することは、誤検出は少なければ少ないほど学習の精度が上がるということです。
ですが、場合によっては数千から数万にもなる画像の中から誤検出された画像だけを探すには、とても骨が折れる作業となります。
すでに誤検出されているので自動的に削除することはできませんが、deepfacelab には、そういった画像を人が見つけやすいようにする機能がいくつかあるので、紹介致します。
ソート機能を活用する
必須ではないので触れたことのない方もいらっしゃるかもしれませんが、
deepfacelab には、検出された顔画像を、さまざまな条件で並び替える機能が搭載されています。
- 4.2.1) data_src sort by blur.bat (ぼかし度合いでソート)
- 4.2.2) data_src sort by similar histogram.bat(解析上似ているデータ順にソート)
- 4.2.3) data_src sort by dissimilar face.bat(解析上似ていないデータ順にソート)
- 4.2.4) data_src sort by dissimilar histogram.bat(解析上似ていないデータ順にソート)
- 4.2.5) data_src sort by face pitch.bat(顔のピッチでソート)
- 4.2.5) data_src sort by face yaw.bat (顔の角度でソート)
などがあります。上記のソート機能を利用することで、不要な顔画像を手早く取り除くことが可能です。
デバッグを活用する
一見、顔が適切に判定されているように見えても、内部的には、顔のパーツがうまく認識できていないケースなどもよくあります。そういったデータが残ったままだと、学習の妨げにもなりますし、出力結果も望ましいものとなりません。そういった画像を検出するには、デバッグ機能を利用することが有効です。
dst では標準で、src では設定を変更することで、aligned フォルダと同じディレクトリに、aligned_debug というフォルダが作成されます。このフォルダを確認すると、顔のパーツまでどう検出されているかを確認することができるので、正しく検出されているか怪しいファイルを見つけた場合は、デバッグファイルと見比べてみることで、適切な画像であるかを判断することができます。
最新のビルドバージョンを取得する
deepfacelab は頻繁に新しいバージョンを公開しています。
学習の精度が向上するようなバージョンアップとは限りませんが、1 度の学習には時間がかかるため、その前に最新のビルドが更新されていないか、確認してみましょう。
組み合わせを変更する
deepfacelab で置き換えられているのは、あくまで顔のパーツだけなので、骨格から異なる組み合わせでは、どれだけうまく学習させても違和感が残ってしまいます。
ディープフェイク全てに言えることですが、src と dst の組み合わせ選びはとても重要です。
何度試してもうまくコンバートできない場合は、src または dst を別の方に変更してみるのも一つの手段と言えます。
より性能の高い PC を用意する
deepfacelab には多くのオプションが用意されていますが、そのほとんどが品質の向上と引き換えに PC のリソースを消費します。
性能の低い PC では学習速度が低下するだけでなく、GPU のメモリ量によりそもそも学習が開始できず、高度な設定を利用できません。
「品質」にも大きく分けると、最終的に生成される画像の解像度と、学習効率の 2 つがあり、本記事におけるテーマにより沿っているのは後者ですが、いずれにしても PC の性能が高いほど選択肢が広がります。
膨大な時間と電気代をかけて失敗作を作ってしまうよりは、初めからスペックの高い PC で挑む方が良いパフォーマンスを出せる可能性もあります。
2022 年 5 月より、Google Colaboratory を利用したディープフェイク作成が禁止されました。 今後こういった規制はより強くなっていく可能性もあり、学習を行うためのマシンは自前で用意する必要があります。 PC のスペックが低いと、メモリが足りず高度な設定自体利用できないことがあります。 BTO メーカーなどで、高性能な GPU を搭載した PC に切り替えることも大切です。
最後に
最後まで読んでいただき、ありがとうございます。
ディープラーニングは、現在の IT 技術の中でも最先端に分類される技術です。学習技術や学習環境など、日々多くの企業が技術を研鑽していっています。deepfacelab も頻繁にアップデートされているため、仕様に変更があれば随時この記事も更新させていただきます。