写真:これらの人々は本物ではありません。画像のさまざまな側面を制御できるジェネレーターによって生成されました。
このリポジトリには、次の論文の公式 TensorFlow 実装が含まれています。
敵対的生成ネットワークのためのスタイルベースのジェネレーター アーキテクチャ
Tero Karras (NVIDIA)、Samuli Laine (NVIDIA)、Timo Aila (NVIDIA)
https://arxiv.org/abs/1812.04948要約:スタイル転送の文献から借用した、敵対的生成ネットワーク用の代替ジェネレータ アーキテクチャを提案します。新しいアーキテクチャは、高レベルの属性 (例: 人間の顔でトレーニングされた場合のポーズやアイデンティティ) と、生成された画像の確率的変動 (例: そばかす、髪) を教師なしで自動的に学習し、直感的でスケールの大きなものを可能にします。合成の具体的な制御。新しいジェネレータは、従来の配信品質メトリクスの観点から最先端を改善し、明らかにより優れた補間特性を実現し、変動の潜在的な要因もより適切に解きほぐします。補間の品質ともつれの解消を定量化するために、あらゆるジェネレーター アーキテクチャに適用できる 2 つの新しい自動化手法を提案します。最後に、人間の顔の非常に多様性に富んだ高品質な新しいデータセットを紹介します。
ビジネスに関するお問い合わせについては、弊社 Web サイトにアクセスし、次のフォームを送信してください: NVIDIA Research Licensing
★★★ 新しい: StyleGAN2-ADA-PyTorch が利用可能になりました。バージョンの完全なリストはこちらからご覧ください ★★★
私たちの論文に関連する資料は、次のリンクから入手できます。
論文: https://arxiv.org/abs/1812.04948
ビデオ: https://youtu.be/kSLJriaOumA
コード: https://github.com/NVlabs/stylegan
FFHQ: https://github.com/NVlabs/ffhq-dataset
追加の資料は Google ドライブにあります。
パス | 説明 |
---|---|
スタイルGAN | メインフォルダー。 |
§ stylegan-paper.pdf | 紙のPDFの高品質バージョン。 |
§ スタイルガンビデオ.mp4 | 結果ビデオの高品質バージョン。 |
§ 画像 | ジェネレーターを使用して生成された画像の例。 |
│ § 代表画像 | 記事やブログ投稿などで使用できる高品質の画像。 |
│ └ 100k 生成画像 | さまざまな切り捨て量に対して 100,000 個の画像が生成されました。 |
│ § ffhq-1024x1024 | 1024×1024 の Flickr-Faces-HQ データセットを使用して生成されました。 |
│ § ベッドルーム-256x256 | 256×256 の LSUN Bedroom データセットを使用して生成されました。 |
│ § 車-512x384 | 512×384 の LSUN Car データセットを使用して生成されました。 |
│ └ 猫-256x256 | 256×256 の LSUN Cat データセットを使用して生成されました。 |
§ 動画 | ジェネレーターを使用して作成されたビデオの例。 |
│ └ 高画質ビデオクリップ | 結果ビデオの個々のセグメントは高品質の MP4 として保存されます。 |
§ ffhq データセット | Flickr-Faces-HQ データセットの生データ。 |
━ ネットワーク | dnnlib.tflib.Network の pickle インスタンスとして事前トレーニングされたネットワーク。 |
§ stylegan-ffhq-1024x1024.pkl | StyleGAN は 1024×1024 の Flickr-Faces-HQ データセットでトレーニングされました。 |
§ stylegan-celebahq-1024x1024.pkl | StyleGAN は 1024×1024 の CelebA-HQ データセットでトレーニングされました。 |
§ スタイルガン-ベッドルーム-256x256.pkl | StyleGAN は 256×256 の LSUN Bedroom データセットでトレーニングされました。 |
§ stylegan-cars-512x384.pkl | StyleGAN は 512×384 の LSUN Car データセットでトレーニングされました。 |
§ stylegan-cats-256x256.pkl | StyleGAN は 256×256 の LSUN Cat データセットでトレーニングされました。 |
└ メトリクス | 品質およびもつれ解除メトリクスのための補助ネットワーク。 |
§ inception_v3_features.pkl | 生の特徴ベクトルを出力する標準 Inception-v3 分類器。 |
§ vgg16_zhang_perceptual.pkl | 知覚的な類似性を推定するための標準 LPIPS メトリック。 |
§ celebahq-classifier-00-male.pkl | CelebA-HQ の単一属性を検出するようにトレーニングされたバイナリ分類器。 |
━ ⋯ | 残りのネットワークについては、ファイル リストを参照してください。 |
Flickr-Faces-HQ データセットを除くすべての素材は、NVIDIA Corporation の Creative Commons BY-NC 4.0 ライセンスに基づいて利用可能です。私たちの論文を引用し、加えた変更を示すことによって適切なクレジットを表示する限り、非営利目的でマテリアルを使用、再配布、改変することができます。
FFHQ データセットに関するライセンス情報については、Flickr-Faces-HQ リポジトリを参照してください。
inception_v3_features.pkl
およびinception_v3_softmax.pkl
は、Christian Szegedy、Vincent Vanhoucke、Sergey Ioffe、Jonathon Shlens、Zbigniew Wojna によって事前トレーニングされた Inception-v3 ネットワークから派生しています。このネットワークは元々、TensorFlow Models リポジトリ上の Apache 2.0 ライセンスに基づいて共有されていました。
vgg16.pkl
とvgg16_zhang_perceptual.pkl
は、Karen Simonyan と Andrew Zisserman によって事前トレーニングされた VGG-16 ネットワークから派生しています。このネットワークはもともと、大規模視覚認識のための超深層畳み込みネットワーク プロジェクト ページでクリエイティブ コモンズ BY 4.0 ライセンスに基づいて共有されていました。
vgg16_zhang_perceptual.pkl
は、Richard Zhang、Phillip Isola、Alexei A. Efros、Eli Shechtman、および Oliver Wang によって、事前トレーニングされた LPIPS 重みからさらに派生されます。重みは元々、BSD 2 条項「簡易」ライセンスに基づいて PerceptualSimilarity リポジトリで共有されていました。
Linux と Windows の両方がサポートされていますが、パフォーマンスと互換性の理由から Linux を強くお勧めします。
64 ビット Python 3.6 のインストール。 Anaconda3 と numpy 1.14.3 以降を推奨します。
GPU をサポートする TensorFlow 1.10.0 以降。
少なくとも 11 GB の DRAM を搭載した 1 つ以上のハイエンド NVIDIA GPU。 8 Tesla V100 GPU を搭載した NVIDIA DGX-1 をお勧めします。
NVIDIA ドライバー 391.35 以降、CUDA ツールキット 9.0 以降、cuDNN 7.3.1 以降。
事前トレーニングされた StyleGAN ジェネレーターを使用する最小限の例が pretrained_example.py に示されています。実行すると、スクリプトは事前トレーニング済みの StyleGAN ジェネレーターを Google ドライブからダウンロードし、それを使用して画像を生成します。
> python pretrained_example.py Downloading https://drive.google.com/uc?id=1MEGjdvVpUsu1jB4zrXZN7Y4kBBOzizDQ .... done Gs Params OutputShape WeightShape --- --- --- --- latents_in - (?, 512) - ... images_out - (?, 3, 1024, 1024) - --- --- --- --- Total 26219627 > ls results example.png # https://drive.google.com/uc?id=1UDLT_zb-rof9kKH0GwiJW_bS9MoZi8oP
より高度な例は、generate_figures.py に示されています。このスクリプトは、スタイルの混合、ノイズ入力、切り捨てを説明するために論文の図を再現しています。
> python generate_figures.py results/figure02-uncurated-ffhq.png # https://drive.google.com/uc?id=1U3r1xgcD7o-Fd0SBRpq8PXYajm7_30cu results/figure03-style-mixing.png # https://drive.google.com/uc?id=1U-nlMDtpnf1RcYkaFQtbh5oxnhA97hy6 results/figure04-noise-detail.png # https://drive.google.com/uc?id=1UX3m39u_DTU6eLnEW6MqGzbwPFt2R9cG results/figure05-noise-components.png # https://drive.google.com/uc?id=1UQKPcvYVeWMRccGMbs2pPD9PVv1QDyp_ results/figure08-truncation-trick.png # https://drive.google.com/uc?id=1ULea0C12zGlxdDQFNLXOWZCHi3QNfk_v results/figure10-uncurated-bedrooms.png # https://drive.google.com/uc?id=1UEBnms1XMfj78OHj3_cx80mUf_m9DUJr results/figure11-uncurated-cars.png # https://drive.google.com/uc?id=1UO-4JtAs64Kun5vIj10UXqAJ1d5Ir1Ke results/figure12-uncurated-cats.png # https://drive.google.com/uc?id=1USnJc14prlu3QAYxstrtlfXC9sDWPA-W
事前トレーニングされたネットワークは、標準の pickle ファイルとして Google ドライブに保存されます。
# Load pre-trained network. url = 'https://drive.google.com/uc?id=1MEGjdvVpUsu1jB4zrXZN7Y4kBBOzizDQ' # karras2019stylegan-ffhq-1024x1024.pkl with dnnlib.util.open_url(url, cache_dir=config.cache_dir) as f: _G, _D, Gs = pickle.load(f) # _G = Instantaneous snapshot of the generator. Mainly useful for resuming a previous training run. # _D = Instantaneous snapshot of the discriminator. Mainly useful for resuming a previous training run. # Gs = Long-term average of the generator. Yields higher-quality results than the instantaneous snapshot.
上記のコードは、ファイルをダウンロードして unpickle 化し、dnnlib.tflib.Network の 3 つのインスタンスを生成します。画像を生成するには、通常、 Gs
使用します。他の 2 つのネットワークは完全を期すために提供されています。 pickle.load()
が機能するには、PYTHONPATH にdnnlib
ソース ディレクトリがあり、 tf.Session
デフォルトとして設定されている必要があります。セッションは、 dnnlib.tflib.init_tf()
を呼び出すことで初期化できます。
事前トレーニングされたジェネレーターを使用するには、次の 3 つの方法があります。
入力と出力が numpy 配列である即時モード操作にはGs.run()
使用します。
# Pick latent vector. rnd = np.random.RandomState(5) latents = rnd.randn(1, Gs.input_shape[1]) # Generate image. fmt = dict(func=tflib.convert_images_to_uint8, nchw_to_nhwc=True) images = Gs.run(latents, None, truncation_psi=0.7, randomize_noise=True, output_transform=fmt)
最初の引数は、形状[num, 512]
の潜在ベクトルのバッチです。 2 番目の引数はクラス ラベル用に予約されています (StyleGAN では使用されません)。残りのキーワード引数はオプションであり、操作をさらに変更するために使用できます (以下を参照)。出力は画像のバッチであり、その形式は、 output_transform
引数によって指定されます。
Gs.get_output_for()
使用して、ジェネレーターをより大きな TensorFlow 式の一部として組み込みます。
latents = tf.random_normal([self.minibatch_per_gpu] + Gs_clone.input_shape[1:]) images = Gs_clone.get_output_for(latents, None, is_validation=True, randomize_noise=True) images = tflib.convert_images_to_uint8(images) result_expr.append(inception_clone.get_output_for(images))
上記のコードは、metrics/frechet_inception_ distance.py からのものです。ランダムな画像のバッチを生成し、途中でデータを numpy 配列に変換することなく、それらを Inception-v3 ネットワークに直接フィードします。
Gs.components.mapping
とGs.components.synthesis
を検索して、ジェネレーターの個々のサブネットワークにアクセスします。 Gs
と同様に、サブネットワークは dnnlib.tflib.Network の独立したインスタンスとして表されます。
src_latents = np.stack(np.random.RandomState(seed).randn(Gs.input_shape[1]) for seed in src_seeds) src_dlatents = Gs.components.mapping.run(src_latents, None) # [seed, layer, component] src_images = Gs.components.synthesis.run(src_dlatents, randomize_noise=False, **synthesis_kwargs)
上記のコードは、generate_figures.py からのものです。まず、マッピング ネットワークを使用して潜在ベクトルのバッチを中間W空間に変換し、次に合成ネットワークを使用してこれらのベクトルを画像のバッチに変換します。 dlatents
配列は、スタイルの混合を容易にするために、合成ネットワークの各レイヤーに対して同じwベクトルの個別のコピーを保存します。
ジェネレーターの正確な詳細は training/networks_stylegan.py で定義されています ( G_style
、 G_mapping
、およびG_synthesis
参照)。次のキーワード引数を指定して、 run()
およびget_output_for()
呼び出すときの動作を変更できます。
truncation_psi
とtruncation_cutoff
Gs
(ψ=0.7、cutoff=8) を使用するときにデフォルトで実行される切り捨てトリックを制御します。これはtruncation_psi=1
またはis_validation=True
に設定することで無効にすることができ、たとえばtruncation_psi=0.5
に設定することで、変動を犠牲にして画質をさらに向上させることができます。サブネットワークを直接使用する場合、切り捨ては常に無効になることに注意してください。切り捨てトリックを手動で実行するために必要な平均w はGs.get_var('dlatent_avg')
を使用して検索できます。
randomize_noise
生成されたイメージごとにノイズ入力の再ランダム化を使用するか ( True
、デフォルト)、ミニバッチ全体に特定のノイズ値を使用するか ( False
) を決定します。特定の値[var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
を使用して見つかるtf.Variable
インスタンスを介してアクセスできます。
マッピング ネットワークを直接使用する場合は、 dlatent_broadcast=None
を指定して、合成ネットワークのレイヤー上でのdlatents
の自動複製を無効にすることができます。
実行時のパフォーマンスはstructure='fixed'
およびdtype='float16'
によって微調整できます。前者は、完全にトレーニングされたジェネレーターには必要のない漸進的成長のサポートを無効にし、後者は、半精度浮動小数点演算を使用してすべての計算を実行します。
トレーニングおよび評価スクリプトは、多重解像度の TFRecord として保存されたデータセットに対して動作します。各データセットは、効率的なストリーミングを可能にするために、複数の解像度の同じ画像データを含むディレクトリによって表されます。解像度ごとに個別の *.tfrecords ファイルがあり、データセットにラベルが含まれている場合は、ラベルも別のファイルに保存されます。デフォルトでは、スクリプトはdatasets/<NAME>/<NAME>-<RESOLUTION>.tfrecords
でデータセットを見つけることを想定しています。ディレクトリは config.py を編集することで変更できます。
result_dir = 'results' data_dir = 'datasets' cache_dir = 'cache'
FFHQ データセット ( datasets/ffhq
) を取得するには、Flickr-Faces-HQ リポジトリを参照してください。
CelebA-HQ データセット ( datasets/celebahq
) を取得するには、Progressive GAN リポジトリを参照してください。
LSUN を含む他のデータセットを入手するには、対応するプロジェクト ページを参照してください。データセットは、提供されている dataset_tool.py を使用して多重解像度 TFRecord に変換できます。
> python dataset_tool.py create_lsun datasets/lsun-bedroom-full ~/lsun/bedroom_lmdb --resolution 256 > python dataset_tool.py create_lsun_wide datasets/lsun-car-512x384 ~/lsun/car_lmdb --width 512 --height 384 > python dataset_tool.py create_lsun datasets/lsun-cat-full ~/lsun/cat_lmdb --resolution 256 > python dataset_tool.py create_cifar10 datasets/cifar10 ~/cifar10 > python dataset_tool.py create_from_images datasets/custom-dataset ~/custom-images
データセットをセットアップしたら、次のように独自の StyleGAN ネットワークをトレーニングできます。
train.py を編集して、コメントを解除するか特定の行を編集してデータセットとトレーニング構成を指定します。
python train.py
を使用してトレーニング スクリプトを実行します。
結果は、新しく作成されたディレクトリresults/<ID>-<DESCRIPTION>
に書き込まれます。
構成によっては、トレーニングが完了するまでに数日 (または数週間) かかる場合があります。
デフォルトでは、 train.py
8 つの GPU を使用して 1024×1024 の解像度で FFHQ データセットの最高品質の StyleGAN (表 1 の構成 F) をトレーニングするように構成されています。すべての実験で 8 つの GPU を使用したことに注意してください。 GPU の数が少ないトレーニングでは同じ結果が得られない可能性があります。私たちの手法と比較したい場合は、同じ数の GPU を使用することを強くお勧めします。
Tesla V100 GPU を使用したデフォルト構成で予想されるトレーニング時間:
GPU | 1024×1024 | 512×512 | 256×256 |
---|---|---|---|
1 | 41日4時間 | 24日21時間 | 14日22時間 |
2 | 21日22時間 | 13日 7時間 | 9日間 5時間 |
4 | 11日8時間 | 7日0時間 | 4日間21時間 |
8 | 6日間14時間 | 4日間10時間 | 3日間8時間 |
私たちの論文で使用されている品質ともつれの解消のメトリクスは、run_metrics.py を使用して評価できます。デフォルトでは、スクリプトは事前トレーニングされた FFHQ ジェネレーターの Fréchet Inception Distance ( fid50k
) を評価し、その結果をresults
の下に新しく作成されたディレクトリに書き込みます。正確な動作は、run_metrics.py の特定の行のコメントを解除するか編集することで変更できます。
1 つの Tesla V100 GPU を使用した事前トレーニング済み FFHQ ジェネレーターの予想される評価時間と結果:
メトリック | 時間 | 結果 | 説明 |
---|---|---|---|
fid50k | 16分 | 4.4159 | 50,000 枚の画像を使用した Fréchet Inception Distance。 |
ppl_zfull | 55分 | 664.8854 | Zの完全パスの知覚パス長。 |
ppl_wfull | 55分 | 233.3059 | Wの完全パスの知覚パス長。 |
ppl_zend | 55分 | 666.1057 | Zのパス端点の知覚パス長。 |
ppl_wend | 55分 | 197.2266 | Wのパス端点の知覚パス長。 |
ls | 10時間 | z: 165.0106 w: 3.7447 | ZとWの線形分離性。 |
TensorFlow の非決定的な性質により、正確な結果は実行ごとに異なる場合があることに注意してください。
詳細な議論と有益なコメントを提供してくれた Jaakko Lehtinen、David Luebke、Tuomas Kynkäänniemi に感謝します。 Janne Hellsten、Tero Kuosmanen、Pekka Jänis がコンピューティング インフラストラクチャを担当し、コード リリースを支援しました。