Pythonで画像処理。Face Swap 入門

# Face Swap 入門

英語圏のオンラインコミュニティ「reddit」（日本における2ちゃんねるのような掲示板）に、AIを用いて顔の画像を自動変換する 「FakeApp」というツールが投稿され、そのツールで作られたフェイク動画が拡散され問題になっていたようです。

そこで、どのような基礎技術を利用すれば同様の仕組みが作成できるのか考えてみました。

世の中でもっともパロディで利用されている女性の美術絵画はモナ・リザだそうです。
オイラは一番かわいい女性はエビちゃんだと思っているのでエビちゃんをモナ・リザにしてしまいます。

## 前提
python,opencv環境が構築されていて、numpy,dlib がインストール済であること。

インストールしていない場合は

~~~
pip install numpy
pip install dlib
~~~

を実行する。

## faceswap の入手と変更
python OSS に faceswap というもがあるようです。
既存のモデルファイルを流用すれば簡単に顔の変更ができます。

### ソースコードの取得先
https://github.com/matthewearl/faceswap

### モデルファイルの取得先
http://sourceforge.net/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2

DL後解凍し、faceswap から読み取れるようにしておくこと。

### faceswap.py ソースコードの修正

モデルファイルのパスを修正する。

PREDICTOR_PATH = "./shape_predictor_68_face_landmarks.dat"

### 実行

~~~
python faceswap.py 画像1 画像2 
~~~

を実行すると

output.jpg 

が出力されます。

試しに、画像１にモナ・リザの画像(Mona_Lisa_detail_face.jpg)
![Mona_Lisa_detail_face.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/b1962e6a-2d60-c181-f380-af8d52efc309.jpeg)


画像２にエビちゃんの画像(ebi-chan.jpg)
![ebi-chan.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/5ce66d9c-cde0-9af8-fb6d-525a122514d9.jpeg)

で実行してみた。

~~~
python faceswap.py Mona_Lisa_detail_face.jpg ebi-chan.jpg
~~~

実行結果
![output_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/d3add2f7-3f0a-95fd-361e-859ed13c30bb.jpeg)

うげ！
モナ・リザの画像とエビちゃんの画像の向きが違うのでものすごく変。
心霊写真のようだ・・・

そのため、エビちゃんの画像を左右変換を行う必要がありそうです。
ちなみにpythonで画像の左右入れ替え（ミラーリング）のソースコードはたったこれだけです。

~~~
from PIL import Image, ImageOps

im = Image.open('ebi-chan.jpg')
im_mirror = ImageOps.mirror(im)
im_mirror.save('ebi-chan_mirror.jpg', quality=95)

~~~

で、左右変換を実行してみた。 
![ebi-chan_mirror.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/6dd0ccf9-2aa6-e790-7dde-b2815e32db7a.jpeg)


左右入れ替えた後のFaceSwapの実行結果
![output.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/dae33bbb-2516-c4e9-b7fe-071ae675dafe.jpeg)

髪の毛部分も認識されていますがカナリ自然？な感じです。
なんかちょっとコワイけど…

それでは、ガンダム世代のオジサンに人気のセイラさんだとどうなるでしょうか？

入力したセイラさん
![seira.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/62b2988f-06c7-434d-b136-4058aa1ef9d7.jpeg)


セイラさんでのFaceSwapの実行結果
![output_seira.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/32e27c6b-9a2a-d558-fbed-c97f2c2dbaf0.jpeg)

うむぅ。

最後に画像処理の世界ではお決まりのレナさんで・・・
![rena.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/e0253513-5b86-5e8e-9c37-2fcec2fd9553.jpeg)

そのままの画像だとやっぱり顔の向きが逆でなので変ですね。
![output2.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/2e96141a-332a-b9f1-c231-01d63633dc68.jpeg)

ミラーリングして左右入れ替えて
![rena_mirror.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/d78106b6-ebd2-38d7-2d1f-f79fda104711.jpeg)

実行したらこうなりました。
![output_rena.jpg](https://qiita-image-store.s3.amazonaws.com/0/255677/0ddd0fa0-8454-778e-5c63-0feb40898d30.jpeg)

輪郭が残っててコワイな・・・

## 動画対応は今後の検討
動画で対応するには、顔がどちらを向いているか？ということを判定しながら1フレームずつ入れ替える対象の画像を変更していけば問題ないでしょう。鼻、口、目の位置の比を取って入れ替えていけばなんとかなりそうですね。
DeepLearningを用いてどの画像と似ているか？と判断しながら変換していくのもよさそうです。

なお今回利用したこのモジュールはGPUを利用しておらずミラー処理を含めないで、

ファイルの読み取り→変換→ファイル保存

の処理時間は、マックスくんのPC( Corei7-7700HQ/GeForce GTX 1060)で約0.12秒でした。
1秒間に30フレームの動画のリアルタイム変換だと遅延してカクカクする動画におそらくなると思われます。

昔はアイコラ職人と呼ばれる人がいて、有名人の顔の画像とポルノ画像を入れ替え掲示板に掲載などして問題になっていましたが、この種のツールを利用すれば簡単に顔の入れ替えができます。
SNSなどに顔の画像をUPして不特定多数の人からアクセスできる状態になっている人は気を付けたほうがいいかもしれません。

以上です。