AIでディープフェイクを作るFaceFusionのインストールと使い方とNSFWフィルターの解除方法

AIでディープフェイクを作るFaceFusionのインストールと使い方とNSFWフィルターの解除方法

FaceFusionとは?

いわゆるDeepFakeというのが作れるやつです。

トムブラウンの漫才でみちおの顔がトム・クルーズになってたりするあれが作れるやつです。

https://github.com/facefusion/facefusion

今回はWindowsでの導入方法を公式の説明を参考に確認していきます。

https://docs.facefusion.io/installation

すべてコマンドプロンプト上で実行すればよいです。

必要なツールのインストール

Git

winget install -e --id Git.Git

Conda

winget install -e --id Anaconda.Miniconda3 --override "/AddToPath=1"

FFmpeg

winget install -e --id Gyan.FFmpeg

コーデック

winget install -e --id CodecGuide.K-LiteCodecPack.Basic

環境構築

conda init --all
conda create --name facefusion python=3.10

facefusionを使う場合は毎回

conda activate facefusion

と実行するようにします。

アクセラレーターのインストール

一式入れておきます。

conda install conda-forge::cuda-runtime=12.4.1 cudnn=8.9.2.26 conda-forge::gputil=1.4.0
conda install conda-forge::zlib-wapi
conda install conda-forge::openvino=2023.1.0

プログラムのダウンロードとインストール

git clone https://github.com/facefusion/facefusion

でプロジェクトをcloneしたあと、

cd facefusion

でディレクトリに移動し、

python install.py

実行すると

[?] select the variant of onnxruntime to install:
 > default
   cuda-12.2
   cuda-11.8
   openvino
   directml

機械学習モデルをどれで動作させるか上下キーで選びます。

好きなのを選べばよいと思います。

実行

すべて完了すると、晴れてfacefusionを使えるようになりました。

python run.py

と実行すると立ち上がるので、ブラウザで「http://127.0.0.1:7860/」と入力してfacefusionの画面にアクセスします。

使い方は画像と動画をそれぞれアップすると動画の差し替えプレビューが表示されるのでそれでなんとなくわかるかと思います。

NSFWフィルターの解除方法

変な動画を変換対象に使用するとうまく変換してくれないことがあります。

インストールしたディレクトリの中の「facefusion\content_analyser.py」をテキストエディタで開きます。(※コードの変更は自己責任で行ってください)

def analyse_frame(vision_frame : VisionFrame) -> bool:
	content_analyser = get_content_analyser()
	vision_frame = prepare_frame(vision_frame)
	with conditional_thread_semaphore(facefusion.globals.execution_providers):
		probability = content_analyser.run(None,
		{
			content_analyser.get_inputs()[0].name: vision_frame
		})[0][0][1]
	return probability > PROBABILITY_LIMIT

という処理があると思うので、「return False」を返すようにします。

def analyse_frame(vision_frame : VisionFrame) -> bool:
    # 追加
	return False
	content_analyser = get_content_analyser()
	vision_frame = prepare_frame(vision_frame)
	with conditional_thread_semaphore(facefusion.globals.execution_providers):
		probability = content_analyser.run(None,
		{
			content_analyser.get_inputs()[0].name: vision_frame
		})[0][0][1]
	return probability > PROBABILITY_LIMIT

これで変換が止まることなく行われるようになるかと思います。