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
これで変換が止まることなく行われるようになるかと思います。