1.はじめに
最近、GANは高品質な画像生成が可能になっていますが、その学習については慎重な正規化、大量の計算、ハイパーパラメータ調整などの課題がまだ残されています。今回ご紹介するのは、これらの課題を軽減するProjected GANという技術です。
*この論文は、NeurIPS 2021で採択されたものです。
2.Projected GANとは?
ポイントは、学習する画像(Real)と生成器の出力画像(Generated Image)を固定の特徴空間に投影し、チャネルと解像度の両面から特徴を抽出して識別器へ送ることです。
CCMは、チャネルからの特徴抽出を担当し、4つの畳み込み層の重みをランダムに初期化した構造をしています。CSMは、解像度からの特徴抽出を担当し、CCMを拡張させたU-Netの構造をしています。
これらのアーキテクチャの採用によって、Projected GANは、StyleGAN 2-ADAと比較して収束が速くFIDが低くなることが、多くのデータセットで検証されているようです。
さて、実際に学習をさせてみたいところですが、今回は時間の関係で学習済みパラメータを使って画像の生成のみ行ってみたいと思います。学習をしてみたい方は、下記に学習用のcolabがありますので、トライしてみて下さい。
Projected GAN google colab リンク
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップを行います。学習済みパラメータは8種類提供されていますが、ここではその内3種類(art_painting.pkl, church.pkl, pokemon.pkl)のみをダウンロードしています。3種類以外のパラメータをダウンロードしたい場合は、該当するコメントアウト(#)を外して下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# --- セットアップ --- # Pytorch バージョン変更 ! pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html # githubからコードを取得 ! git clone https://github.com/autonomousvision/projected_gan ! pip install timm dill %cd projected_gan # 学習済みパラメータのダウンロード ! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/art_painting.pkl ! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/church.pkl #! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/cityscapes.pkl #! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/clevr.pkl #! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/ffhq.pkl #! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/flowers.pkl #! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/landscape.pkl ! wget https://s3.eu-central-1.amazonaws.com/avg-projects/projected_gan/models/pokemon.pkl # 画像表示 import matplotlib.pyplot as plt from PIL import Image import os import numpy as np def display_pic(folder): fig = plt.figure(figsize=(30, 60)) files = os.listdir(folder) files.sort() for i, file in enumerate(files): img = Image.open(folder+'/'+file) images = np.asarray(img) ax = fig.add_subplot(10, 5, i+1, xticks=[], yticks=[]) image_plt = np.array(images) ax.imshow(image_plt) ax.set_xlabel(file, fontsize=25) plt.show() plt.close() # リセットフォルダ import shutil def reset_folder(path): if os.path.isdir(path): shutil.rmtree(path) os.makedirs(path,exist_ok=True) # 動画再生 from IPython.display import display, HTML from IPython.display import HTML def display_mp4(path): print('prepere to play movie...') from base64 import b64encode mp4 = open(path,'rb').read() data_url = "data:video/mp4;base64," + b64encode(mp4).decode() display(HTML(""" <video controls loop autoplay> <source src="%s" type="video/mp4"> </video> """ % data_url)) |
まず、gen_images.pyでサンプル画像を生成してみましょう。引数は、–outdirで出力フォルダ、–truncで変化度合い(数字が大きいほど変化が大きい)、–seedsで乱数の指定(=出力個数)、–networkで学習済みパラメータの指定です。
1 2 3 4 5 6 |
# サンプル画像生成 reset_folder('out') ! python gen_images.py --outdir=out\ --trunc=1.0\ --seeds=20-29 \ --network=pokemon.pkl |
1 2 |
# 画像の表示 display_pic('out') |
今度は、gen_video.pyで補完動画を作成してみましょう。引数は、–outdirで出力ファイル名、–truncで変化度合い(数字が大きいほど変化が大きい)、–seedsで乱数の指定(=ベクトル個数)、–gridで出力形状、–networkで学習済みパラメータの指定です。
1 2 3 4 5 6 |
# 補完動画の作成 ! python gen_video.py --output=lerp.mp4\ --trunc=1.0\ --seeds=20-49\ --grid=3x2 \ --network=pokemon.pkl |
1 2 |
# 動画の再生 display_mp4('lerp.mp4') |
別のパラメータも試してみましょう。補完動画の作成で、–network=church.pklに変更すると、
もう1つ。補完動画の作成で、–network=art_painting.pklに変更すると、
では、また。
(オリジナルgithub)https://github.com/autonomousvision/projected_gan
こんにちは。いつも大変有用な記事をありがとうございます。
さて、公開されているcolabを早速実行してみたのですが、
# サンプル画像生成
を実行すると、下記エラーのためその先へ進まないのですが、原因や解決法はお分かりになりますか?
AttributeError: ‘Upsample’ object has no attribute ‘recompute_scale_factor’
以上、よろしくお願いいたします。
さよさん
エラー情報ありがとうございます。
ColabのPytorchバージョンアップが原因でした。
修正済みです。ご確認ください。