見出し画像

写真や動画の顔の交換 / FaceSwap

1. FaceSwap

FaceSwap」は、深層学習を利用して、写真や動画の顔を交換するツールです。

2. FaceSwapのインストール

今回は「Mac Mojava」に、遅いけど簡単なCPU版でインストールします。

(1)「Anaconda」で「Python 3.6」の仮想環境を生成。
(2)「FaceSwap」をgitで取得。

$ git clone --depth 1 https://github.com/deepfakes/faceswap.git

(3)「FaceSwap」をインストール。

$ cd faceswap
$ pip install -r requirements.txt

(4)「TensorFlow」のインストール。
(GPU使うときは「temsorflow-gpu」をインストール)

$ pip install tensorflow

(5)「FaceSwap」の動作確認。
「faceswap.py」のヘルプを実行して、動作するかどうか確認します。

$ python faceswap.py -h

初回実行時に、「AMD」「CPU」「NVIDIA」の選択を促されます。今回は「CPU」を選択します。
(NVIDIAのGPUを使うときは「NVIDIA」を選択)

First time configuration. Please select the required backend
1: AMD, 2: CPU, 3: NVIDIA:

ヘルプの出力は次の通りです。

Setting Faceswap backend to AMD
usage: faceswap.py [-h] {extract,train,convert,gui} ...

positional arguments:
 {extract,train,convert,gui}
   extract             Extract the faces from pictures
   train               This command trains the model for the two faces A and
                       B
   convert             Convert a source image to a new one with the face
                       swapped
   gui                 Launch the Faceswap Graphical User Interface

optional arguments:
 -h, --help            show this help message and exit

2. 元データの収集

はじめに、交換する2つの顔を学習する必要があります。「FaceSwap」は、「静止画像」と「動画」の両方から顔を抽出することができます。

「Google画像検索」などで、顔画像を少なくとも60枚ずつ収集します。
より良い画像のソースは、動画(インタビュー、スピーチ、または映画から)です。これらはより多くの自然なポーズと表情をキャプチャします。

今回は、「Google画像検索」で顔が写ってる画像2人分を各64枚以上収集します。別の人の顔が写り込んでる画像は入れないでください。

・src/A: 顔写真Aの64枚以上
・src/B: 顔写真Bの64枚以上

3. 顔の抽出

写真から顔部分のみ抽出した256x256の画像を生成します。コマンドは次の通りです。「src/faces/A」と「src/faces/B」に出力されます。

$ python faceswap.py extract -i src/A -o src/faces/A
$ python faceswap.py extract -i src/B -o src/faces/B

動画から顔画像を抽出する時のコマンドは次の通りです。

$ python faceswap.py extract -i src/A.mp4 -o src/faces/A
$ python faceswap.py extract -i src/B.mp4 -o src/faces/B

その他のオプションは次の通りです。

usage: faceswap.py extract [-h] [-C CONFIGFILE]
   [-L {INFO,VERBOSE,DEBUG,TRACE}] [-LF LOGFILE] -i
   INPUT_DIR -o OUTPUT_DIR [-al ALIGNMENTS_PATH]
   [--serializer {json,pickle,yaml}]
   [-D {cv2-dnn,mtcnn,s3fd}] [-A {cv2-dnn,fan}]
   [-nm {none,clahe,hist,mean}] [-r ROTATE_IMAGES]
   [-min MIN_SIZE] [-n NFILTER [NFILTER ...]]
   [-f FILTER [FILTER ...]] [-l REF_THRESHOLD]
   [-bt BLUR_THRESH] [-een EXTRACT_EVERY_N] [-sz SIZE]
   [-si SAVE_INTERVAL] [-dl] [-ae] [-s] [-sf]

-h, --help
ヘルプ表示。

-C CONFIGFILE, --configfile CONFIGFILE
コンフィグファイルの指定。

-L {INFO,VERBOSE,DEBUG,TRACE}, --loglevel {INFO,VERBOSE,DEBUG,TRACE}
ログレベル。

-LF LOGFILE, --logfile LOGFILE
ログファイルのパス。

-i INPUT_DIR, --input-dir INPUT_DIR
入力フォルダまたは入力動画のパス。

-o OUTPUT_DIR, --output-dir OUTPUT_DIR
出力フォルダ。

