(3)CycleGANを利用したDeepFake衛星画像生成

それでは実際にDeepFake画像を生成してみましょう。

利用するデータ

以前の宙畑の記事で利用された、ゴルフ場のデータを利用していきます。

このデータセットは、衛星画像にゴルフ場が写っている(1)か、写っていない(0)かの分類タスクでした。

このデータセットを利用することで、次の2つの変換を行うことができるようになります。
・ゴルフ場の写っている画像をゴルフ場の写っていない画像へ変換
→ ゴルフ場を消す
・ゴルフ場の写っていない画像をゴルフ場の写っている画像へ変換
→ ゴルフ場を出現させる

想定するディレクトリ構造

学習とテスト用のデータは次のようにしてあります。

衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)

・testA: テスト用画像(ゴルフ場が写っている)
・testB: テスト用画像(ゴルフ場が写っていない)
・trainA: 学習用画像(ゴルフ場が写っている)
・trainB: 学習用データ(ゴルフ場が写っていない)

※ 今回はAをゴルフ場が写っている、Bが写っていないにしてありますが、逆でも問題ありません

・golf_checkpoints: 学習中にネットワーク情報を保存する場所
・golf_results: テスト結果を保存する場所

実行環境とコード

公式でPyTorch実装のCycleGANが利用できるようになっているので、そのコードを利用します。

今回は Google Colaboratory 上で動かせるように jupyter notebook (ipynb)形式にしてあります。ローカルでも可能ですが、学習の際には GPU 環境が必要になります。

また、Google Colaboratory を利用する場合も設定でGPUが利用できるランタイムに変更の必要があるため、上部メニューの「ランタイム」→「ランタイムのタイプを変更」を選択して表示される設定画面からGPUを選択してください。

衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)

Google Colaboratoryを利用する場合、ランタイムが再起動する場合にアップロードしたデータが消えてしまうため、Google Driveにアップロードしてそれを連携します。

Google Driveに連携しなくてもアップロードで問題ありませんが、ファイルパスの記述に気をつけてください。上記の「想定するディレクトリ構造」の通りにデータがGoogle Drive上にあれば次のようなパスになっています。

from google.colab import drive
drive.mount('/content/drive')

dataset_path = '/content/drive/MyDrive/golf'
checkpoints_path = '/content/drive/MyDrive/golf_checkpoints'
results_path = '/content/drive/MyDrive/golf_results'

まず、CycleGAN を実行できるようにするためにコードを持ってきます。

!git clone https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

続いて、作業を行いやすくするために、ダウンロードしたディレクトリを利用するようにします。

import os
os.chdir('pytorch-CycleGAN-and-pix2pix/')

CycleGANで必要になるライブラリをインストールします。

!pip install -r requirements.txt

学習

学習を行っていきます。自分でコードを追加する必要はなく、train.py を実行してパラメータを追加することで、設定を変更できます。

!python train.py --dataroot /content/drive/MyDrive/golf --name golf --model cycle_gan --batch_size 4 --gpu_ids 0 --checkpoints_dir /content/drive/MyDrive/golf_checkpoints

実際の学習では次のパラメータも変更する必要があるかもしれません。
–batch_size: バッチサイズを変更できます。GPUの容量によって変更してください。
–n_epochs, –n_epochs_decay: 学習のエポック数です。デフォルトだと(epoch: 100, epoch_decay: 100)で200エポックに設定されています。

次のグラフは、私の環境で学習をしながら画像の誤差をプロットしていったものですが、学習が進むにつれて、ネットワーク全体的に誤差が小さくなっていくことが確認できます。

衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像= 200 epoch までの誤差をプロットしていったグラフ 、『宙畑』より引用)

テスト

学習と同じようにテスト用のコードは用意されているので、必要なパラメータを渡してテストを実行します。

!python test.py --dataroot /content/drive/MyDrive/golf --name golf --model cycle_gan --no_dropout --results_dir /content/drive/MyDrive/golf_results --checkpoints_dir /content/drive/MyDrive/golf_checkpoints --direction AtoB

–direction を ‘AtoB’ または ‘BtoA’ で変換方向を指定する必要があります。

テスト結果

それでは実際に生成された画像を確認していきます。特に上手くいったものをいくつか取り上げています。

ゴルフ場を消す

左側が実際の衛星写真で右側がフェイクのゴルフ場が消える処理を加えたものです。山の中であれば、周りの山の濃い色にすることができていて、平地でも畑などの周りと同じような風景に馴染むようにゴルフ場が消えていますが、ゴルフ場のコース跡は消した後も見える感じがしますね。

衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)
衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)
衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)
衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)

ゴルフ場を新しく出現させる

こちらも、左側が実際の衛星写真で右側がゴルフ場を出現させる処理を加えたものです。元は畑の広めの場所をゴルフ場のようなものに変換できています。

衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)
衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)
衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)
衛星データとディープフェイク、CycleGANで生成した嘘のゴルフ場衛星画像は分類器を騙せるのか
(画像=『宙畑』より引用)