Изображение: Эти люди ненастоящие – их создал наш генератор, позволяющий контролировать различные аспекты изображения.
Этот репозиторий содержит официальную реализацию TensorFlow следующей статьи:
Архитектура генератора на основе стилей для генеративно-состязательных сетей
Теро Каррас (NVIDIA), Самули Лэйн (NVIDIA), Тимо Айла (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 тысяч сгенерированных изображений | 100 000 сгенерированных изображений с различной степенью усечения. |
│ ├ ffhq-1024x1024 | Сгенерировано с использованием набора данных Flickr-Faces-HQ с разрешением 1024×1024. |
│ ├ спальни-256х256 | Сгенерировано с использованием набора данных LSUN Bedroom размером 256×256. |
│ ├ автомобили-512х384 | Сгенерировано с использованием набора данных LSUN Car с разрешением 512×384. |
│ └ кошки-256х256 | Сгенерировано с использованием набора данных LSUN Cat размером 256×256. |
├ видео | Примеры видеороликов, созданных с помощью нашего генератора. |
│ └ качественные видеоклипы | Отдельные сегменты полученного видео в формате MP4 высокого качества. |
├ ffhq-набор данных | Необработанные данные для набора данных Flickr-Faces-HQ. |
└ сети | Предварительно обученные сети как маринованные экземпляры dnnlib.tflib.Network. |
├ stylegan-ffhq-1024x1024.pkl | StyleGAN обучался с использованием набора данных Flickr-Faces-HQ с разрешением 1024×1024. |
├ stylegan-celebahq-1024x1024.pkl | StyleGAN обучался с использованием набора данных CelebA-HQ в разрешении 1024×1024. |
├ stylegan-bedrooms-256x256.pkl | StyleGAN обучен с использованием набора данных LSUN Bedroom размером 256×256. |
├ stylegan-cars-512x384.pkl | StyleGAN обучен с использованием набора данных LSUN Car с разрешением 512×384. |
├ stylegan-cats-256x256.pkl | StyleGAN обучен с использованием набора данных LSUN Cat размером 256×256. |
└ метрики | Вспомогательные сети для показателей качества и распутывания. |
├ inception_v3_features.pkl | Стандартный классификатор Inception-v3, который выводит необработанный вектор признаков. |
├ vgg16_zhang_perceptual.pkl | Стандартная метрика LPIPS для оценки сходства восприятия. |
├ celebahq-classifier-00-male.pkl | Бинарный классификатор, обученный обнаруживать один атрибут CelebA-HQ. |
└ ⋯ | См. список файлов для остальных сетей. |
Все материалы, за исключением набора данных Flickr-Faces-HQ, доступны по лицензии Creative Commons BY-NC 4.0 от NVIDIA Corporation. Вы можете использовать, распространять и адаптировать материал в некоммерческих целях при условии, что вы укажете соответствующую оценку, цитируя нашу статью и указывая любые внесенные вами изменения .
Информацию о лицензии на набор данных FFHQ можно найти в репозитории Flickr-Faces-HQ.
inception_v3_features.pkl
и inception_v3_softmax.pkl
созданы на основе предварительно обученной сети Inception-v3 Кристианом Сегеди, Винсентом Ванхуком, Сергеем Иоффе, Джонатоном Шленсом и Збигневом Войной. Первоначально сеть была доступна по лицензии Apache 2.0 в репозитории моделей TensorFlow.
vgg16.pkl
и vgg16_zhang_perceptual.pkl
получены из предварительно обученной сети VGG-16 Кареном Симоняном и Эндрю Зиссерманом. Первоначально сеть была доступна по лицензии Creative Commons BY 4.0 на странице проекта Very Deep Convolutional Networks for Large-Scale Visual Recognition.
vgg16_zhang_perceptual.pkl
является производным от предварительно обученных весов LPIPS Ричарда Чжана, Филиппа Изола, Алексея А. Эфроса, Эли Шехтмана и Оливера Ванга. Первоначально веса использовались в соответствии с «упрощенной» лицензией BSD с 2 пунктами в репозитории PerceptualSimilarity.
Поддерживаются как Linux, так и Windows, но мы настоятельно рекомендуем Linux из соображений производительности и совместимости.
Установка 64-битной версии Python 3.6. Мы рекомендуем Anaconda3 с numpy 1.14.3 или новее.
TensorFlow 1.10.0 или новее с поддержкой графического процессора.
Один или несколько высокопроизводительных графических процессоров NVIDIA с объемом оперативной памяти не менее 11 ГБ. Мы рекомендуем NVIDIA DGX-1 с 8 графическими процессорами Tesla V100.
Драйвер 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.
Приведенный выше код загружает файл и распаковывает его, чтобы получить 3 экземпляра dnnlib.tflib.Network. Для создания изображений обычно требуется использовать Gs
— две другие сети предоставлены для полноты картины. Чтобы pickle.load()
работал, вам необходимо иметь исходный каталог dnnlib
в вашем PYTHONPATH и tf.Session
, установленный по умолчанию. Сеанс можно инициализировать, вызвав dnnlib.tflib.init_tf()
.
Есть три способа использования предварительно обученного генератора:
Используйте 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
.
Используйте 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. Он генерирует пакет случайных изображений и передает их непосредственно в сеть 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
). Доступ к конкретным значениям можно получить через экземпляры tf.Variable
, которые можно найти с помощью [var for name, var in Gs.components.synthesis.vars.items() if name.startswith('noise')]
.
При непосредственном использовании сети сопоставления вы можете указать dlatent_broadcast=None
, чтобы отключить автоматическое дублирование dlatents
по слоям сети синтеза.
Производительность во время выполнения можно точно настроить с помощью structure='fixed'
и dtype='float16'
. Первый отключает поддержку прогрессивного роста, который не нужен для полностью обученного генератора, а второй выполняет все вычисления, используя арифметику с плавающей запятой половинной точности.
Сценарии обучения и оценки работают с наборами данных, хранящимися в виде TFRecords с различным разрешением. Каждый набор данных представлен каталогом, содержащим одни и те же данные изображения в нескольких разрешениях, что обеспечивает эффективную потоковую передачу. Для каждого разрешения существует отдельный файл *.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, посетите соответствующие страницы проектов. Наборы данных можно преобразовать в TFRecords с несколькими разрешениями, используя предоставленный dataset_tool.py:
> 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
настроен на обучение StyleGAN высочайшего качества (конфигурация F в таблице 1) для набора данных FFHQ с разрешением 1024×1024 с использованием 8 графических процессоров. Обратите внимание, что во всех наших экспериментах мы использовали 8 графических процессоров. Обучение с меньшим количеством графических процессоров может не дать одинаковых результатов — если вы хотите сравнить с нашей методикой, мы настоятельно рекомендуем использовать такое же количество графических процессоров.
Ожидаемое время обучения для конфигурации по умолчанию с использованием графических процессоров Tesla V100:
графические процессоры | 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. По умолчанию скрипт оценивает начальное расстояние Фреше ( fid50k
) для предварительно обученного генератора FFHQ и записывает результаты во вновь созданный каталог в разделе results
. Точное поведение можно изменить, раскомментировав или отредактировав определенные строки в run_metrics.py.
Ожидаемое время оценки и результаты для предварительно обученного генератора FFHQ с использованием одного графического процессора Tesla V100:
Метрика | Время | Результат | Описание |
---|---|---|---|
фид50к | 16 мин. | 4.4159 | Начальное расстояние Фреше с использованием 50 000 изображений. |
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 часов | я: 165.0106 ш: 3,7447 | Линейная разделимость по Z и W. |
Обратите внимание, что точные результаты могут варьироваться от запуска к запуску из-за недетерминированной природы TensorFlow.
Мы благодарим Яакко Лехтинена, Давида Любке и Туомаса Кюнкянниеми за углубленные обсуждения и полезные комментарии; Янне Хеллстену, Теро Куосманену и Пекке Янису за вычислительную инфраструктуру и помощь в выпуске кода.