-al ALIGNMENTS_PATH, --alignments ALIGNMENTS_PATH
アライメントファイルのパス。

--serializer {json,pickle,yaml}
アライメントファイルのシリアライザ。
yamlが選択されて利用できない場合、jsonがデフォルトのフォールバックとして使用される。

-D {cv2-dnn,mtcnn,s3fd}, --detector {cv2-dnn,mtcnn,s3fd}
使用する検出器。
   - 'cv2-dnn': CPUのみの抽出プログラムは、最も信頼性が低くなるが、使用するリソースが最も少なく、CPUで高速に実行される。GPUを使用せず、時間が重要な場合に使用。
   - 'mtcnn': GPUで高速、CPUで低速。他のGPU検出器よりも少ないリソースを使用するが、多くの場合、より多くの誤検知を返す可能性がある。 NB:AMDカードのCPUで実行される。
   - 's3fd': GPUで高速、CPUで低速。 他のGPU検出器よりも多くの顔を検出し、誤検出を少なくすることができるが、多くのリソースを消費する。

-A {cv2-dnn,fan}, --aligner {cv2-dnn,fan}
使用するアライナー。
   - 'cv2-dnn': CPUのみのCNNベースのランドマーク検出器。 より速く、より少ないリソースを消費するが、正確さは低下。 GPUを使用せず、時間が重要な場合にのみこれを使用。
   - 'fan': Face Alignment Network. 最高のアライナー。 GPUが重い、GPUで実行していないときは遅い。

-nm {none,clahe,hist,mean}, --normalization {none,clahe,hist,mean}
正規化を実行すると、アライナは抽出速度を犠牲にして、困難な照明条件で顔をよりよく整列させるのに役立つ。
異なる方法では、異なるセットで異なる結果が得られる。
注意:これは出力面には影響せず、アライナーへの入力にのみ影響。
   - 'none': 顔の正規化を実行しない。
   - 'clahe': 顔にコントラスト制限付き適応ヒストグラム均等化を実行。
   - 'hist': RGBチャンネルのヒストグラムを均等化。
   - 'mean': 顔の色を平均に正規化。

-r ROTATE_IMAGES, --rotate-images ROTATE_IMAGES
顔が見つからない場合は、画像を回転して顔を見つけようとします。
抽出速度を犠牲にしてより多くの顔を見つけることができます。
単一の数値を渡して最大360までそのサイズの増分を使用するか、数値のリストを渡してチェックする角度を正確に列挙します。

-min MIN_SIZE, --min-size MIN_SIZE
このサイズ未満で検出された顔を除外します。
境界ボックスの対角線を横切るピクセル単位の長さ。
オフの場合は0に設定。

-n NFILTER [NFILTER ...], --nfilter NFILTER [NFILTER ...]
必要に応じて、その人の画像を渡すことで、処理したくない人を除外します。
画像に一人の人物が写っている正面の肖像画であるべきです。
複数の画像をスペースで区切って追加できます。
注意:顔フィルタを使用すると、抽出速度が大幅に低下し、その精度を保証できない。

-f FILTER [FILTER ...], --filter FILTER [FILTER ...]
必要に応じて、その人の画像を渡すことにより、処理する人を選択する。
画像に一人の人物が写っている正面の肖像画であるべき。
複数の画像をスペースで区切って追加できる。
注意:顔フィルタを使用すると、抽出速度が大幅に低下し、その精度を保証できない。

-l REF_THRESHOLD, --ref_threshold REF_THRESHOLD
オプションのnfilter/filterファイルで使用。
肯定的な顔認識のしきい値。
値が小さいほど厳しくなる。
注意:顔フィルターを使用すると、抽出速度が大幅に低下し、その精度を保証できない。

-bt BLUR_THRESH, --blur-threshold BLUR_THRESH
指定したしきい値よりもぼやけている画像を自動的に破棄。
破棄された画像は、「blurry」サブフォルダに移動される。
値を小さくすると、ブラーが大きくなる。
オフにするには0.0に設定します。

-een EXTRACT_EVERY_N, --extract-every-n EXTRACT_EVERY_N
「n番目」のフレームごとに抽出。
このオプションは、顔を抽出するときにフレームをスキップ。
たとえば、値1はすべてのフレームから顔を抽出し、値1010番目のフレームごとに顔を抽出。

-sz SIZE, --size SIZE
抽出された面の出力サイズ。
訓練するモデルが必要なサイズをサポートしていることを確認すること。
これは、高解像度モデルでのみ変更する必要がある。

-si SAVE_INTERVAL, --save-interval SAVE_INTERVAL
一定量のフレームの後にアライメントファイルを自動的に保存。
デフォルトでは、アライメントファイルは抽出プロセスの最後にのみ保存される。
注意:2パスで抽出する場合、アライメントファイルは2パスでのみ保存され始める。
警告:ファイルが破損する可能性があるため、ファイルを書き込むときにスクリプトを中断しないように。 0に設定するとオフになる。

-dl, --debug-landmarks
デバッグの目的で、出力面にランドマークを描画。

-ae, --align-eyes
追加の位置合わせを実行して、左目と右目が同じ高さになるようにする。

-s, --skip-existing
すでに抽出され、アライメントファイルに存在するフレームをスキップ。

-sf, --skip-existing-faces
アライメントファイルで既に顔を検出したフレームをスキップ。

4. モデルの学習

抽出した顔画像を使って、モデルの学習を行うコマンドは次の通りです。モデルは「A_B_model」に出力されます。プレビューも表示されます。

$ python faceswap.py train -A src/faces/A -B src/faces/B -m A_B_model/ -p

その他のオプションは次の通りです。

usage: faceswap.py train [-h] [-C CONFIGFILE] [-L {INFO,VERBOSE,DEBUG,TRACE}]
   [-LF LOGFILE] -A INPUT_A [-ala ALIGNMENTS_PATH_A] -B
   INPUT_B [-alb ALIGNMENTS_PATH_B] -m MODEL_DIR
   [-t {dfaker,dfl-h128,dfl-sae,iae,lightweight,original,realface,unbalanced,villain}]
   [-bs BATCH_SIZE] [-it ITERATIONS] [-s SAVE_INTERVAL]
   [-ss SNAPSHOT_INTERVAL] [-tia TIMELAPSE_INPUT_A]
   [-tib TIMELAPSE_INPUT_B] [-to TIMELAPSE_OUTPUT]
   [-ps PREVIEW_SCALE] [-p] [-w] [-nl] [-wl] [-nf]
   [-nac]

-h, --help
ヘルプ表示。

-C CONFIGFILE, --configfile CONFIGFILE
コンフィグファイルの指定。

-L {INFO,VERBOSE,DEBUG,TRACE}, --loglevel {INFO,VERBOSE,DEBUG,TRACE}
ログレベル。

-LF LOGFILE, --logfile LOGFILE
ログファイルのパス。

-A INPUT_A, --input-A INPUT_A
顔Aの訓練画像を含むフォルダ。

-ala ALIGNMENTS_PATH_A, --alignments-A ALIGNMENTS_PATH_A
訓練セットAのアライメントファイルのパス。
<input-A>/alignments.json

-B INPUT_B, --input-B INPUT_B
顔Bの訓練画像を含むフォルダ。

-alb ALIGNMENTS_PATH_B, --alignments-B ALIGNMENTS_PATH_B
訓練セットBのアライメントファイルのパス。
<input-B>/alignments.json

-m MODEL_DIR, --model-dir MODEL_DIR
モデルフォルダ。
新しいモデルを開始する場合は、空または存在しないフォルダを指定。
既存のモデルの訓練を続行する場合は、既存のモデルのフォルダを指定。

-t {dfaker,dfl-h128,dfl-sae,iae,lightweight,original,realface,unbalanced,villain}, --trainer {dfaker,dfl-h128,dfl-sae,iae,lightweight,original,realface,unbalanced,villain}
使用するトレーナーの指定。
   - original: /u/deepfakesによって作成された元のモデル。
   - dfaker: dfakerの64px in/128px outモデル。full dfaker methodの'warp-to-landmarks'を有効にする。
   - dfl-h128: deepfacelabの128px in/out モデル
   - dfl-sae: deepfacelabのAdaptableモデル
   - iae: 中間層を使用して詳細を取得しようとするモデル
   - lightweight: ローエンドカード用の軽量モデル。バッチサイズ8で最低1.6GBの訓練が可能。
   - realface: カスタマイズ可能なin/out resolutionを備えた、DFakerに基づく高詳細なdual densityモデル。
   自動エンコーダーはアンバランスであるため、B>Aスワップはそれほどうまく機能しない。
   - unbalanced: andenixaの128px in/out モデル。
   自動エンコーダーはアンバランスであるため、B>Aスワップはそれほどうまく機能しない。
   - villain: villainguyの128px in/out モデル。非常にリソースを消費する(バッチサイズ1611GB)。詳細に適しているが、色差の影響を受けやすくなっている。

