사진: 이 사람들은 실제가 아닙니다. 이미지의 다양한 측면을 제어할 수 있는 생성기에 의해 생성된 것입니다.
이 저장소에는 다음 문서의 공식 TensorFlow 구현이 포함되어 있습니다.
생성적 적대 신경망을 위한 스타일 기반 생성기 아키텍처
Tero Karras(NVIDIA), Samuli Laine(NVIDIA), Timo Aila(NVIDIA)
https://arxiv.org/abs/1812.04948개요: 우리는 스타일 전달 문헌을 빌려 생성적 적대 신경망을 위한 대체 생성기 아키텍처를 제안합니다. 새로운 아키텍처는 생성된 이미지(예: 주근깨, 머리카락)의 높은 수준 속성(예: 인간 얼굴에 훈련할 때 포즈 및 신원)과 확률론적 변화를 자동으로 학습되고 감독되지 않는 분리로 이어지며 직관적인 확장이 가능합니다. 합성의 특정 제어. 새로운 생성기는 전통적인 배포 품질 지표 측면에서 최첨단 기술을 개선하고, 명백히 더 나은 보간 속성을 제공하며, 잠재적인 변동 요인을 더 잘 풀어냅니다. 보간 품질과 풀림을 정량화하기 위해 모든 생성기 아키텍처에 적용할 수 있는 두 가지 새로운 자동화 방법을 제안합니다. 마지막으로, 우리는 인간 얼굴에 대한 새롭고 매우 다양하며 고품질의 데이터 세트를 소개합니다.
비즈니스 문의 사항이 있는 경우 당사 웹사이트를 방문하여 NVIDIA 연구 라이선스 양식을 제출해 주세요.
★★★ 신규: 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의 고품질 버전입니다. |
├ stylegan-video.mp4 | 결과 비디오의 고품질 버전입니다. |
├ 이미지 | 생성기를 사용하여 생성된 예시 이미지. |
│ ├ 대표이미지 | 기사, 블로그 게시물 등에 사용할 수 있는 고품질 이미지입니다. |
│ └ 100,000개 생성 이미지 | 다양한 양의 잘림에 대해 100,000개의 이미지가 생성되었습니다. |
│ ├ ffhq-1024x1024 | 1024×1024의 Flickr-Faces-HQ 데이터 세트를 사용하여 생성되었습니다. |
│ ├ 침실-256x256 | 256×256 크기의 LSUN 침실 데이터세트를 사용하여 생성되었습니다. |
│ ├ 자동차-512x384 | 512×384의 LSUN Car 데이터 세트를 사용하여 생성되었습니다. |
│ └ 고양이-256x256 | 256×256의 LSUN Cat 데이터세트를 사용하여 생성되었습니다. |
├ 동영상 | 당사의 생성기를 사용하여 제작된 예시 비디오입니다. |
│ └ 고품질 비디오 클립 | 결과 비디오의 개별 세그먼트는 고품질 MP4로 제공됩니다. |
├ ffhq-데이터세트 | Flickr-Faces-HQ 데이터세트의 원시 데이터입니다. |
└ 네트워크 | dnnlib.tflib.Network의 피클링된 인스턴스로 사전 훈련된 네트워크. |
├ stylegan-ffhq-1024x1024.pkl | StyleGAN은 1024×1024의 Flickr-Faces-HQ 데이터 세트로 훈련되었습니다. |
├ stylegan-celebahq-1024x1024.pkl | StyleGAN은 1024×1024의 CelebA-HQ 데이터 세트로 훈련되었습니다. |
├ stylegan-bedrooms-256x256.pkl | StyleGAN은 256×256의 LSUN 침실 데이터세트로 훈련되었습니다. |
├ 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-분류자-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 모델 저장소의 Apache 2.0 라이선스에 따라 공유되었습니다.
vgg16.pkl
및 vgg16_zhang_perceptual.pkl
Karen Simonyan과 Andrew Zisserman이 사전 훈련한 VGG-16 네트워크에서 파생되었습니다. 이 네트워크는 원래 대규모 시각적 인식을 위한 Very Deep Convolutional Networks 프로젝트 페이지의 Creative Commons BY 4.0 라이선스에 따라 공유되었습니다.
vgg16_zhang_perceptual.pkl
은 Richard Zhang, Phillip Isola, Alexei A. Efros, Eli Shechtman 및 Oliver Wang이 사전 훈련한 LPIPS 가중치에서 추가로 파생되었습니다. 가중치는 원래 PerceptualSimilarity 저장소의 BSD 2-Clause "Simplified" 라이센스에 따라 공유되었습니다.
Linux와 Windows가 모두 지원되지만 성능과 호환성을 이유로 Linux를 적극 권장합니다.
64비트 Python 3.6 설치. numpy 1.14.3 이상의 Anaconda3을 권장합니다.
GPU를 지원하는 TensorFlow 1.10.0 이상.
최소 11GB DRAM을 갖춘 하나 이상의 고급 NVIDIA GPU. 8개의 Tesla V100 GPU가 탑재된 NVIDIA DGX-1을 권장합니다.
NVIDIA 드라이버 391.35 이상, CUDA 툴킷 9.0 이상, cuDNN 7.3.1 이상.
사전 훈련된 StyleGAN 생성기를 사용하는 최소한의 예는 pretrained_example.py에 나와 있습니다. 실행되면 스크립트는 Google Drive에서 사전 훈련된 StyleGAN 생성기를 다운로드하고 이를 사용하여 이미지를 생성합니다.
> 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
사전 훈련된 네트워크는 Google Drive에 표준 피클 파일로 저장됩니다.
# 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.
위의 코드는 파일을 다운로드하고 피클을 해제하여 dnnlib.tflib.Network의 3개 인스턴스를 생성합니다. 이미지를 생성하려면 일반적으로 Gs
사용하는 것이 좋습니다. 다른 두 네트워크는 완전성을 위해 제공됩니다. pickle.load()
작동하려면 PYTHONPATH에 dnnlib
소스 디렉터리가 있어야 하고 tf.Session
이 기본값으로 설정되어 있어야 합니다. dnnlib.tflib.init_tf()
호출하여 세션을 초기화할 수 있습니다.
사전 훈련된 생성기를 사용하는 방법에는 세 가지가 있습니다.
입력과 출력이 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]
모양의 잠재 벡터 배치입니다. 두 번째 인수는 클래스 레이블용으로 예약되어 있습니다(StyleGAN에서는 사용되지 않음). 나머지 키워드 인수는 선택 사항이며 작업을 추가로 수정하는 데 사용할 수 있습니다(아래 참조). 출력은 output_transform
인수에 의해 형식이 결정되는 이미지 배치입니다.
생성기를 더 큰 TensorFlow 표현식의 일부로 통합하려면 Gs.get_output_for()
사용하세요.
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을 포함한 다른 데이터세트를 얻으려면 해당 프로젝트 페이지를 참조하세요. 제공된 데이터세트_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에서 특정 줄의 주석 처리를 제거하거나 편집하여 정확한 동작을 변경할 수 있습니다.
하나의 Tesla V100 GPU를 사용하여 사전 훈련된 FFHQ 생성기에 대한 예상 평가 시간 및 결과:
미터법 | 시간 | 결과 | 설명 |
---|---|---|---|
5만 달러 | 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 의 경로 끝점에 대한 지각 경로 길이입니다. |
ㅋㅋㅋ | 10시간 | z: 165.0106 w: 3.7447 | Z 와 W 의 선형 분리성. |
TensorFlow의 비결정적 특성으로 인해 정확한 결과는 실행마다 다를 수 있습니다.
심도 있는 토론과 유용한 의견을 주신 Jaakko Lehtinen, David Luebke, Tuomas Kynkäänniemi에게 감사드립니다. 컴퓨팅 인프라와 코드 릴리스에 대한 도움을 주신 Janne Hellsten, Tero Kuosmanen 및 Pekka Jänis.