Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Мы рассказали про выпускные проекты выпускников семестровых курсов по мобильной разработке Технопарка (МГТУ им. Баумана) (предыдущие публикации: «Разработка приложений на iOS», «Разработка приложений на Android»). Сегодня делимся интересными проектами студентов второго семестра Техносферы — совместного с МГУ образовательного проекта с годовой программой обучения в области анализа и работы с большими объемами данных. Студенты проходят курсы по машинному обучению, инфопоиску, нейронным сетям и другим дисциплинам. В обучении применён проектный метод, поэтому итоги семестра мы подводим на защитах студенческих проектов.
В образовательном процессе большую роль играют эксперименты. Студенческие проекты без них не обходятся: ребята пробуют разные подходы, методы, архитектуры, инструменты. Часто после эксперимента студенты отказываются от выбора технологии и алгоритма в пользу нового подхода. Это большая часть опыта и обучения. Ниже мы расскажем о таких этапах в разработке двух студенческих проектах.
- Проект Movie posters GAN/embed.
- Проект Cyrclegan on cartoon series.
CycleGAN on cartoon series
Авторы этого проекта решили использовать технику CycleGAN для перевода картинок из одного анимационного фильма в другой. GAN (Generative adversarial network) — методика обучения моделей image-to-image. Обучаются две нейронные сети: дискриминатор и генератор, которые находятся в соперничающих отношениях. Генератор пытается увеличить ошибку классификации, дискриминатор — уменьшить. А CycleGAN — методика передачи обучения imag-to-image в режиме без учителя.
Допустим, есть два домена картинок — A и В. Создаются два генератора и два дискриминатора: gen_A2B, gen_B2A, disc_A, disc_B. Нужно, чтобы по картинке из A генератор gen_A2B создавал эту же картинку, но так, чтобы она была в домене B. Для этого вводят cycle consistency loss:
l1loss(gen_b2a(gen_a2b(a)), a)
В этом случае генератор будет генерировать картинки, которые обманывают дискриминатор, но при этом сохраняют изначальный контент.
Архитектура решения:
Генератор:
Resnet-блоки позволяют запоминать изначальную картинку. Также использовались instance normalization вместо batch normalization, потому что последний добавляет шумы из других картинок.
Дискриминатор:
Готового набора изображений не нашлось, поэтому выбрали картинки из ключевых кадров анимешных полнометражек: для А использовали «Унесенные призраками» Хаяо Миядзаки, а для B — «Твоё имя» Макото Синкая. Поскольку CycleGAN не очень подходят для кардинальных изменений (например, формы), авторы взяли оба домена из аниме.
В качестве функции потерь использовали сначала LSGAN, а потом WGAN GP, потому что LSGAN в процессе обучения создавал странные артефакты и терял цвета.
Для обучения использовали предобученную на horse2zebra модель (веса найдены лишь для генераторов). Она уже имеет понимание, что ей надо сохранять содержимое картинки, поэтому авторы в самом начале получили неплохой autoencoder, который оставалось только научить обманывать дискриминатор.
В самом начале обучения выставляли большое значение для cycle loss identity loss и gradient clipping, но когда прошло достаточно эпох, решили понемногу уменьшать эти значения, чтобы генератор стал чуть больше пытаться обманывать дискриминатор.
Также пытались в качестве дискриминатора использовать большие предобученные сети (VGG, RESNET, Inception), но они очень большие и обучение сильно замедлялось.
В результате работе удалось достичь того, что, стиль переносится близко к оригиналу, с сохранением общей цветовой гаммы (сверху оригиналы, снизу сгенерированные картинки):
Код проекта: https://github.com/IlyasKharunov/Cyclegan_project
Команда проекта: Ильяс Харунов, Олег Вербин.
Видео с защитой проекта.
Movie posters GAN/embed
Следующий проект интересен как раз с точки зрения пути, который проделал студент. В отличие от других студенческих проектов, Дмитрий выполнял работу самостоятельно. Такой путь оказался сложнее, чем у других, но результаты и выводы интересные.
Автор решил сделать сеть, которая генерировала бы постеры к фильмам по заданным жанрам. Например, чтобы постеры для фильмов ужасов были в тёмных тонах, для комедий — в светлых, и тому подобное.
С сайта IMDB автор взял 41 тыс. постеров для фильмов в двадцати жанрах за период 1970-2020. Позднее выяснилось, что для некоторых жанров изображений слишком мало, поэтому Дмитрий сбалансировал набор по жанрам, и в итоге осталось 32 тыс. постеров.
Затем для безжанрового генерирования картинок студент применил нейросеть с архитектурой DCGAN. Она работала с постерами размера 64x128.
Результаты получились криповатые:
Затем автор попробовал архитектуру CVAE+DCGAN:
А также VAE без GAN и GAN с классификатором. Пришел к заключению, что собранный набор постеров слишком сложен для этих методов. Тогда автор применил conditional GAN: это то же самое, что и DCGAN, только жанры теперь подавались и в генератор, и в дискриминатор. Латентный вектор z был взят длиной 100, жанры в hot-формате длиной 20, в результате получился вектор длиной 120. К ответу был добавлен жанр и выполнялся дополнительный прогон по одному линейному слою.
Удалось добиться такого результата:
Как видите, студенту было интересно пробовать различные подходы, результаты получились интересными. Авто получил много нового опыта, пришел к выводу, что для реализации такой идеи необходимо сразу брать более сложную нейронную сеть, например, StyleGAN.
Процесс обучения сети:
Команда проекта: Дмитрий Питеркин.
Видео с защитой проекта.
В скором времени мы расскажем и о самых интересных дипломных проектах по разработке на C++ и Go, фронтенд-разработке и созданию интерфейсов. Подробнее о наших образовательных проектах вы можете почитать по этой ссылке. И почаще заходите на канал Технострим, там регулярно появляются новые обучающие видео о программировании, разработке и других дисциплинах.