-bs BATCH_SIZE, --batch-size BATCH_SIZE
バッチサイズ。
大きなバッチには、より多くのGPU RAMが必要。

-it ITERATIONS, --iterations ITERATIONS
反復のトレーニングの長さ。 これは実際に自動化にのみ使用される。
モデルを訓練する必要のある「正しい」反復回数はない。
プレビューに満足したら、トレーニングを停止する必要がある。
ただし、設定した反復回数でモデルを自動的に停止する場合は、ここでその値を設定できる。

-s SAVE_INTERVAL, --save-interval SAVE_INTERVAL
各モデルの保存間の反復回数を設定。

-ss SNAPSHOT_INTERVAL, --snapshot-interval SNAPSHOT_INTERVAL
モデルのバックアップスナップショットを現在の状態で保存するまでの反復回数を設定。
オフの場合は0に設定。

-tia TIMELAPSE_INPUT_A, --timelapse-input-A TIMELAPSE_INPUT_A
タイムラプスを作成するためのオプション。
タイムラプスは、保存を繰り返すたびに、選択した顔の画像をタイムラプス出力フォルダに保存する。
これは、タイムラプスの作成に使用する「A」面の入力フォルダである必要がある。
--timelapse-outputパラメータと--timelapse-input-Bパラメータも指定する必要がある。

-tib TIMELAPSE_INPUT_B, --timelapse-input-B TIMELAPSE_INPUT_B
タイムラプスを作成するためのオプション。
タイムラプスは、保存を繰り返すたびに、選択した顔の画像をタイムラプス出力フォルダに保存する。
これは、タイムラプスの作成に使用する「B」面の入力フォルダである必要がある。
--timelapse-outputおよび--timelapse-input-Aパラメータも指定する必要がある。

-to TIMELAPSE_OUTPUT, --timelapse-output TIMELAPSE_OUTPUT
タイムラプスを作成するためのオプション。
タイムラプスは、保存を繰り返すたびに、選択した顔の画像をタイムラプス出力フォルダに保存する。
入力フォルダは提供されるが出力フォルダは提供されない場合、モデルフォルダ/timelapse/がデフォルトになる。

-ps PREVIEW_SCALE, --preview-scale PREVIEW_SCALE
プレビューを拡大縮小する割合。

-p, --preview
訓練プレビューの出力を表示。

-w, --write-image
訓練結果をファイルに書き込む。
画像はFaceSwapフォルダのルートに保存。

-nl, --no-logs
TensorBoardロギングを無効にする。
注意:ログを無効にすると、GUIでこのセッションのグラフまたは分析を使用できなくなる。

-wl, --warp-to-landmarks
顔をランダムにワープするのではなく、反対側の顔セットから密接に一致したランドマークに顔をワープする。
これがワーピングを行う「dfaker」方法。
このオプションを使用する場合、両方の面のセットのアライメントファイルを提供する必要がある。

-nf, --no-flip
効果的に学習するために、画像のランダムなセットが水平方向に反転される。
これが発生しないことが望ましい場合がある。
通常、これは「フィットトレーニング」中を除いて、オフにしておく必要がある。

-nac, --no-augment-color
色の増強により、訓練時間のコストが増加するが、モデルがAセットとBセットの間の色の違いの影響を受けにくくなる。
色の増強を無効にするには、このオプションを有効にする。

5. 顔の入れ替え

作成したモデルを使って、人物Aの写真の顔を入れ替えるコマンドは、次の通りです。「result」フォルダに生成した画像が出力されます。

$python faceswap.py convert -i src/A -o result -m A_B_model

その他のオプションは次の通りです。

