この記事は、ディープラーニング(Tensorflow と OpenCV)を使った動画内の顔の置き換えのチュートリアル(Mac版)です。
はじめに
この記事は人物 A の顔を、人物 B の動画の顔に置き換える技術文書です。流れを見ればわかりますが、特別なことをしておらず、すでに既存の公開されている技術を組み合わせているだけだとわかると思います。
この記事の目的は、アタリで描かれたアニメーションや漫画に、機械学習したキャラクターの顔を後から置き換えることで、アニメーターや漫画家の負荷を減らすことは出来ないかという前衛的な実験を目的として作成されています。原文は GitHub に起きますので、何か活用案やアイデアなどありましたら issue を立ててください。なお、冷やかしなど不本意な issue はリポジトリのオーナー権限と独断で削除いたします。
2018/02/08 追記: この記事は、上記にあるように、技術を実際に使い、より良い活用方法のアイデアにつなげるための技術記事です。Qiita の利用規約にある「著作権、特許権等の知的財産権を侵害する行為」「名誉毀損行為、侮辱行為や他者の業務妨害となる行為」には絶対に使わないでください。
Deepfakes のチュートリアル
下準備
CPU で処理するのか GPU で処理するか決める
-
FaceSwap アプリをダウンロード&解凍する
- https://github.com/deepfakes/faceswap/archive/master.zip
- 解凍フォルダを "faceswap" に変更する
-
"faceswap/"内に以下の 6 つのフォルダを作成してわかりやすい名前にする。
- 人物 A の素材(例:"Me/"など)
- 人物 A の顔(例:"My_face/"など)
- 人物 B の素材(例:"He/"など)
- 人物 B の顔(例:"His_face/"など)
- モデル置き場(例:"model/")
- 出力先(例:"output/")
「人物 B の素材」に動画を置く
「人物 A の素材」にありったけの画像を置く
学習に必要なソフトウェア類やモデルのインストール
-
NVIDIA のサイトから Mac用 CUDA ドライバをダウンロードする。
- http://www.nvidia.co.jp/object/mac-driver-archive-jp.html
- 十分な GPU がないといったメッセージが出ても、気にせずインストールしてしまいましょう。
-
学習済みモデルのコピー
- Windows用 FakeApp に同梱されている学習モデルをコピーします
- https://mega.nz/#!hTgA2b6b!mI6k9dFt_w__jIEUQO2ZePhzFMg6JWUpBZWiV2TDgs4
- 上記リンクから "FakeApp.zip" をダウンロードし、以下のファイル(学習済みモデル)を「モデル置き場」にコピーします。
encoder.h5
decoder_A.h5
decoder_B.h5
- 残りはいらないので ZIP ファイル含め削除します。後に学習済みモデルが壊れた場合を考えてバックアップをしておくといいかもしれません。
- 以後は、この学習済みモデルを叩き上げていくことになります。(独自モデルを使っても可能)
-
Anaconda が入っていない場合はダウンロードしてインストールします。(どちらのバージョンでも構いません)
-
NVIDIA cuDNN をダウンロード&解凍します。
-
解凍したファイルを以下のフォルダにそれぞれコピーします。
/Developer/NVIDIA/CUDA-8.0/lib
/Developer/NVIDIA/CUDA-8.0/include
- 上記フォルダがない場合は作成します。CUDA ドライバによってバージョン番号が違うかもしれません。
-
ターミナルを開き、"faceswap" フォルダにいる(カレントディレクトリである)ことを確認してください。
$ cd /path/to/your/faceswap/
-
Python の仮想環境を作る
-
$ pip install virtualenv
- インストールに失敗する場合は、下記依存ファイルを先にインストールしてみてから再度試してください。
-
-
仮想環境に依存ファイルをインストールする
- CPU を使う場合
$ pip install -r requirements.txt
- GPU を使う場合
$ pip install -r requirements-gpu.txt
- CPU を使う場合
-
FFmpeg が入っていない場合はインストールします
-
$ ffmpeg
でバージョンが表示されるならOK
-
学習素材の下ごしらえ①(動画から静止画を作成)
-
「人物 B の素材」ディレクトリに移動します
$ cd /path/to/your/faceswap/[人物 B の素材]/
- 動画があることを確認し、ファイル名を英数字スペースなしに変更します。(以下は
scene.mp4
に変更する場合。Finderで変更も可)mv ./[動画名].mp4 ./
-
$ ffmpeg -i scene.mp4 -vf fps=30 scene%06d.png
学習環境の動作チェック
-
親ディレクトリ(
/path/to/your/faceswap/
)に戻る$ cd ../
-
仮想環境を立ち上げる
virtualenv faceswap_env/
-
仮想環境が立ち上がったら以下のヘルプを実行して環境チェックを行う
python faceswap.py -h
- ヘルプが表示され、"Tensorflow Backend"的なメッセージが出て入ればOK
- 上記のメッセージが出ない場合は、以下の導入に問題がある可能性があります。
Cmake
OpenCV
-
Dlib
- "cv2 import..."のようなメッセージの場合
$ pip install opencv-python
- "dlib..."のようなメッセージの場合
-
$ conda install dlib
もしくは $ pip install dlib
-
- 上記でダメな場合は
-
$ conda install cmake
もしくは $ pip install cmake
-
- さらに上記でもダメな場合は、以下をダウンロード&解凍したディレクトリに移動後、インストールを試してみてください
- http://dlib.net/files/dlib-19.9.tar.bz2
$ cd /path/to/your/donwloaded/extracted/dlib
$ python setup.py install
学習素材の下ごしらえ②(画像から顔のみを抽出)
-
人物 B の動画の展開画像(静止画)から顔を抽出
cd /path/to/your/faceswap
python faceswap.py extract -i 「人物 B の素材」のパス -o 「人物 B の顔」のパス
- ここで抽出した画像をチェックし、NG画像を削除すると精度があがります。
-
人物 A の画像から顔を抽出
cd /path/to/your/faceswap
python faceswap.py extract -i 「人物 A の素材」のパス -o 「人物 A の顔」のパス
- ここで抽出した画像をチェックし、NG画像を削除すると精度があがります。
機械学習の実行
-
それぞれの顔の特徴を学習させる
$ python faceswap.py train -A 「人物 B の顔」のパス -B 「人物 A の顔」のパス -m 「モデル置き場」 -p
学習が終わったら
q
をタイプして学習内容を保存させる。
顔の入れ替えと静止画からの動画作成
-
画像の顔の入れ替えを実行する
python faceswap.py convert -i 「人物 B の素材」のパス -o 「出力先」のパス -m「モデル置き場」
-
置き換えた画像を動画に変換する
ffmpeg -i scene%06d.png -c:v libx264 -vf "fps=30,format=yuv420p" output.mp4