久々の投稿で最近話題のディープフェイクを作れるFaceswapの使い方の解説をします
- Faceswapって何?
- 用意する物と下準備
- ステップ①Extractで動画から顔画像の抽出を行う
- ステップ②画像の選別とfsaファイルのクリーンアップ
- ステップ③ Trainでトレーニングでモデルデータを作成する
- ステップ④Convertで変換して動画を完成させる
- まとめ
- 関連サイト
Faceswapって何?
その名の通り顔の入れ替えが出来るフリーのソフトウェアです
動画や画像から被写体の顔を取り出して他の動画や画像に合う様に合成出来ます
機械学習を用いたアルゴリズムで自然な合成を実現してる感じです
Faceswapの日本語の解説記事は殆どなく今の所此処くらいですが
FaceSwapのパソコンソフトでDeepfakeを作る方法|2020最新 - TopTen.ai
この通りに行うと途中で失敗するので本家のフォーラムと格闘しながら行った所何とか成功出来ました
結構落とし穴というか手続きが多いので注意してください
用意する物と下準備
今回の作業に必要な物
-
Faceswap
-
グラフィックボード(※CPUでも可能ですが出来る限りきちんとしたGPUを用意した方が良いです、CPUだとえらい時間が掛かります、NVIDIA/AMD製両方使えます、出来るだけVRAMが多いグラボを推奨)
-
顔を変えたい2つの動画
GPUの条件
- VRAM(GPUのビデオメモリ)の容量が最も重要
- AMD製にも対応するが機械学習系なのでNVIDIA製が良い
- NVDIA製はこの記事の執筆時点ではRTX-3000(ampereアーキテクチャ)には非対応(※現在はRTX-3000にも対応しています、2021/09/7に確認済み)
- 今回当方は玄人志向のRTX2060Superで実行しています
動画の条件
- 出来るだけ目標以外の顔が映っていない物を選ぶ
- 写りの悪い不鮮明な動画は避ける
- 目標の顔を様々な視点から見れる
- 動画は短い物にする、再生時間5分程度の奴が良いです
- いきなり1時間とかに長い物に手を出さないように
※素材となる動画の質が良いほど早く精巧に仕上がるので
きちんとした物を用意しましょう
Faceswapを入手してインストールする
Faceswapの公式サイトへ行きDownloadを選択します
このページにWindows版とLinux版の2種類あるので対応している方のfrom this link.選択します
インストーラーが出てくるのでDLします、途中或いは起動後も様々なファイルを落とすので回線に余裕を持ちましょう
続いてセットアップの設定を行いますお使いの環境に合わせ
NVIDIAかAMDのGPU(グラボ)かCPUの3択から環境に合わせて選択して下さい
そのままインストーラーに従ってインスコします
※作業に入る前の注意点と作業フォルダの整理及びその説明
理由は不明ですがこのFaceswapでは日本語が混じったファイル名やフォルダがあると
エラーが起こるのでこの作業で使用する各path(ルートpathや途中のpathも含む)や作業フォルダや動画などのファイル名は必ず全て英数字にしておいて下さい
その為今回は"work_folder"という名のフォルダを作成してこの中で全ての作業を行う形で説明していきます
フォルダは事前に纏めて作っといた方が説明が楽かなと感じたので此処に書きます
- work_folderの中に名前がAとBの2つのフォルダを作成
- work_folderの中にModel Dirという名のフォルダを作成
- Model Dirの中にTimelapse OutputとTrainingいう名のフォルダを2つ作成
- Aに顔交換の対象となる動画ファイルの片方を配置します(動画のファイル名はmovieAとします)
- Bにも顔交換の対象となる動画ファイルの片方を配置します(動画のファイル名はmovieBとします)
- Aの中に新たにface_imgesAというフォルダを作成
- Bの中に新たにface_imgesBというフォルダを作成
以下の様な作業フォルダの構成になりました
作業フォルダはこれで完成です、此処で付けた名前と配置で以降のステップを説明していきます
今回の顔交換に使用する動画
色々と迷いましたが
movieAをグレタ・トゥーンベリ、movieBをエマ・ワトソンにしました
すなわちグレタの顔だけをエマの顔に挿げ替えます(逆も可能です)
どちらもyoutubeから取った物ですが誤解の無いよう下記に元動画のリンクを載せておきます
movieA(グレタ)の元動画
https://www.youtube.com/watch?v=KAJsdgTPJpU
movieB(エマ)の元動画
今回の実行環境
種類 | ハード名 |
---|---|
CPU | RYZEN 7 2700X |
GPU | RTX2060SUPER (NVDIAのドライバーは457.09) |
メモリ |
G-SKILL F4-3600C19D-16GSXWB 8GB*2 |
マザー | MSI B450 GAMING PLUS MAX |
SSD | SanDisk SDSSDH3-500G-J25 |
電源 |
NeoECO Gold NE750G |
OS |
windows10 64bit版 |
全ての準備が終わりましたら用意する物と下準備の項を終えて次からは顔交換作業に入ります
ステップ①Extractで動画から顔画像の抽出を行う
このステップでは動画から顔の抽出作業を行います
Faceswapを起動しExtractの設定を行います
Extractの設定
- Extractタブを選択します
- DataのInput DirでmovieA選択(※選択アイコンは右が画像で左が動画、今回は動画なので左です)
- DataのOutput Dirで↑の動画から抽出した顔画像の保存先を指定します、此処はface_imgesAを選択
- その他の設定などは以下の画像をご参考下さい、基本弄る所は殆どありません
準備が済んだら一番下の▷Extractボタンを押して抽出を実行します
進捗を見たければGUI右下のステータスバーを、右タブのpreviewを押すと抽出している現在の動画内のフレームが表示されます
しばらく待ちましょう、GUI一番下のログ表示欄にProcess exited.と表示されたら終了です
抽出された画像とfsaファイルの確認
無事に終了するとface_imgesAには
movieAから抽出された大量の顔の画像が保存されているのが分かります
またmovieAと同じディレクトリには"movieAと同じ名前+aligenments.fsa"という名前のファイルが生成されます、これは次以降のステップで使用する重要なファイルです
これでmovieAの抽出を終えました
もう片方のmovieBでも此処までのステップと同様の手続きを行います
こちらはface_imegsBが出力先になります
こうして顔を交換したい2つの動画からそれぞれ顔画像の抽出とfsaファイルを作成出来ましたらステップ②へと進みます
ステップ②画像の選別とfsaファイルのクリーンアップ
ステップ①で動画から抽出された顔の画像には顔とは関係ない画像や
動画によってはスワップの対象外の人物の顔等が大量に含まれています
後のトレーニングに不要な画像を取り除く選別作業をこのステップで行いますが
抽出された画像は多い上に位置もばらけていて、そのまま行うのは限界が有ります
幸いにも楽に行う手段が用意されているのでそれを使います
ソートツールを使って類似する画像の並び替えを行う
- Toolsタブを選択→その下にあるSortタブを選択します
- DataのInputに選別したい顔画像を収めたフォルダを指定(此処ではfaces_imagsA)
- Sort Settingセクション->Sort by内のFaceにチェックを入れる
- それ以外の設定は以下の画像の通りでokです
準備が出来たら一番下の▷Sortを押すと画像の並べ替えが始まります
GUI右下のステータスバーで終了までの残り時間が見れます
一番下のログ表示欄にProcess exited.と表示されたら終了です
終わったらSortされた画像フォルダを覗いてみます
動画の進行に合わせた抽出順だったSort前と比べて
類似する画像に基づいて綺麗に並べ替えされてますね
これで選別がしやすくなったので不要な画像を手動で削除していきます
削除対象の条件ですが概ね以下の要件に当てはまる物から選びます
- 顔交換の対象以外の人物等
- 顔ではない物
- 顔が隠れている物
- 写りが悪い物
- 小さすぎる物
- 顔画像が回転してたり変な向きになっている物
alignments.fsaファイルに最新の情報を反映させる
画像の選別作業が終わりましたらalignments.fsaファイルにもその事を伝える作業を行います
動画からの抽出時に作られた奴ですね、フォーラムの解説によると動画内のフレーム(画像)の配置ファイルらしく
削除前の画像の情報も残っているので選別作業後はクリーンアップしないと後々問題が起こる可能性有りとなってます
記事冒頭のTopTenAIでの解説では此処の説明が無く
恐らくこの作業を飛ばすと最後の変換で何も起こらず失敗します
fsaファイルのクリーンアップ設定法
-
Toolsタブ→Alignmentsタブを選択
-
jobのRemove-Facesにチェックを入れる(※隣にあるRemove-Framesと間違えない様に)
- DataのAlignments Fileにfsaファイルを選択(movieAと同じ所に有ります、此処ではmovieAalignments.fsaを選択)
- DataのFaces Flderに並べ替えした時と同じ顔画像の入ったフォルダを選ぶ(此処ではfaces_imgesAを選択)
- それ以外は概ねそのままで下の画像通りの設定でokです
準備が出来たら▷Alignmentsを実行、この作業はすぐ終わります
一番下のログ表示欄にProcess exitedと表示されたら終了です
fsaファイルが新たに生成されている所に注目して下さい
新たに生成された物はこの▷Alignments実行前のバックアップファイルであり
ファイル名に年月日が記載されています
今後もfsaを変更する操作を行う度に同様のバックアップfsaファイルが作られますが
基本使用するのは年月日が記載されていない方の最初のfsaファイルだけです
此処に常に最新の情報が反映されて行くので間違えない様にして下さい
画像の様にプロパティでfsaファイルの作成日時や更新日時を見て頂けると何となくわかると思います、選別後にクリーンアップしたfsaファイルは画像を減らした分容量も減っているので分りやすいかなと
これでface_imgesAの選別作業とクリーンアップは終了です
face_imgesBとそのfsaファイルでも此処までと同様の処理を行ったらステップ②は終了します
ステップ③ Trainでトレーニングでモデルデータを作成する
このステップではこの作業の肝となるトレーニングを行います
※このトレーニングはかなり時間が掛かる作業です
顔画像集の質や量、お使いのハードスペックにもよりますが
半日は平気で掛かります、なので5分程度の短い動画と少ない画像集で試す事をお勧めします
トレーニングの手順と設定
- ※最新版ではAlignments A/Bの箇所は削除されているようなのでそこだけ飛ばして下さい
- Trainタブに切り替え→すぐ下にあるFaces内の設定を行います
- Input Aにface_imgesAを指定
- Alignments AにmovieAalignments.fsaを指定
- Input Bにface_imgesBを指定
- Alignments BにmovieBalignments.fsaを指定
- ModelのModel DirにはTrainingを指定
- Trainタブ内を下にスクロールしてTimelapseの所へ移動します
- Timelapse Input AはInput Aと同じ所を指定
- Timelapse Input BはInput Bと同じ所を指定
- Timelepse OutputはTimelapse Outputを指定(此処にはトレーニング中のpreviewで表示される進捗具合を定期的に表示する画像が保存される場所になります)
- その他の設定などは以下より参考下さい
全ての準備が出来たら▷Trainingを押してトレーニング開始です
中断したい場合は□Stopを押せば何時でも終了できます
データはトレーニング中でも定期的に保存されているので
このステップで同じ設定にすれば今後そのトレーニングは何時でも再開できます
トレーニング成果具合の判断
右のpreviewタブで随時更新されるスワップ画像の出来を見て判断します
orignal > swapの列がmovieAとmovieBの顔交換が行われている箇所です
この列を見て仕上がりに満足の行く状態であればトレーニングを終了しましょう
ステップ④Convertで変換して動画を完成させる
トレーニングで良いモデルを作成出来たらいよいよ変換動画の作成に入ります
Convertの設定法
- Convertタグを選択します
- DataのInput Dirで顔を変えたい方の動画を選択します(今回はmovieAを選択)
- DataのOutput Dirに変換後の動画の出力先を選択します
- DataのAlignmentsにはInput Dirの動画のfsaファイルを指定(此処ではmovieAalignments.fsaを選択)
- DataのModel DirでTrainingを指定
- WriterでFfmpegを選択
- それ以外の設定は概ね以下の画像の通りです
今回はmovieAの動画の顔だけをmovieBの顔に変えるケースで説明しますが
トレーニングで作成されたModel自体は双方向なので
逆にmovieBの顔だけをmovieAの顔に変える事も勿論可能です
その場合はInput DirとAlignmentsの箇所をmovieBとそのfsaファイルに変えるだけです
準備が終わりましたら▷Covertを押して変換開始です
こちらは動画が短ければ早く終わります
右下のステータスバーで進捗時間、preview画面で変換中の動画のフレームが見れます
一番下のログ表示欄にProcess exitedと表示されたら終了です
変換された動画はOutput Dirで指定した出力先に動画名+convertedというファイル名で生成されている筈です
これで完成ですので再生して見ましょう(※youtubeに上げました)
完成した動画を見て不満な出来だった場合は
- ステップ③に戻りトレーニングを再開する
- 素材となる動画を変える或いは画像を増やし、トレーニングを継続或いはやり直す
フォーラムの解説から一部抜粋すると
- 顔画像は双方共に最低でも500以上で10000似内(※500未満だとトレーニングが実行できずエラーになります、10000超えだとエラーは出ませんが多過ぎても支障をきたすと有るのでこの範囲に纏めた方が良いとの事)
- 似たような画像ばかりだと意味がない
- 出来るだけ多くの角度、表情、照明条件などが必要
- 同一人物でも老若やメイクなどで顔が変わり過ぎているとダメ
- 交換対象の両者の顔の作りや画像のシチュエーションが似ているほど良い
- これらの画像の種類の偏りが少なく均等に分散された画像集が理想
今回は双方共にそれぞれ1つの動画からの抽出だけで解説してますが
顔画像フォルダを複数の動画から抽出して一つに束ねる方法も有ります
実際フォーラムの解説では複数のソースから顔画像を集める事を推奨しています
長くなりそうだったので今回は記述してませんが近い内に別の記事で説明したいです
取り敢えず今回はスワップ動画の出来に関わらずFaceswapの一連の処理の流れと操作を完遂させる記事にしたかったので
※この部分を解説する補足記事を上げました
トレーニング中のPCへの負荷
今回ryzen_2700XとRTX_2060_Superの組み合わせで実行しましたが
トレーニング中は前者で大体使用率が40%くらいです
GPUは見かけの上では負荷が低く見えますが
タスクマネージャーでCUDAに切り替えると仕事しているのが確認できます
最後の変換はCPU依存なので100%まで行きますね、グラボもそうですが
CPUもそれなりの物を用意しとかないとあかん様です
まとめ
Faceswapの主な使い方は以上になります、いかがだったでしょうか
交換相性の良い組み合わせやトレーニングの時間が掛かる、変換も不自然さや違和感が残る等
お手軽とは言えずまだまだハードルは高い感じですね
それでもこういう技術がこうして身近になって行く事は新たな時代に入ってきてるなと実感しました
なお制作した動画はあくまでプライベートで楽しむようにして下さい
かなり長い記事になってしまいましたが此処までご覧くださった方、有難うございました
関連サイト
Faceswapフォーラムと主な作業の説明ページのリンクです、詳しく知りたい方はこちらをどうぞ(全部英語ですのでグーグル翻訳等を駆使して下さい)
Faceswap Forum - The place to discuss Faceswap and Deepfakes - Forum Home
抽出のガイド
[Guide] Extraction - A Workflow - Faceswap Forum - The place to discuss Faceswap and Deepfakes
トレーニングのガイド
[Guide] Training in Faceswap - Faceswap Forum - The place to discuss Faceswap and Deepfakes
変換のガイド
[Guide] A Rough Guide to Converting - Faceswap Forum - The place to discuss Faceswap and Deepfakes
Faceswapに関するよくある質問やトラブルは公式がテンプレを用意しているのでこちらで
forum-faceswap-dev.translate.goog