顔入替ソフト使用例 - DFLを使ったDeepfakeの作り方(DF)

DFLを使って動画を制作する方法を説明します。モデルはDFモデルを例にとっています。


DFLをダウンロードする


https://github.com/iperov/DeepFaceLab

こちらのページのWindows Google drive

または

こちらのページの「DOWNLOAD HERE」からダウンロードするのですが、登録してログインしないと、ダウンロード用のリンクが表示されないので、登録してない方は「Register」から登録してログインしてください。

https://mrdeepfakes.com/forums/thread-dfl-1-0-guid...

https://rutracker.org/forum/viewtopic.php?p=753187...

このサイトにはDFLのチュートリアル、説明が書かれているので、必ず目を透しておいてください。
Chromeで日本語に翻訳すればいいです。

「DOWNLOAD HERE」をクリック するとGoogle Driveが開かれます。
必要なバージョンのexeを右クリックして、ダウンロードします。
datasetsやfacesetsには、サンプルが入ってるようですが、不要なのでダウンロードしません

ダウンロードしたらダブルクリックして解凍します。

HDD上の適当な場所に解凍します。場所は全角文字が入っていなければどこでも構いません。

解凍したフォルダを開きます。

1) clear workspace.bat ファイルは削除します。

動画制作のおおまかな流れ

  1. 素材を準備する
  2. 素材動画を全フレーム画像で書き出し
  3. 顔部分のみを抽出
  4. 誤検出された画像を削除
  5. 学習させる(train)
  6. 顔を移植した画像を書き出し(convert)
  7. 書き出した画像を動画にする

1.素材を準備する


素材となる動画を準備します。素材は何でも構いませんが、まずは30秒、1〜2分程度のもので試してみるのが良いかと思います。

素材は顔を移植する側とされる側の2種類が必要です。

data_src 「別の人物の体に移植する顔となる素材」

data_dst 「別の人物の顔を移植される素材」

例えば「橋○環○の顔を、麻○憂に移植する」場合は、橋○環○の動画がdata_src、麻○憂の動画がdata_dstとなります。

用意した素材は、それぞれ上記の例のようにdata_src.mp4とdata_dst.mp4に名前を変更し、workspaceフォルダに入れておきます。

最初からサンプルの動画が入ってますので、サンプルは消しましょう。


素材動画の注意点


使用する素材にはいくつか注意が必要です。場合によっては事前に動画編集ソフトで、編集する必要があります。

・動画に複数の人物の顔が映っていないこと

この後の工程で人物の顔部分のみを画像で書き出しますが、動画内のすべての顔と認識されるものが書き出されますので、動画には一人の人物の顔しか映っていないものが望ましいです。
二人以上が映っている場合、4.2.2) data_src sort by similar histogram.bat を使用して、data_src\alignedの中の顔画像から、手動で別人物を削除する必要があります。

・人物の顔が十分なサイズで写っていること

素材となる動画(特にdata_src)は人物の顔がある程度の大きく映っている必要があります。
具体的には顔部分の画像の書き出しは256×256ピクセルの正方形なので、動画上の人物の顔のサイズがこの程度のサイズで写っていることが望ましいでしょう。
小さい顔画像を256×256ピクセルに拡大した場合、ボケるので、4.2.1) data_src sort by blur.bat を使用して、data_src\alignedの中の顔画像から、手動でボケた画像を削除する必要があります。

こんな感じなので、ドラマや映画を素材にする場合は、素材にする人物の顔がある程度大きいサイズで写っているカットのみを抽出して、ひとつの動画につなげておく必要があります。
また、同じ画面上に別の人物の顔が映りこんでいる場合は顔と認識されないよう、モザイクをかけておく等の処理も必要になります。

・data_dst側の動画が顔アップ動画の場合、480p〜540p程度であること

顔学習は最大でも256×256ピクセルなので、Full HD動画であって、顔のアップなどがあると、
どうしてもボケてしまいます。
事前に動画編集ソフト(Avidemuxなど)で、動画を縮小した方が、綺麗に仕上がります。
どうしてもと言う場合は、出来上がった動画をアップコンバート(Topaz Gigapixel AI、waifu2x-caffeなど)した方が、綺麗に仕上がります。

2.素材動画を全フレーム画像書き出し


「2) extract images from video data_src.bat」を実行し、data_srcの動画を画像で書き出します、
data_srcは顔を移植する側、つまり画像は学習にしか使用しないないので、全フレーム書き出す必要はありません。
書き出すフレームレートを選択できます。通常は1〜3fpsで十分でしょう。
顔のカメラアングル、角度が類似すぎる、表情が類似すぎる顔がたくさんあっても、学習が遅くなるだけです。
素材が短い場合は全フレーム書き出したほうが良いかもしれません。
デフォルトのPNGで書き出します。

「3.2) extract images from video data_dst FULL FPS.bat」を実行し、data_dstの動画を全フレーム画像で書き出します。
こちらは顔を移植される側なので、最後に顔を移植して動画にする際に全フレーム必要になるので、自動的に全フレーム書き出しとなります。
デフォルトのPNGで書き出します。

途中、アルファチャンネル(透過)ありのPNGで書き出すオプションを尋ねられます。data_dstの動画に透過部分があり、DeepFaceLabで制作した動画を、あとで動画編集ソフトで合成する際などはyにします。通常はnで良いです。

書き出された画像はそれぞれ、workspaceフォルダの中の「data_src」「data_dst」のフォルダの中に書き出されます。

3.顔部分のみを抽出


前の工程で書き出した画像から、さらに顔部分のみを抽出し画像で書き出します。

「4) data_src extract faces S3FD best GPU.bat」を実行しdata_srcの画像から顔部分のみを抽出します。

「5) data_dst extract faces S3FD best GPU.bat」を実行しdata_dstの画像から顔部分のみを抽出します。

書き出された画像は、それぞれ「data_src」「data_dst」のフォルダ内の「aligned」というフォルダに書き出されます。

4.誤検出された画像を削除


前工程での顔部分のみの抽出ですが、残念ながら必ず何かしらの誤検出があります。
これらが学習時に入っていると悪影響を及ぼすので、削除する必要があります。
よくあるのは体の一部分など思わぬものが顔として認識されいます。

「4.2.2) data_src sort by similar histogram.bat」を実行すると、data_srcフォルダの中のalignedに入っている、画像がヒストグラムで並べ替えられます。
ここではヒストグラムが何なのかは説明しませんが、これを実行すると似た画像で並べ替えられるので、誤検出された画像を見つけやすくなります。
並べ替えが終わったら、フォルダを開き誤検出された画像を削除します。

または4.2.other) data_src sort by vggface.batを実行すると、data_srcフォルダの中のalignedに入っている、画像が似た順序で並べ替えられます。
これを実行すると似た画像で並べ替えられるので、誤検出された画像を見つけやすくなります。
並べ替えが終わったら、フォルダを開き誤検出された画像を削除します。

data_dstも同様に「5.2) data_dst sort by similar histogram」を実行し、並べ替えた後、誤検出された顔画像を削除します。
data_dstも同様に5.3) data_dst sort by vggface.batを実行し、並べ替えた後、誤検出された顔画像を削除します。

srcのalignedに入った画像は

4.2.1) data_src sort by blur.batとすると、拡大などしてぼやけた画像などが下、後にくるのでぼやけた画像を削除します。

data_src sort by blur.batは完璧ではないので、エクスプローラーで表示→特大アイコンなどでぼやけた画像を削除します。
動きが激しくて、2重になっている画像などです。

最初の作成は、data_dst.mp4はなるべく正面を向いた顔がいいでしょうから、

4.2.5) data_src sort by face yaw.batで顔を横向き順のソートし、
左真横顔や右真横顔を、それぞれ別フォルダに退避して画像数を減らしておくと、後の顔学習が高速になります。

同じく
4.2.5) data_src sort by face pitch.batで顔を上下向き順のソートし、
極端に上を向いた画像や下を向いた画像をそれぞれ別フォルダに退避して画像数を減らしておくと、後の顔学習が高速になります。

