LoginSignup
14
16

More than 5 years have passed since last update.

Google ColaboratoryとGoogle Driveを使ってPGGANを動かしてみた。

Posted at

実際に生成してみた画像
image.png

本記事について

学習済みモデルのPGGANを使って画像生成をしてみる

StyleGANが2018年12月、PGGANが2017年10月に発表されたものであるため、StyleGANと比べると劣る
StyleGANを使った画像生成に関しては下記の記事で行っている

https://qiita.com/Phoeboooo/items/12d21916de56d125f0be

Google Driveへのマウントをすることで、Google DriveにあるファイルをGoogle Colaboratoryで使えるようになる

画像生成までの流れ(変更前)

GitHub通りの手順

・本章ではGitHub通りの手順を参考として記載する

・画像生成までの流れ(変更後)の章から具体的にGoogle Colaboratoryで画像生成する場合の流れを見ていく

①PGGANのリポジトリを複製する

git clone https://github.com/tkarras/progressive_growing_of_gans.git

②必要なPythonパッケージ(numpy等のバージョン)をインストールする

pip install -r requirements-pip.txt

③import_example.py(画像生成を実行するファイル)をダウンロードする
④karras2018iclr-celebahq-1024x1024.pkl(学習済みモデル)をダウンロードする
⑤import_example.pyを実行する

python import_example.py

⑥画像が10枚生成される

https://github.com/tkarras/progressive_growing_of_gans

Google Colaboratoryで実行したい場合は、この手順では上手くいかないため後述する変更を加える必要がある

問題点

上記の③・④のようにダウンロードをすると、ダウンロードしたファイルは自分が使っているパソコン(ローカル)に入ってくるためGoogle Colaboratory上で使えない

目標

PGGANのリポジトリに、ダウンロードしたファイル2つを加えたものをGoogle Driveにアップロードもしくはコピーする

Google ColaboratoryでGoogle Driveのファイルを使えるようにする

次章から生成までの順序や詳細について説明する

image.png

画像生成までの流れ(変更後)

①ローカルにリポジトリを複製する

git clone https://github.com/tkarras/progressive_growing_of_gans.git

image.png

②必要な2つのファイルをローカルにダウンロードする

image.png

以下のGitHubの「Importing and using pre-trained networks」の章にあるためクリックのみで可能
https://github.com/tkarras/progressive_growing_of_gans

③PGGANのリポジトリにダウンロードしたファイル2つを移動する

image.png

単純にドラッグ&ドロップをして移す

④リポジトリをGoogle Driveにアップロードもしくはコピーする

image.png

Google Driveにアップロードもしくはコピーするリポジトリはダウンロードしたファイル2つ(import_example.pyとkarras2018iclr-celebahq-1024x1024.pkl)を含むもの

アップロード:Google Driveで右クリック→フォルダをアップロード
コピー:ドラッグ&ドロップ

⑤マウント

④まで行うと下図の様な状況になっている

image.png

Google Driveへのマウントをすることで、Google Colaboratory上でGoogle Driveのファイルを使えるようにする

参考
https://qiita.com/uni-3/items/201aaa2708260cc790b8
https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786

まずは下記のコードを入力する

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

実行すると以下のような表示になる(URLの黒枠と赤線は説明のために追加したもの)
drive1.png

authorization codeを得るためにURLをクリックする

アカウントを選択する

許可をクリック

以下のように表示される
黒枠に表示されたコードをコピーして上図の赤線のところに貼り付ける
drive1.png

キーボードのEnterを押す

完了

⑥ディレクトリ移動

cd drive/My Drive/progressive_growing_of_gans
ls

PGGANのリポジトリにimport_example.pyとkarras2018iclr-celebahq-1024x1024.pklがちゃんと含まれていることが確認できる

⑦必要なpythonパッケージをインストール

numpy等を指定されたバージョンで使えるようにする

!pip install -r requirements-pip.txt

⑧実行

!python import_example.py

これで画像を生成することができた

⑨生成画像を見る

⑧で画像は生成できたが、その生成画像はどこにあるのかを確認する

ls

下記のように表示されるはず
現在のディレクトリ(progressive_growing_of_gans)に10枚の生成画像があることがわかる

