【ディープフェイク】Faceswapの使い方【顔交換】

久々の投稿で最近話題のディープフェイクを作れるFaceswapの使い方の解説をします

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.選択します

Faceswapのダウンロード画面

Faceswapのダウンロード画面

 

インストーラーが出てくるのでDLします、途中或いは起動後も様々なファイルを落とすので回線に余裕を持ちましょう

 

続いてセットアップの設定を行いますお使いの環境に合わせ

NVIDIAAMDのGPU(グラボ)かCPUの3択から環境に合わせて選択して下さい

Faceswapのセットアップ画面

Faceswapのセットアップ画面、NVIDIA製GPU,AMD製GPU,CPUの三択から選ぶ

そのままインストーラーに従ってインスコします

 

※作業に入る前の注意点と作業フォルダの整理及びその説明

理由は不明ですがこのFaceswapでは日本語が混じったファイル名やフォルダがあると

エラーが起こるのでこの作業で使用する各path(ルートpathや途中のpathも含む)や作業フォルダや動画などのファイル名は必ず全て英数字にしておいて下さい

 

その為今回は"work_folder"という名のフォルダを作成してこの中で全ての作業を行う形で説明していきます

フォルダは事前に纏めて作っといた方が説明が楽かなと感じたので此処に書きます

  • work_folderの中に名前がABの2つのフォルダを作成
  • work_folderの中にModel Dirという名のフォルダを作成
  • Model Dirの中にTimelapse OutputTrainingいう名のフォルダを2つ作成
  • Aに顔交換の対象となる動画ファイルの片方を配置します(動画のファイル名はmovieAとします)
  • Bにも顔交換の対象となる動画ファイルの片方を配置します(動画のファイル名はmovieBとします)
  • Aの中に新たにface_imgesAというフォルダを作成
  • Bの中に新たにface_imgesBというフォルダを作成

以下の様な作業フォルダの構成になりました

work_folder、Model_Dir、A,Bフォルダの画像

work_folder、Model_Dir、A,Bの4つのフォルダの画像

 

作業フォルダはこれで完成です、此処で付けた名前と配置で以降のステップを説明していきます

今回の顔交換に使用する動画

色々と迷いましたが

movieAをグレタ・トゥーンベリ、movieBをエマ・ワトソンにしました

すなわちグレタの顔だけをエマの顔に挿げ替えます(逆も可能です)

どちらもyoutubeから取った物ですが誤解の無いよう下記に元動画のリンクを載せておきます

movieA(グレタ)の元動画

https://www.youtube.com/watch?v=KAJsdgTPJpU

movieB(エマ)の元動画

https://www.youtube.com/watch?v=rzz0N9lTw8c

今回の実行環境

 種類 ハード名
 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の設定

  1. Extractタブを選択します
  2. DataInput DirmovieA選択(※選択アイコンは右が画像で左が動画、今回は動画なので左です)
  3. DataOutput Dirで↑の動画から抽出した顔画像の保存先を指定します、此処はface_imgesAを選択
  4. その他の設定などは以下の画像をご参考下さい、基本弄る所は殆どありません

Extract(抽出)の設定画面

Extract(抽出)の設定画面

 

準備が済んだら一番下の▷Extractボタンを押して抽出を実行します

進捗を見たければGUI右下のステータスバーを、右タブのpreviewを押すと抽出している現在の動画内のフレームが表示されます

抽出中の画面

抽出中の画面の様子

しばらく待ちましょう、GUI一番下のログ表示欄にProcess exited.と表示されたら終了です

Process_exitedの説明画面

Process_exitedのこのログが出たら終了

 抽出された画像とfsaファイルの確認

無事に終了するとface_imgesAには

movieAから抽出された大量の顔の画像が保存されているのが分かります

face_imgesAフォルダ内には大量の抽出画像が保存される

抽出後のface_imgesAフォルダ内の様子

またmovieAと同じディレクトリには"movieAと同じ名前+aligenments.fsa"という名前のファイルが生成されます、これは次以降のステップで使用する重要なファイルです

拡張子fsaのファイルが新たに生成される

拡張子fsaのファイルが生成される

これでmovieAの抽出を終えました

もう片方のmovieBでも此処までのステップと同様の手続きを行います

こちらはface_imegsBが出力先になります

 

こうして顔を交換したい2つの動画からそれぞれ顔画像の抽出とfsaファイルを作成出来ましたらステップ②へと進みます

 

ステップ②画像の選別とfsaファイルのクリーンアップ

ステップ①で動画から抽出された顔の画像には顔とは関係ない画像や

動画によってはスワップの対象外の人物の顔等が大量に含まれています

後のトレーニングに不要な画像を取り除く選別作業をこのステップで行いますが

抽出された画像は多い上に位置もばらけていて、そのまま行うのは限界が有ります

幸いにも楽に行う手段が用意されているのでそれを使います

ソートツールを使って類似する画像の並び替えを行う

  • Toolsタブを選択→その下にあるSortタブを選択します
  • DataのInputに選別したい顔画像を収めたフォルダを指定(此処ではfaces_imagsA)
  • Sort Settingセクション->Sort by内のFaceにチェックを入れる
  • それ以外の設定は以下の画像の通りでokです

FaceswapのSort設定画面

FaceswapのSort設定画面

準備が出来たら一番下の▷Sortを押すと画像の並べ替えが始まります

GUI右下のステータスバーで終了までの残り時間が見れます

一番下のログ表示欄にProcess exited.と表示されたら終了です

 

終わったらSortされた画像フォルダを覗いてみます

Sort後のface_imgesA内の様子

Sort後のface_imgesA内の様子

動画の進行に合わせた抽出順だったSort前と比べて

類似する画像に基づいて綺麗に並べ替えされてますね

これで選別がしやすくなったので不要な画像を手動で削除していきます

削除対象の条件ですが概ね以下の要件に当てはまる物から選びます

  • 顔交換の対象以外の人物等
  • 顔ではない物
  • 顔が隠れている物
  • 写りが悪い物
  • 小さすぎる物
  • 顔画像が回転してたり変な向きになっている物

alignments.fsaファイルに最新の情報を反映させる

画像の選別作業が終わりましたらalignments.fsaファイルにもその事を伝える作業を行います

動画からの抽出時に作られた奴ですね、フォーラムの解説によると動画内のフレーム(画像)の配置ファイルらしく

削除前の画像の情報も残っているので選別作業後はクリーンアップしないと後々問題が起こる可能性有りとなってます

記事冒頭のTopTenAIでの解説では此処の説明が無く

恐らくこの作業を飛ばすと最後の変換で何も起こらず失敗します

fsaファイルのクリーンアップ設定法

  • Toolsタブ→Alignmentsタブを選択

  • jobRemove-Facesにチェックを入れる(※隣にあるRemove-Framesと間違えない様に)

  • DataのAlignments Fileにfsaファイルを選択(movieAと同じ所に有ります、此処ではmovieAalignments.fsaを選択)
  • DataのFaces Flderに並べ替えした時と同じ顔画像の入ったフォルダを選ぶ(此処ではfaces_imgesAを選択)
  • それ以外は概ねそのままで下の画像通りの設定でokです

Alignmentsの設定画面

Alignmentsの設定画面

準備が出来たら▷Alignmentsを実行、この作業はすぐ終わります

 一番下のログ表示欄にProcess exitedと表示されたら終了です

 

fsaファイルが新たに生成されている所に注目して下さい

新たに生成された物はこの▷Alignments実行前のバックアップファイルであり

ファイル名に年月日が記載されています

クリーンアップ前のfsaファイルがバックアップとして生成される

クリーンアップ前のfsaファイルがバックアップとして生成される

 

今後もfsaを変更する操作を行う度に同様のバックアップfsaファイルが作られますが

基本使用するのは年月日が記載されていない方の最初のfsaファイルだけです

此処に常に最新の情報が反映されて行くので間違えない様にして下さい

画像の様にプロパティでfsaファイルの作成日時や更新日時を見て頂けると何となくわかると思います、選別後にクリーンアップしたfsaファイルは画像を減らした分容量も減っているので分りやすいかなと

 

 

これでface_imgesAの選別作業とクリーンアップは終了です

face_imgesBとそのfsaファイルでも此処までと同様の処理を行ったらステップ②は終了します

ステップ③ Trainでトレーニングでモデルデータを作成する

このステップではこの作業の肝となるトレーニングを行います

※このトレーニングはかなり時間が掛かる作業です

顔画像集の質や量、お使いのハードスペックにもよりますが

半日は平気で掛かります、なので5分程度の短い動画と少ない画像集で試す事をお勧めします

トレーニングの手順と設定

  • ※最新版ではAlignments A/Bの箇所は削除されているようなのでそこだけ飛ばして下さい
  • Trainタブに切り替え→すぐ下にあるFaces内の設定を行います
  • Input Aface_imgesAを指定
  • Alignments AmovieAalignments.fsaを指定
  • Input Bにface_imgesBを指定
  • Alignments BmovieBalignments.fsaを指定
  • ModelModel DirにはTrainingを指定
  • Trainタブ内を下にスクロールしてTimelapseの所へ移動します
  • Timelapse Input AInput Aと同じ所を指定
  • Timelapse Input BInput Bと同じ所を指定
  • Timelepse OutputTimelapse Outputを指定(此処にはトレーニング中のpreviewで表示される進捗具合を定期的に表示する画像が保存される場所になります)
  • その他の設定などは以下より参考下さい

FaceswapのTrain設定画面

FaceswapのTrain設定画面

 

 全ての準備が出来たら▷Trainingを押してトレーニング開始です

中断したい場合は□Stopを押せば何時でも終了できます

データはトレーニング中でも定期的に保存されているので

このステップで同じ設定にすれば今後そのトレーニングは何時でも再開できます

トレーニング成果具合の判断

右のpreviewタブで随時更新されるスワップ画像の出来を見て判断します

orignal > swapの列がmovieAmovieBの顔交換が行われている箇所です

Faceswap、Train中の画面黄色い枠の列が顔交換が行われている箇所

Faceswap、Train中の画面、黄色い枠の列が双方の顔交換が行われている箇所

この列を見て仕上がりに満足の行く状態であればトレーニングを終了しましょう

ステップ④Convertで変換して動画を完成させる

トレーニングで良いモデルを作成出来たらいよいよ変換動画の作成に入ります

Convertの設定法

  • Convertタグを選択します
  • DataのInput Dirで顔を変えたい方の動画を選択します(今回はmovieAを選択)
  • DataのOutput Dirに変換後の動画の出力先を選択します
  • DataのAlignmentsにはInput Dirの動画のfsaファイルを指定(此処ではmovieAalignments.fsaを選択)
  • DataのModel DirTrainingを指定
  • WriterでFfmpegを選択
  • それ以外の設定は概ね以下の画像の通りです

FaceswapのConvert設定画面

FaceswapのConvert設定画面

今回はmovieAの動画の顔だけをmovieBの顔に変えるケースで説明しますが

トレーニングで作成されたModel自体は双方向なので

逆にmovieBの顔だけをmovieAの顔に変える事も勿論可能です

その場合はInput DirAlignmentsの箇所をmovieBとそのfsaファイルに変えるだけです

 

 準備が終わりましたら▷Covertを押して変換開始です

こちらは動画が短ければ早く終わります

 右下のステータスバーで進捗時間、preview画面で変換中の動画のフレームが見れます

一番下のログ表示欄にProcess exitedと表示されたら終了です

変換された動画はOutput Dirで指定した出力先に動画名+convertedというファイル名で生成されている筈です

変換を終えて完成したmovieA

変換を終えて完成したmovieA

これで完成ですので再生して見ましょう(※youtubeに上げました)

youtu.be

完成した動画を見て不満な出来だった場合は

  • ステップ③に戻りトレーニングを再開する
  • 素材となる動画を変える或いは画像を増やし、トレーニングを継続或いはやり直す

フォーラムの解説から一部抜粋すると

  • 顔画像は双方共に最低でも500以上で10000似内(※500未満だとトレーニングが実行できずエラーになります、10000超えだとエラーは出ませんが多過ぎても支障をきたすと有るのでこの範囲に纏めた方が良いとの事)
  • 似たような画像ばかりだと意味がない
  • 出来るだけ多くの角度、表情、照明条件などが必要
  • 同一人物でも老若やメイクなどで顔が変わり過ぎているとダメ
  • 交換対象の両者の顔の作りや画像のシチュエーションが似ているほど良い
  • これらの画像の種類の偏りが少なく均等に分散された画像集が理想

今回は双方共にそれぞれ1つの動画からの抽出だけで解説してますが

顔画像フォルダを複数の動画から抽出して一つに束ねる方法も有ります

実際フォーラムの解説では複数のソースから顔画像を集める事を推奨しています

長くなりそうだったので今回は記述してませんが近い内に別の記事で説明したいです

取り敢えず今回はスワップ動画の出来に関わらずFaceswapの一連の処理の流れと操作を完遂させる記事にしたかったので

 

※この部分を解説する補足記事を上げました

www.kujikun.com

トレーニング中のPCへの負荷

今回ryzen_2700XRTX_2060_Superの組み合わせで実行しましたが

トレーニング中は前者で大体使用率が40%くらいです

GPUは見かけの上では負荷が低く見えますが

タスクマネージャーでCUDAに切り替えると仕事しているのが確認できます

最後の変換はCPU依存なので100%まで行きますね、グラボもそうですが

CPUもそれなりの物を用意しとかないとあかん様です

 

CPU:Ryzen_7_2700X

GPU:RTX2060_Super

Faceswap、Train中のタスクマネージャーのCPUとGPUの様子

 

まとめ

 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