4.2.other) data_src sort by black.batで顔が見切れた画像で、黒ピクセルの多い画像が下にくるので、
顔のパーツが大きく欠けている画像を削除または別フォルダに退避します。

顔学習の素材数は、2000〜5000枚程度がtrain速度のため推奨されているので、
srcの顔素材数が多すぎる場合は

4.2.6) data_src sort by best.batを使用して顔画像数を減らします。

5.学習させる(train)


ここで肝心の機械学習です。学習には「6) train DF.bat」を使用します。

6) train DF.bat

128×128ピクセルのフルフェイスで学習させます。当然こちらのほうが「 6) train H64.bat 」よりも高解像度なため高品質になりますが、学習に時間がかかります。
欧米人よりも顔が平たいアジア人にはこちらのほうが適しているようです。vRAM3GB以上 推奨。
フルフェイスなので、H128モデルよりsrcに似せやすいです。
H128モデルよりもバッチサイズを大きくでき、モデルの完成が速いです。
フルフェイスを128×128ピクセルで学習するので、H128のハーフフェイスを128×128ピクセルで学習するより、若干実質解像度は下がります。

「「6) train DF.bat」 を実行すると、まず下記のオプションを尋ねられます。


train時のオプション


Model first run. Enter model options as default for each run.

Enable autobackup? (y/n ?:help skip:y) :

yにすると、モデルデーターを定期的にバックアップしてくれます。停電時などに備えてyがいいかも知れません。

Write preview history? (y/n ?:help skip:n) :

yにすると、プレビュー画面を保存してくれるそうですが、不要なのでいつもnにしています。

Target iteration (skip:unlimited/default) :

無限に学習させるので、Enterでskipします

Batch_size (?:help skip:0) :

バッチサイズが大きいほどモデルの精度が高くなりますが、その分学習が遅くなります。
またバッチサイズの値が大きすぎると、trainが始まらない場合もあります。
私の環境(RTX2080)だと、バッチサイズ32にするとtrainが始まりませんでした。いつもはバッチサイズを28にしています。

Feed faces to network sorted by yaw? (y/n ?:help skip:n) :

yにしてると学習前にsrcとdstのyawでsortしてdstに無いyawのsrcは学習しない様になります。
現在のsrc/dstで速く動画を完成させたい場合は y
汎用のsrcモデルを作成したい場合は n

Flip faces randomly? (y/n ?:help skip:y) :

垂直軸で画像を反転することで、反対側にから見た場合もカバーしようというものですが、人間の顔はピッタリ左右対称という訳はないので、通常はnにしておきましょう。
左右どちらか片方から見た素材しかない、という場合には有効かもしれません。

random flipはnの方がいいです。
左右完全対称の人間なんてこの世にいないし、別人になりやすいです。

srcがよほど足りない状況ではない限りnが推奨です。

Use pixel loss? (y/n, ?:help skip: n/default ) : ?

ピクセルロスをオンにすると、モデルが崩れたり壊れたりする危険性が高まるため推奨されないようです。通常はnにします。


train開始


上記のオプションを選択し終えると、Train Preview ウィンドウが立ち上がりTrainがはじまります。
Train Preview ウィンドウ選択中に、下記の操作をすることができます。

Pキー; プレビューのリフレッシュ、プレビューを最新の状態に更新してくれます。
何も押さなくてもプレビューは15分おきに自動的に更新されます。

Sキー; Sキーを押した時点のTrainをセーブしてくれます。
何も押さなくても15分おきに、自動的にセーブしてくれます。

Enterキー; Trainをセーブして終了します。
Trainを後で再開する場合は、「6) train DF.bat」を実行すると、自動的に前回セーブされたところから、Trainを再開してくれます。

2秒以内にEnterを押すとBatch_sizeなど一部のパラメーターは初期設定から変更できます。

Trainの時間ですが、マシンのスペックや素材にもよりますが、数時間から数十時間はかかります。

6.顔を移植した画像を書き出し(convert)


Trainを終了したら、学習したモデルを使って、data_dstの動画を書き出した画像に、顔を移植していきます。