config.py       karras2018iclr-celebahq-1024x1024.pkl
dataset.py       legacy.py
dataset_tool.py       LICENSE.txt
img0.png       loss.py
img1.png       metrics/
img2.png       misc.py
img3.png       networks.py
img4.png       pycache/
img5.png       README.md
img6.png       representative_image_512x256.png
img7.png       requirements-pip.txt
img8.png       tfutil.py
img9.png       train.py
import_example.py   util_scripts.py

したがって、生成画像をGoogle colaboratory上で表示させたいときは下記のようになる

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np

#画像内に線を表示しない
fig,ax = plt.subplots()
ax.tick_params(labelbottom="off",bottom="off")
ax.tick_params(labelleft="off",left="off")
ax.set_xticklabels([]) 
ax.axis('off')
#画像の読み込み
im = Image.open("img0.png")
#画像をarrayに変換
im_list = np.asarray(im)
#貼り付け
plt.imshow(im_list)
#表示
plt.show()

pg1.png

⑩生成画像をダウンロードする

from google.colab import files
files.download("img0.png")

上記のコードで生成画像をダウンロードできる

様々な顔画像を生成したい場合

上述のようにimport_example.pyを実行するだけでは同じ画像しか生成されない
             ↓
ハイパーパラメータを変えることで多様な画像を生成することができる

画像生成のコード

import_example.pyのコードは以下のようになっている

import pickle
import numpy as np
import tensorflow as tf
import PIL.Image

# Initialize TensorFlow session.
tf.InteractiveSession()

# Import official CelebA-HQ networks.
with open('karras2018iclr-celebahq-1024x1024.pkl', 'rb') as file:
    G, D, Gs = pickle.load(file)

# Generate latent vectors. 512次元の潜在変数
latents = np.random.RandomState(1000).randn(1000, *Gs.input_shapes[0][1:]) # 1000 random latents
latents = latents[[477, 56, 83, 887, 583, 391, 86, 340, 341, 415]] # hand-picked top-10

# Generate dummy labels (not used by the official networks).
labels = np.zeros([latents.shape[0]] + Gs.input_shapes[1][1:])

# Run the generator to produce a set of images.
images = Gs.run(latents, labels)

# Convert images to PIL-compatible format.
images = np.clip(np.rint((images + 1.0) / 2.0 * 255.0), 0.0, 255.0).astype(np.uint8) # [-1,1] => [0,255]
images = images.transpose(0, 2, 3, 1) # NCHW => NHWC

# Save images as PNG.
for idx in range(images.shape[0]):
    PIL.Image.fromarray(images[idx], 'RGB').save('img%d.png' % idx)

各自で変更できるところ

上記のコードから変更できる部分を抜粋

# Generate latent vectors. 
latents = np.random.RandomState(1000).randn(1000, *Gs.input_shapes[0][1:]) # 1000 random latents
latents = latents[[477, 56, 83, 887, 583, 391, 86, 340, 341, 415]] # hand-picked top-10

この部分を言語化すると以下のようになる

1行目

・RandomStateを1000に設定して、512次元の潜在変数を1000個用意する

・潜在変数をshapeで表すと(1000,512)

・RandomStateと潜在変数の数がどちらも1000になっているが、これは偶然同じ数字なだけであり、違う数字でも問題ない(例 RandomState:800、潜在変数の数:500)

変更できるところ:①RandomStateの数字
         ②潜在変数の数

2行目

・1000個の潜在変数の中から10個を選んでいる

・潜在変数をshapeで表すと(10,512)

・「477, 56, 83, 887, 583, 391, 86, 340, 341, 415」は1000個の中の478番目(0スタートのため1つずれる)、57番目、 84番目・・・を選んでいるという意味

変更できるところ:①いくつ潜在変数を使うか(潜在変数の個数=生成画像の枚数)
         ②何番目の潜在変数を使うか

生成画像

ハイパーパラメータを変えて生成した画像
image.png

まとめ・感想

・PGGANの方が以前のモデルのため当然ではあるが、StyleGANと比べて画像の多様性・画質ともに劣っている
・言い換えると約1年での進歩の速さを実感できる(PGGAN・StyleGANともにNVIDIA)

Google Driveへのマウントをすることで、Google Colaboratory上でGoogle Driveにあるファイルを利用することができる

参考

https://qiita.com/uni-3/items/201aaa2708260cc790b8
https://qiita.com/k_uekado/items/45b76f9a6f920bf0f786

コード

https://github.com/tkarras/progressive_growing_of_gans

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16