mobile hack 楽しい生活情報を携帯しよう

コンセプト「楽しい生活情報を携帯する」

Google Colaboratoryを使って機械学習の環境を作り、新垣結衣さんの「フェイクポ●ノ(機械学習アイ●ラ)」に4月1日なので挑戦してみた。

新垣結衣さんの「フェイクポ●ノ(機械学習アイ●ラ)」キラーワードだなぁ。

https://github.com/deepfakes/faceswap
を使って、動画の顔の抽出してみましたが、顔部分は失敗しましたが、まぁ流れはできたと思います。

インストール

機械学習の学習が足りなかったのか、新垣結衣さんの元素材画像足りなかったが何なのか。

Google Colaboratoryを下記を
karaage.hatenadiary.jp
参考にごにょごにょしててで、実行する環境が、5時間くらいでできた。

欲望を叶える力を使い、実装するのは楽しい??
Google Drive の容量も 15GB だと足りずな、気もする。

動画を静止画にする為に ffmpegGoogle Colaboratory に install します。

!apt-get update
!apt-get upgrade
!apt-get install -y ffmpeg

Google Colaboratory 中の方に、file を出力すれば良いかも知れないなぁ。

Google Drive を使える方法。

# Install a Drive FUSE wrapper.
# https://github.com/astrada/google-drive-ocamlfuse
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse

色々認証が必要です。これで Google Drive のマウントをします。

# Generate auth tokens for Colab
from google.colab import auth
auth.authenticate_user()
# Generate creds for the Drive FUSE library.
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
# Create a directory and mount Google Drive using that directory.
!mkdir -p drive
!google-drive-ocamlfuse drive

Google Drive にマウントができているか、繋がっているかを確認。

print('Files in Drive:')
!ls -al drive

Google Drive に deep ディレクトリを作ります。
deep の 中に faceswap を upload します。

faceswap に from, scene ディレクトリを作ります。
sample.mp4 が動画だとして説明をします。

sample.mp4 の動画サイズが大きいと、全然、終わらないので注意が必要です。
!ffmpeg -i drive/deep/faceswap/from/sample.mp4 -vf fps=30 drive/deep/faceswap/scene/scene%06d.png

ここの drive/deep/faceswap/scene/scene%06d.pngGoogle Colaboratory 中にしても良いかも。

下記の install 群は必要がないものもあるかもです。
!pip install virtualenvwrapper-win
!pip install cmake
!pip3 install face_recognition
!pip3 install scandir
!pip install tqdm
学習済みモデルのコピー

Windows用 FakeApp に同梱されている学習モデルをコピーします

https://mega.nz/#!hTgA2b6b!mI6k9dFt_w__jIEUQO2ZePhzFMg6JWUpBZWiV2TDgs4

上記リンクから FakeApp.zip をダウンロードし、以下のファイル(学習済みモデル)を drive/deep/faceswap/model にアップロードします。
encoder.h5
decoder_A.h5
decoder_B.h5

!cd drive/deep/faceswap;python faceswap.py -h

こちらの内容で error ぽいものが出て無ければ OK です。
これで、下準備が終わり、これに結構、掛かりました。

静止画から顔の抽出をする。

faceswap に His_face ディレクトリを作ります。

drive/deep/faceswap/scene/scene%06d.png を素材にする場合

動画側の顔を抽出 sample.mp4 の動画サイズが大きいと、こちらも全然、終わらないので注意が必要です。
!cd drive/deep/faceswap; python faceswap.py extract -i scene -o His_face

新垣結衣さんの画像(本当は誰でも良いですが、乃木坂46の誰かでも良いですが)を集めて
Google Drive deep/faceswap/Me に沢山、入れる。
私は、ここに 10 file しか入れずに行いました。多分、全然、足りてない。

!cd drive/deep/faceswap; python faceswap.py extract -i Me -o My_face

機械学習をする。

!cd drive/deep/faceswap; python faceswap.py train -A His_face -B My_face -m model -p

Google Colaboratory なので、これが正しくできているのか、良く分からない。

Google Colaboratory の場合は -p は付けたら駄目かも知れず。

!cd drive/deep/faceswap; python faceswap.py train -A His_face -B My_face -m model

Google Colaboratory なので、これが正しくできているのか、良く分からない。

drive/deep/output/sample のディレクトリを作る。

顔を入れ替えた静止画を生成する。
!cd drive/deep/faceswap; python faceswap.py convert -i scene -o ../output/sample -m model
静止画を動画にする。
!ffmpeg -i drive/deep/output/sample/scene%06d.png -c:v libx264 -vf "fps=30,format=yuv420p" drive/deep/output/to_sample.mp4

流れは、これで合っているはずです。
何か、変な所やここをこうしたら解決するよという情報があれば HatenaBookmark で下さいな。
静止画を楽に集める方法も教えて下さいな。

何か、欲望の吐け口の機械学習な気がしますね。

画像が変になったので、こちらを思い出しました。
f:id:mobile_hack:20180401014250j:plain

まだ、ちゃんとした動画はできてませんけども、f:id:mobile_hack:20180331233536p:plain
色々と問題があるものなので、でき上がった動画は公開はできませんね。

クリスマスとか、バレンタインデーに、公開した方が、負けた感じが出たかもね。

ちょっとおまけ。

[ランタイム]->[ランタイムのタイプを変更]->[ハードウェアアクセラレータ]->[GPU] に変えて下記を実行して True が出力されれば [GPU] で実行が可能。

from os import path
from wheel.pep425tags import get_abbr_impl, get_impl_ver, get_abi_tag
platform = '{}{}-{}'.format(get_abbr_impl(), get_impl_ver(), get_abi_tag())

accelerator = 'cu80' if path.exists('/opt/bin/nvidia-smi') else 'cpu'

!pip install -q http://download.pytorch.org/whl/{accelerator}/torch-0.3.0.post4-{platform}-linux_x86_64.whl torchvision

# GPUの確認
import torch
use_gpu = torch.cuda.is_available()
print(use_gpu)