「6) train DF.bat」 でTrainしたmodelなら「7) convert DF.bat」を 使ってconvertします。

実行すると、下記のオプションが尋ねられます。

convert時のオプション

Choose mode:
(0) original
(1) overlay
(2) hist-match
(3) seamless2
(4) seamless
(5) seamless-hist-match
(6) raw-rgb
(7) raw-rgb-mask
(8) raw-mask-only
(9) raw-predicted-only
Default: 4 :

モードによって違いがあります。詳しくは引用元のページを読んでみてください。

convertのモードですが、Defaultの (4) seamless が一番違和感なく仕上がるかと思います。4を入力してEnterを押します。

Choose mask mode:
(1) learned
(2) dst
(4) FAN-dst
(7) learned*FAN-dst

通常は (4) FAN-dstまたは(7) learned*FAN-dstで問題ありません。 4を入力してEnterを押します。

Choose erode mask modifier [-200..200] (skip:0):

erodeをマイナスにすると、顔の変換領域が拡がります。erodeをプラスにすると、顔の変換領域が狭まります。
erodeの値について、src/dst次第で、汎用の正解値は無いのかも知れません。

Choose blur mask modifier [-200..200] (skip:0) :

顔を移植したときの、境界のぼかしですが、06XX版はデフォルトで100になっている様なので、100以上がよいかも知れません。
ぼかしが弱くても、ぼかしが強すぎても変になるかも知れません。
blurの値について、src/dst次第で、汎用の正解値は無いのかも知れません。

Choose output face scale modifier [-50..50] (skip:0) :

顔を移植する際の大きさを調整できます。通常は0で良いので Enterでskipします。
明らかにdata_srcとdata_dstの人物の顔の大きさが異なる場合は、微調整するとよいかもしれません。

Apply color transfer to predicted face? Choose mode ( rct/lct skip:None ) :

顔を移植する際に肌の色の違いを補正してくれます。
rctもしくはlctを入力してEnterを押します。rctにしている人が多い様です。
ここをNoneにしてしまうと、肌の色が異なって不自然になります。

Apply super resolution? (y/n ?:help skip:n) :

通常はnで良いです。data_dstの動画が低品質の場合にyにすると良いらしいです。

Degrade color power of final image [0..100] (skip:0) :

値を大きくすると、移植した後の顔の鮮やかさが上がります。
ただし基本的に階調が悪化してしまうため、通常は0のほうが良いです。Enterでskipします。

Export png with alpha channel? (y/n skip:n) :

画像をアルファチャンネル(透過)ありのpngで書き出すオプションです。
data_dstの動画に透過部分があり、DeepFaceLabで制作した動画を、あとで動画編集ソフトで合成する際などはyにします。
通常はnで良いので、Enterでskipします。

オプションを選択し終えると、data_dstに顔を移植された画像の書き出しがはじまります。画像は「data_dst」のフォルダ内に自動的に「merged」というフォルダが作成され、ここに書き出されます。

7.書き出した画像を動画にする


あとは前の工程で書き出した画像をつなげて動画にするだけです。

「8) converted to mp4.bat」を実行します。フレームレートは、data_dst.mp4に合わせるとよいでしょう。

アルファチャンネルを利用する場合は「8) converted to mov(lossless+alpha).bat」もしくは「8) converted to mp4(lossless+alpha).bat」を実行します

動画は「workspace」フォルダ内にresult.mp4という名前で出力されます。


さいごに


これで一通りDeepFaceLabを使って動画を制作することができると思います。
私もこの手の専門家ではないので、うまくいかないところや、間違っているところがありましたら、指摘していただけると幸いです。

関連項目

外部リンク



寄付(任意)について

Amazon.jpギフト券での寄付は受け付けています
  1. AmazonでE-Mailタイプのギフト券を購入(金額は任意)
  2. 自分のアカウントに登録はしない
  3. 下記メールアドレスにAmazonギフト券番号を記載し、通知
  4. tomoe.magica@gmail.com


Seesaa Wiki関連リンク