[DeepFake] ブラウザだけでfaceswapを使って顔交換 [使い方解説]

2022年1月19日水曜日

Artificial Intelligence

本記事では、faceswapを使用し、ブラウザだけで動画に映る人の顔を入れ替える方法を紹介します。

faceswapの結果

概要

DeepFake

DeepFakeとは、ディープラーニングなど高度な合成技術を用いて作られる、本物と見分けがつかないような、偽物の動画を生成する技術を指します。
主に、人間の顔の合成を指すことが多く、大別すると下記の4種類で構成されています。

  1. 顔全体の合成(Entire Face Synthesis)
  2. 属性操作(Attribute Manipulation)
  3. 顔の交換(Identity Swap)
  4. 表情の交換(Expression Swap)

DeepFakeを構成する4つの技術に関する詳細は以下の記事をご覧ください

faceswap

本記事で紹介するfaceswapは顔の交換(Identity Swap)に属する技術です。

テレビ番組や、YouTubeなどでも著名人の顔を交換した映像をご覧になった方も多いかと思います。

本記事ではGoogle Colaboratoryを使ってGPUを持っていない人でもfaceswapを使用する方法を紹介していきます。

2022年5月時点でGoogle Colabを使用してディープフェイクを作成することが禁止となりました。
詳しくはよくある質問の制限事項をご参照ください。

以降は、参考情報としてご覧下さい。

faceswapの取り扱いに関する免責事項

faceswapならびに、DeepFakeの技術は悪用によって逮捕者も出ている技術です。
技術そのものに罪はありませんが、厳格な倫理観を持って取り扱うべき技術です。

これからご紹介する技術はあくまでご自身の顔画像処理技術の理解を深めるためにのみご活用ください。本記事を参考にして生じたいかなる損害に関しても当ブログは責任を負いません。

デモ(Colaboratory)

早速デモ環境を動かしていきます。

動作環境

ChromeなどのブラウザがインストールされているPCであればスペックは問いません

ソースコードは全てGoogle Colaboratory上で動作します。
また、モデルをトレーニングするにあたり、学習経過を保存するためにGoogle Driveを使用します。

顔の交換を行う動画によって増減しますが、Google Driveに約3GBほど空き容量を確保してください。 なお、ソースコードは全て以下のGitHubで取得可能です。
GitHub - faceswap Colaboratory demo

GPU付属のPC環境をお持ちの場合は、以下の記事でfaceswapの使い方を紹介していますのでご参照ください。

GPU搭載のPC環境でのfaceswapの使い方はこちら

Colaboratory上で精度はそこそこに、早くFaceSwapの出力を得たい場合はこちら。

環境セットアップ

はじめにColaboratoryを開きます。以下のリンクからfaceswapが実装されたColaboratoryを開くことができます。

Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

それでは動かしていきます。
Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

faceswapに必要な作業は、以下の通りソースコードを実行するだけです。

「ランタイム」→「すべてのセルを実行」を選択

あとはセルの出力結果に従って適宜、顔を交換したい動画をアップロードしていきます。

以降は各セルの詳細を記載していきます。

Google Driveのマウント

ColaboratoryからGoogle Driveを参照できるようにマウントします。
Google Driveには、顔交換前の動画、学習モデル、顔交換後の動画などを保存します。

from google.colab import drive
drive.mount('/content/drive')

以下のようなアクセス許可のダイアログが表示されるため「Googleドライブに接続」を選択し、Google Driveをマウントしてください。

Google Driveマウント方法

動画のアップロード(顔使用)

次に顔を使用したい動画をアップロードします。
ここでアップロードした動画の顔が、次にアップロードされる動画に使用されます。

%cd /content/drive/MyDrive/Colab\ Notebooks/
!mkdir faceswap
%cd /content/drive/MyDrive/Colab\ Notebooks/faceswap
!mkdir src src_frames src_extract target target_frames target_extract models
%cd /content/drive/MyDrive/Colab\ Notebooks/faceswap/src

