フェイクポルノで話題になったDeep fakesをウェブで簡単に試せるサービスを作った話

  • このエントリーをはてなブックマークに追加
deepfakesweb

フェイクポルノで話題になっていたDeepfakesですが、サクッと試せる場があったら面白いかなと思い立ち作ってみました。ここではNode.jsからディープフェイクを動かすところまでを紹介します。

 

Deepfakes(ディープフェイク)とは?

ディープラーニング技術を使って動画の人物の顔を別の個人の顔とすげかえるられた動画の総称。
もともとはRedditのdeepfakesというユーザがコミュニティ内で「FakeApp」を公開したのが始まり。

 

できたもの

※現在サービス停止中  再開しました!

https://deepfakesweb.com/

 

新バージョンの使い方はこちらを御覧ください。

誰でもディープフェイク動画が作れる「Deepfakes web」の使い方を説明

 

twitter: @DeepfakesWeb

Deepfakes on the web Deepfakes on the web

 

環境

サーバ

  • AWS EC2 g2.2xlarge
  • Deep Learning Base AMI (Amazon Linux)

バックエンド

  • Node.js / Express

構築手順

前提

EC2インスタンスに任意のユーザでsshでログインできる状態。

 

手順

EC2はディープラーニング用のAMIが用意されていました。

今回はDeep Learning Base AMI (Amazon Linux)を使用し、GPUが搭載されている中で一番安いg2.2xlargeインスタンスを使用しました。

必要なパッケージのインストール

python, nodejs等必要なパッケージをインストールしておきます。

Python

pyenvを使ってanacondaをインストール

Node.js

CentOS 7.2にNode.jsをインストールする

FFmpeg

基本的に下記リンクの通り。

Compile FFmpeg on CentOS

 

Node.jsアプリの作成

express-generatorで雛形を作ります。

Express Generator を使った Node.js + Express.js の環境構築手順

 

faceswapの実行

1.Nodeアプリのディレクトリ直下にfaceswapのソースを落としてきます。

git clone https://github.com/deepfakes/faceswap.git

2. 必要パッケージのインストール

faceswapディレクトリ内で

pip install -r requirements.txt

3. faceswap/project_baseディレクトリを作成し、その中に下記6つのディレクトリを作成します。

  1. personA
  2. personA_face
  3. personB
  4. personB_face
  5. model
  6. output

4. 動画の分割

personA, personBにそれぞれscene.mp4という名前で動画を配置し、ffmpegで動画を画像に分割します。

ffmpeg -i personA/scene.mp4 -vf fps=30personA/scene%06d.png
ffmpeg -i personB/scene.mp4 -vf fps=30personB/scene%06d.png

5.顔の抽出

python faceswap.py extract -i personA -o personA_face
python faceswap.py extract -i personB -o personB_face

6.学習

python faceswap.py train -A personB_face personA_face -m model -p

完了したらEnterで終了します。Lossが0.3以下になってくると顔が似て来るようです。

7.顔の入れ替え

python faceswap.py convert -i personB -o output -m model

8.画像をつなげて動画に変換

ffmpeg -i output/scene%06d.png -c:v libx264 -vf "fps=30,format=yuv420p"output/output.mp4

 

Node.jsからFaceswapを実行する

こんな感じで実行しました。


async function deepfakes () {
await awaitExec('ffmpeg -i ' + directoryB + 'scene.mp4 -vf fps=30 ' + directoryB + 'scene%06d.png');
await awaitExec('ffmpeg -i ' + directoryA + 'scene.mp4 -vf fps=30 ' + directoryA + 'scene%06d.png');
await awaitExec('python ./faceswap/faceswap.py extract -i ' + directoryA + ' -o ' + directoryAFace);
await awaitExec('python ./faceswap/faceswap.py extract -i ' + directoryB + ' -o ' + directoryBFace);

await awaitExec('unset DISPLAY XAUTHORITY');
await awaitExec('xvfb-run python ./faceswap/faceswap.py train -A ' + directoryBFace + ' -B ' + directoryAFace + ' -m ' + modelPath + ' -i 80 -p');
await awaitExec('python ./faceswap/faceswap.py convert -i ' + directoryB + ' -o ' + outputPath + ' -m ' + modelPath);

await awaitExec('ffmpeg -i ' + outputPath + 'scene%06d.png -c:v libx264 -vf "fps=30,format=yuv420p" ' + outputPath + 'output.mp4');
await awaitExec('cp ' + outputPath + 'output.mp4 ' + './public/outputs/' + req.session.request_key + '.mp4');
return;
}
deepfakes().catch(err => {
console.log(err);
});

 

参考書籍

 

ゼロからエンジニアを目指す方にはこちらの記事

プログラミング初学者からフリーランスエンジニアとして独立するためにすべき3つのこと

 

ゼロからエンジニアを目指す方におすすめのスクール

【TECH::CAMP(エンジニアスクール)】

3ヶ月間のプログラミングスクール【Tech Boost】

お仕事決まれば全額キャッシュバック!転職特化型Ruby実践研修【ポテパンキャンプ】

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。