usage: faceswap.py convert [-h] [-C CONFIGFILE]
   [-L {INFO,VERBOSE,DEBUG,TRACE}] [-LF LOGFILE] -i
   INPUT_DIR -o OUTPUT_DIR [-al ALIGNMENTS_PATH]
   [-ref REFERENCE_VIDEO] -m MODEL_DIR
   [-c {none,avg-color,color-transfer,manual-balance,match-hist,seamless-clone}]
   [-M {components,dfl_full,extended,facehull,none,predicted}]
   [-sc {none,sharpen}]
   [-w {ffmpeg,gif,opencv,pillow}] [-osc OUTPUT_SCALE]
   [-fr FRAME_RANGES [FRAME_RANGES ...]]
   [-a INPUT_ALIGNED_DIR] [-n NFILTER [NFILTER ...]]
   [-f FILTER [FILTER ...]] [-l REF_THRESHOLD]
   [-j JOBS]
   [-t {dfaker,dfl-h128,dfl-sae,iae,lightweight,original,realface,unbalanced,villain}]
   [-k] [-s] [-sp]

-h, --help
ヘルプ表示。

-C CONFIGFILE, --configfile CONFIGFILE
コンフィグファイルの指定。

-L {INFO,VERBOSE,DEBUG,TRACE}, --loglevel {INFO,VERBOSE,DEBUG,TRACE}
ログレベル。

-LF LOGFILE, --logfile LOGFILE
ログファイルのパス。

-i INPUT_DIR, --input-dir INPUT_DIR
画像ファイルを含むフォルダ、またはビデオファイルへのパス。
注意:これはソースの顔ではなく、ソースのビデオ/フレームでなければなりません。

-o OUTPUT_DIR, --output-dir OUTPUT_DIR
出力フォルダ

-al ALIGNMENTS_PATH, --alignments ALIGNMENTS_PATH
アライメントファイルへのオプションのパス。

-ref REFERENCE_VIDEO, --reference-video REFERENCE_VIDEO
画像からビデオに変換する場合にのみ必要。
ソースフレームが抽出された元のビデオを提供(fpsおよびオーディオを抽出するため)。

-m MODEL_DIR, --model-dir MODEL_DIR
変換に使用する学習済みモデルを含むフォルダ。

-c {none,avg-color,color-transfer,manual-balance,match-hist,seamless-clone}, --color-adjustment {none,avg-color,color-transfer,manual-balance,match-hist,seamless-clone}
交換した顔の色調整の実行。
   - avg-color: 元の画像のマスクされた領域の平均と等しくなるように、交換された再構成の各カラーチャンネルの平均を調整。
   - color-transfer: L*a*b*color空間の平均および標準偏差を使用して、ソースからターゲットイメージに色分布を転送。
   - manual-balance: さまざまな色空間で画像のバランスを手動で調整。 プレビューツールで正しい値を設定するのに最適。
   - match-hist: 元の画像のマスクされた領域のヒストグラムと等しくなるように、交換された再構成の各カラーチャネルのヒストグラムを調整。
   - seamless-clone: cv2のシームレスクローン機能を使用して、色を平滑化することにより、マスクシームの極端なグラデーションを削除する。一般に、非常に満足のいく結果は得られない。
   - none: 色調整を実行しない。

-M {components,dfl_full,extended,facehull,none,predicted}, --mask-type {components,dfl_full,extended,facehull,none,predicted}
顔の置き換えに使用するマスク。
   - components: 8つの顔パーツのfacehullを使用した、改良されたface hull mask。
   - dfl_full: 3つの顔パーツのfacehullを使用した改良されたface hull mask。
   - extended: コンポーネントマスクに基づく。 眉のポイントを伸ばして額をさらに上げる。 難しい角度では性能が低下する場合がある。
   - facehull: ランドマークに基づいた顔の切り抜き。
   - predicted: モデルから生成された予測マスク。 モデルがマスクでトレーニングされていない場合、これは「dfl_full」にフォールバック。
   - none: マスクを使用しない。

-sc {none,sharpen}, --scaling {none,sharpen}
スケーリングプロセスを実行して、最終スワップでより良い定義を取得しようとする。
   - sharpen: 最終面にシャープを実行。
   - none: スケーリング操作を実行しない。