import glob

if 0 == len(glob.glob('/content/drive/MyDrive/Colab Notebooks/faceswap/src/*.mp4')):
  # 顔を利用する動画をアップロード
  from google.colab import files
  src_uploaded = files.upload()
  src_uploaded = list(src_uploaded.keys())
  print(src_uploaded)
  src_file = src_uploaded[0]

動画のサイズが大きい場合アップロードに時間がかかるため注意してください。

本記事では、以下のフリー素材を使用します。
顔を使用する動画

フレーム分割

アップロードした動画をffmpegを使用してフレームごとの画像に変換します。

%cd /content/faceswap/

if 0 == len(glob.glob('/content/drive/MyDrive/Colab Notebooks/faceswap/src_frames/*.png')):
  # frameに分割
  src_video_path = '/content/drive/MyDrive/Colab\ Notebooks/faceswap/src/'+ src_file
  !ffmpeg -i $src_video_path /content/drive/MyDrive/Colab\ Notebooks/faceswap/src_frames/src-video-frame-%d.png

この処理によって動画がフレームごとの画像に分割されます。

顔抽出(extract)

次にフレーム画像から顔部分を抽出します。

%cd /content/faceswap/
# 顔抽出(extract)実行
if 0 == len(glob.glob('/content/drive/MyDrive/Colab Notebooks/faceswap/src_extract/*.png')):
  !python faceswap.py extract \
    -i /content/drive/MyDrive/Colab\ Notebooks/faceswap/src_frames \
    -o /content/drive/MyDrive/Colab\ Notebooks/faceswap/src_extract

フレーム画像から顔部分のみが抽出されます。

顔以外を使用する動画も同様の処理を行います。本記事では、以下のフリー素材を使用します。
顔以外を使用する動画

モデルのトレーニング

モデルをトレーニングしていきます。

%cd /content/faceswap/

# 学習実行
!python faceswap.py train \
  -A /content/drive/MyDrive/Colab\ Notebooks/faceswap/target_extract \
  -B /content/drive/MyDrive/Colab\ Notebooks/faceswap/src_extract \
  -m /content/drive/MyDrive/Colab\ Notebooks/faceswap/models

動画の長さや顔の映り方にも左右されますが、face_a、face_bのlossが共に、0.01未満になるまでに約10時間ほどかかります。気長に待ちましょう。

もし、途中で学習が止まってしまった場合はランタイムから再度「すべてのセルを実行」を行ってください。Google Driveにモデルが保存されていれば途中から学習が再開します。

顔の交換

最後に顔の交換を行います。始めに、フレーム画像の顔を交換します。

# 顔の変換
%cd /content/faceswap/

!python faceswap.py convert \
  -i /content/drive/MyDrive/Colab\ Notebooks/faceswap/target_frames \
  -o /content/drive/MyDrive/Colab\ Notebooks/faceswap/results \
  -m /content/drive/MyDrive/Colab\ Notebooks/faceswap/models

動画作成

最後に顔交換済みのフレーム画像を動画に変換します。

# フレーム画像を動画に変換
%cd /content/faceswap/

!ffmpeg \
  -i /content/drive/MyDrive/Colab\ Notebooks/faceswap/results/target-video-frame-%0d.png \
  -c:v libx264 \
  -vf "fps=25,format=yuv420p" \
  /content/drive/MyDrive/Colab\ Notebooks/faceswap/out.mp4

出力結果は以下の通りです。

faceswapの結果

体の動きに合わせて目線などが自然に移動していますね。

まとめ

本記事では、Colaboratory上でfaceswapを使用し動画の顔を交換する方法を紹介しました。
学習速度や、連続使用ができない点など無料ならではの不便さがあるものの、無料でGPUを使用してモデルをトレーニングできるので、とりあえず動かしてみたい、機械学習に触れてみたいという方にはぴったりですね。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - DeepFakes and Beyond: A Survey of Face Manipulation and Fake Detection

2. GitHub - deepfakes/faceswap

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology