Поиск по сайту Поиск

Генерация аниме с помощью нейросети StyleGAN

StyleGAN — та самая нейросеть, которая генерирует лица несуществующих людей на сайте thispersondoesnotexist.com. Исследователь Gwern Branwen вывел её на новый уровень и научил создавать несуществующие лица персонажей аниме, запустив свой сайт thiswaifudoesnotexist.net. На нём каждые 15 секунд появляется новый персонаж и его история, также генерируемая искусственным интеллектом. Сегодня мы расскажем, как самому обучить нейросеть для создания аниме-лиц с помощью StyleGAN.

В попытках заставить компьютер рисовать аниме есть что-то забавное — это уж точно интереснее, чем работать со снимками знаменитостей или с датасетом ImageNet! Кроме того, рисунки и аниме отличаются от фотографий, которые сейчас очень часто используются в задачах машинного обучения. Если нейросети научатся генерировать случайные нарисованные изображения, то совсем скоро станет возможна генерация картин и фотографий по их текстовому описанию.

Gwern пробовал решить задачу с помощью ряда существующих генеративных сетей: StackGAN / StackGAN ++ & Pixel * NN *, WGAN-GP, Glow, GAN-QP, MSG-GAN, SAGAN, VGAN, PokeGAN, BigGAN 3, ProGAN и StyleGAN. Многие из них начинали либо расходиться после одного или двух дней обучения, либо создавать ограниченный диапазон лиц (или одно лицо), либо просто сходиться к изображениям плохого качества.

Первый успех продемонстрировали сети BigGAN и ProGAN: они показали, что обычные CNN могут научиться генерировать и масштабировать чёткие аниме-изображения. Сеть ProGAN была достаточно мощной, но требовала около 6 недель обучения на GPU. Поэтому ей на смену пришла StyleGAN — более быстрая архитектура, с которой можно обучать объёмные модели на больших наборах данных.

Сгенерированные с помощью GAN аниме

Сгенерированные с помощью GAN аниме

StyleGAN стала настоящим прорывом, поскольку предоставляла возможности уровня ProGAN, но работала быстрее. Эта сеть с радикально иной архитектурой минимизирует потребность в медленном прогрессивном росте (возможно, полностью его исключая) и эффективно обучается на изображениях с разным разрешением. Кроме того, она позволяет контролировать генерируемые кадры с помощью механизма передачи стиля.

Примеры

Для начала продемонстрируем возможность StyleGAN генерировать аниме-лица:

64 лучших образца аниме-лиц

64 лучших образца аниме-лиц TWDNE (This Waifu Does Not Exist), собранных из социальных сетей
100 случайно сгенерированных StyleGAN аниме-изображений

100 случайно сгенерированных StyleGAN аниме-изображений

Стоит отметить, что лица получаются очень разнообразными: меняется не только цвет волос или глаз, ориентация головы и другие мелкие детали, но и общий стиль. Изображения могут быть похожи на кадр из мультфильма, компьютерную графику, аниме 90-х и 00-х годов и даже на рисунки акварелью или маслом.

Видео, демонстрирующие разнообразие аниме-лиц:

Илон Маск одобряет

Илон Маск одобряет

О StyleGAN

StyleGAN представлена в 2018 году. Она использует стандартную архитектуру GAN, применяемую в ProGAN, но черпает вдохновение из механизма передачи стиля. StyleGAN модифицирует свою генераторную сеть (генератор), которая создаёт изображение путём его многократного увеличения: 8px → 16px → 32px → 64px → 128px и т. д. При этом на каждом уровне используется комбинация случайных входных данных или «стилевого шума» (“style noise”) с AdaIN. Это указывает генератору, как стилизовать изображения с определённым разрешением: изменить волосы, текстуру кожи и так далее. Систематически создавая такую случайность на каждом этапе процесса формирования изображения, StyleGAN может эффективно выбирать более удачные варианты.

Сравнение архитектур ProGAN (a) и StyleGAN (b)

Сравнение архитектур ProGAN (a) и StyleGAN (b)

StyleGAN вносит также ряд дополнительных улучшений: например, в ней используется новый датасет лиц “FFHQ” с изображениями размером 1024 пикселя (выше, чем у ProGAN). Кроме того, сеть демонстрирует меньше потерь и очень интенсивно использует полностью связанные слои для обработки случайного ввода (не менее 8 слоёв из 512 нейронов, в то время как у большинства GAN 1 или 2 слоя). Ещё более поразительным является то, что в StyleGAN не используются методы, которые считались критически важными для обучения других GAN: например, релятивистские потери, распределение шума, расширенная регуляризация и т. д.

За исключением этих особенностей, архитектура  довольно обычная. Поэтому если вы имели дело с какой-либо GAN — можете смело работать со StyleGAN. Процесс обучения тот же, гиперпараметры стандартные, а код во многом совпадает с ProGAN.

Приложения

Благодаря своей скорости и стабильности StyleGAN успела приспособиться к широкому кругу задач. Вот некоторые из её применений:

Этого человека не существует

тесты: Какое лицо реально / Реальное или нет?

— котики: Этих кошек не существует , Этого кота не существует (ошибки в генерации кошек ; интерполяция / передача стиля)

— гостиничные номера (с текстовыми описаниями, сгенерированными RNN): Этого номера не существует

кухня / столовая / гостиная / спальня (с использованием трансферного обучения)

Этого вайфу не существует

шрифты

готические соборы

спутниковые снимки

граффити

селфи из фотобудки

здания Фрэнка Гери

причёски

рамен

винные этикетки

городские пейзажи

художественные портреты

покемоны

логотипы

текстуры Doom

Imagequilt visualization of the wide range of visual subjects StyleGAN has been applied to

Широкий спектр возможностей StyleGAN

Что нужно для обучения

Данные

Необходимый размер набора данных зависит от сложности задачи и от того, применяется ли трансферное обучение. По умолчанию StyleGAN использует довольно большую модель генератора, способную потенциально обрабатывать миллионы изображений, поэтому данных много не бывает.

Для обучения аниме-персонажам приемлемого качества с нуля требуется минимум 5000 изображений. Для таких сложных задач, как «несуществующая кошка» использовалось ~180 тыс. снимков. Судя по многочисленным ошибкам, проблема либо в недостаточности этих данных, либо в сложности генерации кошек.

Вычисление

Для того чтобы обеспечить достаточный размер мини-пакетов, потребуются графические процессоры с > 11 ГБ видеопамяти, например, Nvidia 1080ti или лучше.

Репозиторий StyleGAN предоставляет приблизительные сроки обучения для систем с 1-8 GPU. Сконвертировав их в общее количество часов работы GPU, мы получим следующее:

Предполагаемое время обучения StyleGAN при различных разрешениях изображений и используемых GPU (источник: репозиторий StyleGAN)

Число используемых GPU1024 2512 2256 2[Апрель 2019 г., тарифы REG.RU ]
141 день 4 часа [988 GPU-часов]24 дня 21 час [597 GPU-часов]14 дней 22 часа [358 GPU-часов][₽89к, ₽54к, ₽32к]
221 день 22 часа [1052]13 дней 7 часов [638]9 дней 5 часов [442][105к, 64к, 44к]
411 дней 8 часов [1088]7 дней 0 часов [672]4 дня 21 час [468][131к, 81к, 56к]
86 дней 14 часов [1264]4 дня 10 часов [848]3 дня 8 часов [640][177к,, 119к, 90к]

Подготовка данных

Самая сложная часть запуска StyleGAN — это правильная подготовка набора данных. StyleGAN, в отличие от большинства реализаций GAN (в частности, PyTorch), не поддерживает чтение каталога файлов в качестве входных данных. Она может считывать только свой уникальный формат .tfrecord, в котором каждое изображение хранится в виде необработанных массивов для каждого соответствующего ему разрешения. Таким образом, исходные файлы должны быть совершенно однородными и сконвертированными в формат .tfrecord c помощью специального скрипта dataset_tool.py. Обратите внимание, что после этого они будут занимать примерно в 20 раз больше дискового пространства.

Обратите внимание: набор данных StyleGAN должен состоять из одинаково отформатированных изображений: они могут быть только 512х512 пикселей или только 1024х1024 и т. д. и относиться к одному и тому же цветовому пространству (вы не можете использовать одновременно RGB и градации серого). Тип файлов должен быть таким же, как у модели, которую вы собираетесь (пере)обучать (нельзя переобучить PNG-модель на наборе данных JPG). Кроме того, в файлах не должно быть никаких ошибок, например, неправильной контрольной суммы CRC — их часто игнорируют библиотеки и средства просмотра изображений.

Подготовка лиц

Процесс подготовки лиц:

  1. Скачать необработанные изображения из Danbooru2018.
  2. Извлечь из метаданных JSON Danbooru2018 все ID подмножества изображений, если для этого нужен специальный Danbooru-тэг (например, один символ), с помощью jq и shell-сценариев.
  3. Обрезать лица на изображениях, используя метод lbpcascade_animeface от Nagadomi (обычные методы обнаружения лиц не работают на аниме).
  4. Удалить пустые, монохромные или чёрно-белые файлы; удалить дубликаты.
  5. Конвертировать в JPG.
  6. Уменьшить разрешение до необходимого (512 пикселей) с помощью  waifu2x.
  7. Конвертировать все изображения к разрешению 512х512 и формату sRGB JPG.
  8. Если возможно — улучшить качество данных, проверяя изображение низкого качества вручную, удаляя и фильтруя с помощью предварительно обученной GAN почти полные дубликаты, найденные с помощью findimagedupes.
  9. Преобразовать файлы в формат StyleGAN со скриптом dataset_tool.py.

Цель состоит в том, чтобы превратить это:

Рандомные кадры превращаются...

в это:

В хорошеньких вайфу

Ниже представлены shell-скрипты для подготовки датасета. Альтернативой может быть  использование утилиты danbooru-utility, которая позволяет исследовать набор данных, фильтровать по тегам, оценивать, обнаруживать лица и изменять размеры изображений.

Обрезка

Загрузить датасет Danbooru2018 можно через BitTorrent или rsync. Вы получите тарболл метаданных JSON, распакованный в папку metadata/2* и структуру данных {original,512px}/{0-999}/$ID.{png,jpg,...}.

Идентификаторы можно извлечь из имён файлов напрямую, или же из метаданных:

После установки lbpcascade_animeface можно использовать простой скрипт для обрезки лиц crop.py. Точность изображений Danbooru довольно хорошая: около 90% отличных лиц, 5% некачественных (неразличимых или плохо изображённых) и 5% ошибочных (вместо лиц — руки или другие части тела). Эти недочёты можно исправить, например, увеличив область интереса до 250х250 пикселей.

crop.py:

Этот скрипт обрабатывает только одно входное изображение. Выполнить обрезку фотографий параллельно можно следующим образом:

Здесь мы устанавливаем параметр CUDA_VISIBLE_DEVICES="" — это отключает использование GPU, поскольку для этой задачи он не даёт очевидного ускорения.

Очистка и масштабирование

Удаление ненужных файлов:

Следующий важный шаг — масштабирование изображений с помощью нейросети waifu2x, которая хорошо справляется с двукратным увеличением аниме-кадров. Но она работает довольно медленно (1-10 секунд на изображение), запускается только на GPU и написана в неподдерживаемом в настоящее время DL-фреймворке Torch. Можно попробовать использовать другую  GAN сеть для увеличения разрешения (например, SRGAN, о которой мы писали ранее).

Если вы хотите сэкономить время, можете масштабировать лица с помощью обычного ImageMagick, но их качество будет невысоким.

Использование waifu2x:

Проверка и дополнение данных

На этом этапе можно вручную проверить данные: просмотреть несколько сотен изображений, запустить findimagedupes -t 99% для поиска почти идентичных лиц, или же модифицировать набор с помощью дополнения данных, если вам кажется, что их недостаточно. Зеркальное / горизонтальное отображение выполнять не нужно: эта функция уже встроена в StyleGAN. Можно использовать растягивание, смещение цветов, размытие, резкость, обрезку, изменение яркости и контраста и т. д. Вот пример дополнения данных:

Масштабирование (ещё раз) и преобразование

После дополнения данных неплохо было бы сэкономить место на диске, преобразовав изображения в JPG и снизив качество примерно на 33%. Так можно освободить достаточно много дискового пространства без видимых потерь:

Не забудьте, что модели StyleGAN совместимы только с изображениями того типа, на котором были обучены.

Теперь масштабируем все изображения к размеру 512х512 пикселей с помощью ImageMagick без сохранения пропорций:

Любое ошибочное изображение может привести к сбою процесса импорта, поэтому мы удалим всё, что отличается от JPG 512x512 sRGB:

Наконец, можно преобразовать данные в формат StyleGAN с помощью dataset_tool.py. Настоятельно рекомендуется добавить в этот скрипт вывод имён файлов. Если произойдёт сбой, это поможет определить, какое изображение виновато в нём:

Но если вы проверили изображения ранее, проблем быть не должно. Преобразование выполняется следующим образом:

Поздравляем, самое сложное позади!

Обучение модели

Установка

Предполагается, что у вас присутствует и работает CUDA. Автор проекта использовал ОС Ubuntu Bionic 18.04.2 LTS и версию драйвера Nvidia # 410.104, CUDA 10.1.

Также вам понадобится Python версии 3.6 и выше, TensorFlow и зависимости для StyleGAN:

Конфигурация

StyleGAN не поддерживает опции командной строки, вместо этого необходимо отредактировать train.py и train/training_loop.py:

1. train/training_loop.py

Исходная конфигурация указана в функции training_loop в строке 112.

Ключевыми аргументами являются:

G_smoothing_kimg и D_repeats: влияют на динамику обучения

network_snapshot_ticks: указывает, как часто сохранять скриншоты

resume_run_id: установлен на "latest"

resume_kimg: указывает на финальное значение разрешения генерируемых изображений

Обратите внимание, что многие из этих параметров переопределяются в train.py. Лучше определить их там, иначе вы можете запутаться.

2. train.py (ранее config.py)

Здесь мы устанавливаем число графических процессоров, разрешение изображений, набор данных, скорость обучения, зеркальное отражение или дополнение данных и размер мини-пакетов. Этот файл включает себя настройки, предназначенные для ProGAN — следите за тем, чтобы случайно не запустить ProGAN вместо StyleGAN и не запутаться.

Значения скорости обучения и размера пакетов можно оставить по умолчанию. Но разрешение изображений, набор данных и зеркальное отражение укажите обязательно:

Мы установили разрешение изображений 512 пикселей для набора данных dataset/faces, включили зеркальное отражение и задали заголовок для контрольных точек и логов, который теперь появится в results/ в строке '-faces'.

Если у вас нет 8 графических процессоров, то обязательно измените параметр -preset, указав число доступных GPU. StyleGAN не умеет автоматически определять число GPU и будет пытаться использовать несуществующие графические ядра, что приведёт к аварийному завершению работы. Обратите внимание, что в CUDA используется нулевое индексирование: GPU:0 указывает на первый процессор, GPU:1 на второй и т. д.

Так выглядит сообщение об ошибке:

У автора для 2x1080ti установлено:

Запуск

StyleGAN можно запустить в GNU Screen, который поддерживает несколько оболочек: 1 терминал для запуска StyleGAN, 1 для TensorBoard и 1 для Emacs.

В Emacs можно открыть файлы train.py и train/training_loop.py для справки и быстрого редактирования.

Последний патч для StyleGAN позволяет включить цикл while, чтоб сеть продолжала работу после сбоев, например:

TensorBoard — это визуализатор записанных во время обучения значений, которые можно посмотреть в браузере, например:

TensorBoard может работать в фоновом режиме, но не забывайте обновлять его с каждым новым запуском.

Обучение StyleGAN — это скорее искусство, чем наука. Более подробные советы по настройке и регулировке процесса можно найти на сайте автора проекта.

Так выглядит успешное обучение:

Генерация аниме

А теперь самое интересное — создание образцов!

Для начала поясним значение гиперпараметра 𝜓. Это так называемый «трюк усечения» (“truncation trick”), который используется во время генерации, но не во время обучения. С его помощью можно контролировать разнообразие получаемых изображений. При 𝜓 = 0 разнообразие равно нулю и все лица будут похожи на одно «усреднённое» лицо. При ±0.5 вы получите достаточно широкий диапазон образцов, а при ±1,2 увидите большое разнообразие лиц / стилей, но среди них будет много искажений. Рекомендуется установить значение около ±0.7 — так вы достигните баланса между качеством и разнообразием.

Случайные образцы

В репозитории StyleGAN есть скрипт pretrained_example.py, но он генерирует только одно конкретное лицо. Тем не менее его можно адаптировать для использования локальной модели и генерировать, скажем, 1000 образцов с гиперпараметром 𝜓=0.6 (это даст высококачественные, но не очень разнообразные изображения). Результаты сохранятся в results/example-{0-999}.png:

Видео

Самый простой способ — сделать скриншоты прогресса, сгенерированные по время обучения. Их размер увеличивается по мере повышения разрешения, поэтому следует выполнить сжатие с потерями или преобразование в JPG. Вот пример конвертации изображений с помощью FFmpeg:

Загрузка готовой модели

Можно загрузить готовую модель, обученную на 218794 образцах в течение ~38 GPU-дней. Актуальная версия — от 8 марта 2019 года.

Перенос обучения

Одна из наиболее полезных вещей, которые можно сделать с обученной моделью StyleGAN — использовать её в качестве «стартовой площадки» для более быстрого обучения новой сети на меньшем объёме данных. Например, нашу модель можно переобучить на подмножество аниме-персонажей: рыжеволосых, мужчин, или на одного конкретного героя. Для этого понадобится около 500-5000 новых изображений, но иногда достаточно и 50.

Как же перенести обучение? Всё, что нужно сделать — обработать новый набор данных и просто начать обучение с существующей моделью. Обработайте изображения, как описано выше, а затем отредактируйте training.py, изменив параметр -desc для нового датасета. После этого можно запустить train.py и начать перенос.

Основная проблема состоит в том, что повторный запуск не может начинаться с нулевой итерации: StyleGAN в этом случае игнорирует предварительную модель и заново начинает обучение. Этого легко избежать: просто укажите сразу высокое разрешение. Например, чтобы начать с 512 пикселей, установите resume_kimg=7000 в training_loop.py. Это вынудит StyleGAN загрузить предыдущую модель. Чтобы убедиться, что вы всё сделали правильно, до переноса обучения проверьте первый образец (fakes07000.png или какой-нибудь ещё): он должен соответствовать результатам обучения предварительной модели.

Пример переноса обучения StyleGAN на персонажа Holo из “Spice&Wolf”:

Holo

И ещё один пример: Луиза из “Zero no Tsukaima”:

Она получилась не такой качественной из-за гораздо меньшего размера выборки.

Теперь, когда кому-то понадобится уникальная аниме-аватарка или эксклюзивная подборка портретов любимых героев, не нужно будет прочёсывать весь Интернет. А если вы поклонник манги, то генерация несуществующих вайфу — прекрасная возможность начать рисовать свои комиксы с неповторимыми персонажами. Хотя нейронные сети пока что сильно отстают от человека в плане творческих способностей, но уже сейчас они могут служить хорошим источником вдохновения.

С оригинальной статьёй можно ознакомиться на сайте автора gwern.net.

7 советов для работы с небольшими данными

7 советов для работы с небольшими данными

В современном мире считается, что Big Data — ключ к созданию успешных проектов машинного обучения. Но проблема в том, что...
Read More
Квантовые нейронные сети на процессорах будущего

Квантовые нейронные сети на процессорах будущего

Законы квантовой механики в теории позволяют создать новый тип вычислительных машин, способных решать сверхпроизводительные задачи, недоступные даже самым мощным современным...
Read More
Стэнфордский курс: лекция 7. Обучение нейросетей, часть 2

Стэнфордский курс: лекция 7. Обучение нейросетей, часть 2

В шестой лекции мы начали рассказывать про обучение нейросетей: выяснили, как выбрать функцию активации, подготавливать данные, настраивать параметры и следить...
Read More
Нейросеть распознаёт узор вязания по фото

Нейросеть распознаёт узор вязания по фото

Автоматизированным производством сегодня уже никого не удивишь. Но мы попробуем. Один из наиболее необычных примеров автоматических устройств — вязальные машины,...
Read More
Бариста, учитель и работник типографии: кем были сотрудники REG.RU до того, как стали айтишниками

Бариста, учитель и работник типографии: кем были сотрудники REG.RU до того, как стали айтишниками

Сегодня, 30 сентября, День Интернета в России. В честь этой даты мы расскажем семь историй о том, как сотрудники REG.RU...
Read More
Чек-лист, который заряжен на защиту домена

Чек-лист, который заряжен на защиту домена

Время от времени мы сталкиваемся со случаями, когда мошенники уводят домены наших клиентов. Происходит это по самым разным причинам: от...
Read More
Методы распознавания радужной оболочки глаз. Часть 1

Методы распознавания радужной оболочки глаз. Часть 1

Не так давно идентификация людей по радужной оболочке глаз казалась фантастической технологией, использующейся только для защиты суперсекретных военных и правительственных...
Read More
Стэнфордский курс: лекция 6. Обучение нейросетей, часть 1

Стэнфордский курс: лекция 6. Обучение нейросетей, часть 1

В прошлый раз мы обсудили историю возникновения свёрточных архитектур, а также узнали об их устройстве и широких возможностях применения. В...
Read More
Три слова, которые поймут только айтишники

Три слова, которые поймут только айтишники

Если вы не разработчик, но работаете в IT-компании, или в вашем окружении есть программисты, то, скорее всего, часто слышите странные...
Read More
Customer development: почему при выборе идеи нужно учитывать мнение клиентов

Customer development: почему при выборе идеи нужно учитывать мнение клиентов

Вместе с менеджером по продуктам REG.RU Никитой Атучиным разбираем, почему MVP — не всегда хорошее решение для старта бизнеса. Если вы...
Read More