-w {ffmpeg,gif,opencv,pillow}, --writer {ffmpeg,gif,opencv,pillow}
変換された画像を出力するために使用するプラグイン。
   - ffmpeg: [video]変換を直接ビデオに書き出す。
   入力が一連の画像である場合、 '-ref'(--reference-video)パラメーターを設定する必要がある。
   - gif: [animated image] アニメーションgifを作成。
   - opencv: [images] 最速だが、他のプラグインよりオプションと形式が少ない。
   - pillow: [images] opencvより遅いが、オプションも形式も多い。

-osc OUTPUT_SCALE, --output-scale OUTPUT_SCALE
最終出力フレームをスケーリング。
100%は、ソースディメンションでフレームを出力。
ハーフサイズで50%、ダブルサイズで200%。

-fr FRAME_RANGES [FRAME_RANGES ...], --frame-ranges FRAME_RANGES [FRAME_RANGES ...]
転送を適用するフレーム範囲。
フレーム1050および90100の場合、-frame-ranges 10-50 90-100を使用。
「-k」(-keep-unchanged)が選択されていない限り、選択範囲外のフレームは破棄される。
注意:画像から変換する場合、ファイル名はフレーム番号で終わる必要がある。

-a INPUT_ALIGNED_DIR, --input-aligned-dir INPUT_ALIGNED_DIR
アライメントファイルをクリーンアップしていない場合は、入力ファイル/ビデオから抽出された顔を含むフォルダをここで定義することにより、顔を除外できる。
このフォルダが定義されている場合、アライメントファイル内に存在し、指定されたフォルダー内にも存在する面のみが変換される。
このフィールドを空白のままにすると、アライメントファイル内に存在するすべての面が変換される。

-n NFILTER [NFILTER ...], --nfilter NFILTER [NFILTER ...]
必要に応じて、その人の画像を渡すことで、処理したくない人を除外。
画像に一人の人物が写っている正面の肖像画であるべき。
複数の画像をスペースで区切って追加できる。
注意:顔フィルタを使用すると、抽出速度が大幅に低下し、その精度を保証できない。

-f FILTER [FILTER ...], --filter FILTER [FILTER ...]
必要に応じて、その人の画像を渡すことにより、処理する人を選択。
画像に一人の人物が写っている正面の肖像画であるべき。
複数の画像をスペースで区切って追加できる。
注意:顔フィルタを使用すると、抽出速度が大幅に低下し、その精度を保証できない。

-l REF_THRESHOLD, --ref_threshold REF_THRESHOLD
オプションのnfilter/filterファイルで使用。
肯定的な顔認識のしきい値。
値が小さいほど厳しくなる。
注意:顔フィルタを使用すると、抽出速度が大幅に低下し、その精度を保証できない。

-j JOBS, --jobs JOBS
変換を実行するための並列プロセスの最大数。
イメージの変換はシステムRAMに負荷がかかるため、多くのプロセスがあり、それらすべてを収容するのに十分なRAMがない場合、メモリが不足する可能性がある。
これを0に設定すると、利用可能な最大値が使用される。
これを何に設定しても、システムで使用可能なプロセスより多くのプロセスを使用しようとすることはない。
シングルプロセスが有効な場合、この設定は無視される。

-t {dfaker,dfl-h128,dfl-sae,iae,lightweight,original,realface,unbalanced,villain}, --trainer {dfaker,dfl-h128,dfl-sae,iae,lightweight,original,realface,unbalanced,villain}
[LEGACY] これは、レガシーモデルがロードされている場合、またはモデルフォルダに複数のモデルがある場合にのみ選択する必要がある。

-k, --keep-unchanged
--frame-rangesとともに使用すると、未処理のフレームを破棄せずに出力する。

-s, --swap-model
モデルを交換。 A-> Bから変換する代わりに、B-> Aを変換。

-sp, --singleprocess
マルチプロセッシングを無効にする。
遅くなるが、リソースをあまり消費しない。

6. 写真と動画の変換

元データが動画の時は、「FFmpeg」を使って写真から動画に戻すことができます。「FFmpeg」は、動画を写真に分割したり、逆に、写真から動画を生成することができるツールです。

動画を写真に変換するコマンドは次の通りです。

$ ffmpeg -i video.mp4 -vf fps=25 photos/%06d.png

写真を動画に変換するコマンドは次の通りです。

$ ffmpeg -r 25 -i result/%06d.png -vcodec libx264 -pix_fmt yuv420p -r 60 result.mp4

この記事が気に入ったらサポートをしてみませんか?