Ribbit.work

deepfacelabでうまく学習させるために注意すべきポイント、コツを紹介

機械学習python

last modified date2021-12-4

publish date2021-8-16

deepfacelab は操作がコンソールベースで取り扱いには慣れが必要ですが、学習には Google が開発する TensorFlow を利用しており、頻繁にアップデートもされているため、学習能力はとても秀逸です。

ですが、いざ学習、エンコードし出力結果を確認してみると、完成度の低いものができてしまうケースがよくあるかと思います。

そういった場合に確認すべきことをまとめましたので、宜しければご活用ください。

ちなみにそもそも PC のスペックが低く、高度な学習設定を利用できない場合は、Google が提供している Google Colaboratory を利用することで、業務用 GPU を無料で利用することができます。こちらの記事を参考にしてみてください。

過学習・過剰適合を避ける

overfitting

「長く学習させたら、それだけいいものができるだろう」と思い、何日も学ばせたにも拘らず、望ましい結果が得られなかったことはないでしょうか。

ディープラーニング、AI による学習の分野では、過学習と呼ばれる、いわゆる AI の学びすぎが問題視されることがあります。

通常、学習アルゴリズムは一連の訓練データを使って訓練される。つまり、典型的な入力データとその際の既知の出力結果を与える。学習者はそれによって、訓練データでは示されなかった他の例についても正しい出力を返すことができるようになると期待される。しかし、学習期間が長すぎたり、訓練データが典型的なものでなかった場合、学習者は訓練データの特定のランダムな(本来学習させたい特徴とは無関係な)特徴にまで適合してしまう。このような過剰適合の過程では、訓練データについての性能は向上するが、それ以外のデータでは逆に結果が悪くなる。

過剰適合 - Wikipedia

過学習とは、訓練データに対しての適合率があまりに高くなってしまうことで、その訓練データに対しては高い正答率を出しても、異なるデータに対しては正答率が下がってしまう。という問題です。

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」に設定することで、事前学習が実行されます。この場合はフェイスセットを用意する必要はありません。

事前学習の有無によって作成されるモデルデータの品質がどれだけ変わるかについては、以下の動画を参考にしてみてください。

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 を別の方に変更してみるのも一つの手段と言えます。

最後に

最後まで読んでいただき、ありがとうございます。

ディープラーニングは、現在の IT 技術の中でも最先端に分類される技術です。学習技術や学習環境など、日々多くの企業が技術を研鑽していっています。deepfacelab も頻繁にアップデートされているため、仕様に変更があれば随時この記事も更新させていただきます。

この記事をシェア

この記事を読んだ方におすすめの記事

PySimpleGUIで自作テーマを使用する
2021-9-2

PySimpleGUIで自作テーマを使用する

python
Eelを含むPythonプログラムを終了する
2021-8-16

Eelを含むPythonプログラムを終了する

python
【顔によって最適が異なる】フェイスタイプ(Face type)の正しい選び方
2021-8-16

【顔によって最適が異なる】フェイスタイプ(Face type)の正しい選び方

機械学習python
【deepfacelab】顔を部分的、一部のみ変更する方法【XSeg】
2021-8-11

【deepfacelab】顔を部分的、一部のみ変更する方法【XSeg】

機械学習python

最新の記事

kuromoji.jsで形態素解析
2021-12-4

kuromoji.jsで形態素解析

TypeScriptJavaScript
レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】
2021-12-4

レコードのサブテーブルを並び替えて登録する【Kintone JavaScriptカスタマイズ】

JavaScriptKintone
レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】
2021-11-29

レコード一覧表示時(app.record.index.show)のサンプルコード集【Kintone】

JavaScriptKintone
スライダーを使って数値を設定できるKintoneプラグイン【無料公開】
2021-11-26

スライダーを使って数値を設定できるKintoneプラグイン【無料公開】

KintoneJavaScriptTypeScript