[DeepFake]faceswapの自作モデルをトレーニングする[使い方解説]

2021年10月21日木曜日

Artificial Intelligence

本記事はfaceswapを使って、自作モデルをトレーニングする方法を解説します。
また、学習させたモデルを使用し任意の写真の顔を交換する方法を紹介します。

アイキャッチ

faceswapとは

faceswapはディープラーニングを利用した顔の入れ替え技術を実現するDeepFakeの一種です。

DeepFakeとは、ディープラーニングを使って、精巧な偽物の画像や動画を生成する技術のことを指し、主に下記の4つの技術の総称です。

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

本記事で紹介するfaceswapは顔の交換(Identity Swap)に属しています。

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

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

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

faceswapの導入手順

セットアップ

それでは早速、開発環境にfaceswapをセットアップしていきます。
動作確認は下記の環境で行っています。

OS: Ubuntu 18.04.3 LTS
GPU: GeForce GTX 1080

GPU付属のPC環境がない場合は、以下の記事でColaboratory(Webで使える無料の機械学習環境)でのfaceswapの使い方を紹介していますのでご参照ください。

FaceSwap結果の出力に時間がかかりますが、精度を求める場合はこちらがおすすめです。

精度はそこそこに、早くFaceSwapの出力を得たい場合はこちらがおすすめです。

それでは、faceswapをインストールしていきます。他の機械学習環境に影響を与えないためにMinicondaの仮想環境上に構築していきます。Minicondaのインストール手順は公式ドキュメントをご参照ください。

まずは、以下の作業を行います。

  1. conda環境作成
  2. GitHubからソースコード取得
  3. ライブラリのインストール
# python version 3.7のconda環境を作成
$ conda create -n faceswap python=3.7

# 作成した環境をアクティベート
$ conda activate faceswap
$ cd faceswap

# gitからコードをclone
$ git clone --depth 1 https://github.com/deepfakes/faceswap.git
$ cd faceswap

# tkinterのインストール
$ conda install tk
# 上記でパッケージが見つからなければ下記
$ conda install -c anaconda tk

# その他ライブラリをインストール
# Nvidia GPUの場合:
$ pip3 install -r requirements_nvidia.txt
# AMD GPUの場合:
$ pip3 install -r requirements_amd.txt
# CPUのみの場合:
$ pip3 install -r requirements_cpu.txt

# Proxy配下の場合は下記
$ pip3 install -r requirements_"該当のファイル".txt --proxy=http://"username":"password"@proxy:port

以上で、セットアップは完了です。

顔抽出(Extract)

顔抽出(Extract)では、画像から顔を抽出し、顔部分を切り出した画像を生成します。
本記事では、ロイヤリティフリーの下記の画像の顔抽出していきます。

顔抽出対象画像

またここからはPythonや機械学習について基礎知識があることを前提に紹介します。
もし不安がある方は以下の書籍などがおすすめです。

それでは顔部分を切り出していきます。

# Proxy配下の場合は事前にproxyを設定
$ export http_proxy="http://"username":"password"@proxy:port"
$ export https_proxy="http://"username":"password"@proxy:port"

# 直下にfaceswap.pyが存在するディレクトリに移動
$ cd faceswap

# 入力画像のディレクトリ(src)と出力画像のディレクトリ作成
$ mkdir src extract

# 顔抽出(extract)実行
$ python faceswap.py extract -i ./src -o ./extract

もし、顔抽出実行時にImportError: numpy.core.multiarray failed to importが発生した場合は、古いバージョンのnumpyがインストールされています。
pip3 install numpy --upgradeでnumpyをアップグレードすると解消されます。

顔抽出の結果ですが以下の通りとなりました。正確に抽出できているようです。

顔抽出結果

複数人が映っている画像も試してみましたが下記の通り正確に抽出できています。

2人が映っている画像

2人が映る画像の顔抽出結果

3人以上が映っている画像

3人以上が映る画像の顔抽出結果

最後の画像は10人もの人が映っていますが全員の顔が抽出されています。
なかなかに正確であると言えそうです。

顔交換(Convert)モデルの学習(トレーニング)

次に顔を交換していきます。
しかし、顔交換の学習済みモデルはダウンロードできません。
これは、特定の人物に対して学習が必要である点と、簡単に悪用させないためであると考えられます。

このため学習から行っていきます。
本記事では下記左の女性の顔を、右の男性の顔に交換するようにモデルを学習させます。

顔交換対象の2人
# 直下にfaceswap.pyが存在するディレクトリに移動
$ cd faceswap

# 素材となる画像を格納するディレクトリを作成
$ mkdir material_data_a material_data_b

material_data_aに女性の画像を、material_data_bに男性の画像を配置していきます。
なお、学習に必要な最低枚数が25枚以上のため、少なくとも25枚以上の顔が含まれた画像を集める必要があります。また推奨は500枚~5000枚です。

ここから学習データ用の顔のみを含んだ画像を生成します。といっても、先ほどと同じく顔抽出するのみです。

# 直下にfaceswap.pyが存在するディレクトリに移動
$ cd faceswap

# 学習データ画像を格納するディレクトリを作成
$ mkdir train_data_a train_data_b

# 顔抽出(Extract)実行
$ python faceswap.py extract -i ./material_data_a -o ./train_data_a
$ python faceswap.py extract -i ./material_data_b -o ./train_data_b

train_data_atrain_data_bに顔抽出された画像が出力されます。
この画像を使ってモデルを学習させるため、正しく抽出できていない画像があれば除いて下さい。

次にモデルを学習させます。

# 直下にfaceswap.pyが存在するディレクトリに移動
$ cd faceswap

# 学習したモデルの出力ディレクトリを作成
$ mkdir convert_model

# 学習実行
$ python faceswap.py train -A ./train_data_a -B ./train_data_b -m ./convert_model

正常に学習が開始されれば、適宜convert_modelに学習済みモデルが出力されます。
また、下記が出力された場合は、学習データが不足しているため、素材を追加してください。

10/21/2021 12:59:39 ERROR At least one of your input folders contains fewer than 25 images.
10/21/2021 12:59:39 ERROR You need to provide a significant number of images to successfully train a Neural Network. Aim for between 500 - 5000 images per side.


学習枚数にもよりますが、半日以上はかかるため就寝前などに学習開始することをお勧めします。

顔交換(Convert)

いよいよ顔交換です。
先ほど生成した学習済みモデルを使って顔交換します。

# 直下にfaceswap.pyが存在するディレクトリに移動
$ cd faceswap

# 顔交換対象の画像を配置するディレクトリ(original)と出力先ディレクトリ(modified)を作成
$ mkdir original modified

originalに顔交換対象の画像を配置します。
今回は下記の画像を使用します。

顔交換対象画像

最後に顔交換を実行します

# 直下にfaceswap.pyが存在するディレクトリに移動
$ cd faceswap

# alignments.fsaを生成するためextract実行
# originalにalignments.fsa出力
$ python faceswap.py extract -i ./original -o ./extract

# 顔交換(Convert)実行
$ python faceswap.py convert -i ./original -o ./modified -m ./convert_model

顔交換が成功するとmodifiedに顔交換後の画像が出力されます。
今回の結果は以下の通りです。

顔交換後画像

正直、精度は微妙ですね。
学習データとして使用した画像の顔交換であれば精度が良かった点を鑑みると、同一人物であれ学習させていない画像だと精度は微妙かもしれません。また、解像度の低い画像や、顔がはっきり映っていない画像は上手く学習が進みませんでした。高解像度の正面に顔が映っている画像を使用した方が良好な結果を得られます。

まとめ

本記事ではfaceswapで顔を交換するまでの手順を詳細に紹介させて頂きました。
顔画像処理系は、学習結果がエンターテインメント性があるため動かしてみて面白さを感じやすい技術です。

一方で、悪用すれば誰かを傷つけることにもつながります。再三にはなりますが正しい倫理観に基づいて利用してください。

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

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

参考文献

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

2. deepfakes/faceswap

プロフィール

自分の写真
製造業に勤務する傍ら、日々AIの技術動向を調査しブログにアウトプットしています。 AIに関するご相談やお仕事のご依頼はブログのお問い合わせフォームか以下のアドレスまでお気軽にお問い合わせください。 bhupb13511@yahoo.co.jp

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology