Несколько месяцев назад я писал статью про тихую революцию в ComputerVision. Про трансформеры. Эта статья про другую революцию в CV. Уже не такую тихую (статьи тут куда более известные). В статье я поговорю о StyleGan и их вариациях. Это лишь часть большого мира GAN'ов. Зато очень интересная.
В последний год-полтора появилось много различных способов управлять GAN-сетями. Качество многих сгенерированных объектов уже не отличается от реальности. Куда это придет? Попробуем поговорить об этом.
Сразу предупрежу, что я не эксперт именно в GAN’ах. Я почти 15 лет занимаюсь ComputerVision, но GAN это менее десяти процентов задач, и лишь последние годы. Так что возможно будут какие-то мелкие баги/что-то не знаю.
И, если вдруг кому-то удобнее. Вся эта статья есть в формате видео на Youtube.
Два слова про GAN
Буквально пару слов о том, что такое GAN:
Генеративно-состязательная сеть (Generative adversarial network, GAN) — алгоритм машинного обучения без учителя, построенный на комбинации из двух нейронных сетей, одна из которых генерирует образцы, а другая старается отличить правильные («подлинные») образцы от неправильных. Генеративно-состязательную сеть описал Ян Гудфеллоу из компании Google в 2014 году.
Использование этой техники позволяет в частности генерировать фотографии, которые человеческим глазом воспринимаются как натуральные изображения.
(c) Wikipedia
А почитать подробнее можно тут, тут и тут.
SlyleGan и почему именно он?
Оригинальный SlyleGan и его апдейт SlyleGan2 доступен уже несколько лет. Вы все видели эти "фотографии":
![Вот тут можно нагенерить новые лица - https://thispersondoesnotexist.com/ Вот тут можно нагенерить новые лица - https://thispersondoesnotexist.com/](https://habrastorage.org/getpro/habr/upload_files/0a2/a26/c08/0a2a26c08685cf7de087f0ffdb227c59.png)
Но это не фото. Это сгенерированные лица. Отличить их от настоящих в целом можно. Но нужно внимательно вглядываться. Смотрите на мочки ушей, на блики в глазах, на отдельные волоски, на фон, и.т.д.
Сама идея StyleGan - не нова. Как и в любом GAN берется некоторый латентный вектор, который обучается дискриминатором.
Что такое "латентный вектор"? Это набор характеристик, описывающих человека как набор признаков. Например “белые волосы, мужчина, черная борода, 15 лет”, и.т.д. При этом, вектор может не иметь явной визуальной репрезентации.
Архитектура получается примерно такой (слева классика, справа первый StyleGAN):
![StyleGAN - https://arxiv.org/pdf/1812.04948.pdf StyleGAN2 - https://arxiv.org/pdf/1912.04958.pdf StyleGAN - https://arxiv.org/pdf/1812.04948.pdf StyleGAN2 - https://arxiv.org/pdf/1912.04958.pdf](https://habrastorage.org/getpro/habr/upload_files/ba7/20c/ef0/ba720cef0953b4c789277c92b2beec87.png)
Основное отличие от существовавших на тот момент подходов - регуляризация за счет шума в момент обучения + использование стиля на каждом сверточном слое, пропущенного через Mapping Network. Почитать подробнее можно тут и тут. Или посмотреть это видео.
Ключевой элемент в StyleGAN - латентный вектор. На вход сеть получает некоторый короткий код, по которому сеть генерит лицо. А что, если этот вектор начать изменять?
![Изменяя стили самых грубых уровней (тех которые имеют низкое разрешение) Изменяя стили самых грубых уровней (тех которые имеют низкое разрешение)](https://habrastorage.org/getpro/habr/upload_files/8bd/e16/007/8bde16007178fb1a33f68fdae304e895.gif)
![Фиксируя часть параметров латентного вектора Фиксируя часть параметров латентного вектора](https://habrastorage.org/getpro/habr/upload_files/352/bc2/b89/352bc2b890be6d87b5b12573dd196062.gif)
В втором StyleGan чуть-чуть поменяли нормализацию в сети. По сути это единственное серьезное отличие от первого (вот тут можно почитать подробнее)
Рассказывать про StyleGAN можно очень долго, но я не хотел бы углубляться, мой рассказ про другое (ссылок чтобы углубиться я дал достаточно). Ключевой поинт моего рассказа: мы можем задать лицо набором параметров, и потом работать с этими параметрами вместо лица (а как я расскажу чуть ниже).
Производительность
Но сперва, прежде чем перейдем к интересной части - поговорим о больном. С производительностью все плохо. Не так плохо как с некоторыми трансформерами, но все же:
![время на тренировку разных форматов сети - https://github.com/NVlabs/stylegan2 время на тренировку разных форматов сети - https://github.com/NVlabs/stylegan2](https://habrastorage.org/getpro/habr/upload_files/c52/85b/381/c5285b3817874622f97cbfe880e71306.png)
Чтобы натренировать StyleGAN генерировать картинки лиц в хорошем разрешении - надо много времени. Для хорошего качества нужна неделя кластера из 8 TeslaV100 (140 т.р. на не самом дорогом https://immers.cloud/gpu/, примерно 290 т.р. на Амазоне https://aws.amazon.com/ru/ec2/instance-types/p3/ )
На 3090 будет подешевле и побыстрее, но пойди найди свободный кластер.
Конечно, появились подходы где это чуть лучше оптимизировано, но не сильно.
И все же, почему StyleGAN?
Как я сказал выше - у StyleGAN есть возможность манипулировать входным вектором. Самый базовый результат этого факта - можно редактировать изображения, сохраняя их реалистичность.
Но позвольте... Ведь StyleGAN генерирует только несуществующие картинки? Как я применю его к реальным лицам?
![](https://habrastorage.org/getpro/habr/upload_files/79e/5c4/ff6/79e5c4ff6825da74a8714009aac700d2.jpeg)
Пространство правильно обученного StyleGAN покрывает почти все пространство лиц. И наша задача - лишь найти код, который максимально похож на искомое лицо. Как это сделать? Наиболее наглядное описание, на мой взгляд, вот в этом видео. Если в двух словах:
![Тренируем сетку по фотографии определять код Тренируем сетку по фотографии определять код](https://habrastorage.org/getpro/habr/upload_files/7b2/177/0e1/7b21770e125324e95ba1a7d427fb5d1c.png)
![Делаем локальный спуск с найденной точки чтобы найти максимально похожее лицо первоначальной точки Делаем локальный спуск с найденной точки чтобы найти максимально похожее лицо первоначальной точки](https://habrastorage.org/getpro/habr/upload_files/4ad/f91/ed7/4adf91ed70f1554fb244b4cc926fb8c6.png)
Если хотите поиграться - вот оригинальный репозиторий для stylegan энкодера. А вот google Colab с готовой реализацией от автора видео выше (там надо только пару багов пофиксить). Получается как-то так:
![Слева - я снятый с вебки. Справа- моя реконструкция. Слева - я снятый с вебки. Справа- моя реконструкция.](https://habrastorage.org/getpro/habr/upload_files/ce6/a07/f79/ce6a07f790eb7cdd0c96047be2f7b9af.png)
![А вот так, если вставить лицо в изначальное окружение (волосы тоже оригинальные взяты) А вот так, если вставить лицо в изначальное окружение (волосы тоже оригинальные взяты)](https://habrastorage.org/getpro/habr/upload_files/478/a4a/4be/478a4a4befd26320e8b62b9874664c93.png)
Чуть подробнее про энкодинг
В целом, процесс энкодинга может выглядеть по разному. Есть много алгоритмов поиска и дальнейшей навигации в пространстве StyleGAN. Или статей, где эта задача решается с другой стороны(гит).
Поиск у разных алгоритмов может выглядеть так:
![](https://habrastorage.org/getpro/habr/upload_files/22a/fbd/808/22afbd808bbb7e7c575a597c2478ade3.gif)
Ниже будет несколько вариантов энкодеров (у разных статей разные). Но, помните, что всегда можно найти лучшую проекцию.
Если хотите почитать про разные энкодинги подробнее, то можно, например, тут. Там есть ещё такие классные примеры как натянуть лицо на платье:
![](https://habrastorage.org/getpro/habr/upload_files/9b3/060/18a/9b306018ad2bbeb7b32f8162acf34fba.gif)
Редактирование
В видео выше можно посмотреть простые способы редактирования. Например:
Возраст
Пол
Улыбка
Поза
и.т.д....
!["смена пола в латентном векторе" "смена пола в латентном векторе"](https://habrastorage.org/getpro/habr/upload_files/fc1/1b0/205/fc11b0205ed1d5f4325276579fc534c5.png)
Опять же, ссылку на статью с хорошим тюнингом я уже давал. Хотя там уже немного не чистый StyleGAN, в статье StyleGAN лишь помогает обучить дополнительную сеть для манипуляции признаками:
![Пример изменения признаков Пример изменения признаков](https://habrastorage.org/getpro/habr/upload_files/74f/172/66b/74f17266bc18b4dd19c4af0ca50dc98c.jpeg)
Композиция
Но есть много других интересных подходов к редактированию. Например свежая статья "Latent Composition":
![](https://habrastorage.org/getpro/habr/upload_files/35e/ca2/289/35eca22890ba8a817ed7e318d2efe661.jpeg)
Конечно, тут уже не достаточно "покрутить латентный код" или "усреднить два вектора". Используется хитрый способ чтобы вычислить значимую часть латентного вектора, определяющую выделенную область. У ребят есть Colab с примером. Энкодер (алгоритм нахождения максимально похожего StyleGAN лица) там работает чуть похуже, чем тот, что я использовал выше:
![Слева - моя фотка, справа - найденный в пространстве StyleGAN Слева - моя фотка, справа - найденный в пространстве StyleGAN](https://habrastorage.org/getpro/habr/upload_files/2e7/2b9/85d/2e72b985df76c7ea48fdb50044a32679.png)
Но общую идею вполне можно запустить и протестить:
![Теперь у "меня" появилась "обворожительная" улыбка Байдена Теперь у "меня" появилась "обворожительная" улыбка Байдена](https://habrastorage.org/getpro/habr/upload_files/c5e/44e/56a/c5e44e56a3055f10937347f1e61600ee.png)
Удаление деталей
Аналогичным образом можно удалять лишние детали, стирать очки, и.т.д.:
![](https://habrastorage.org/getpro/habr/upload_files/146/936/078/146936078639a46aacc8220463c9884b.png)
И таких статей достаточно много:
Co Mod Gan - у ребят есть демо и сорсы
BRGM - восстановление половины изображения по второй половине
В целом задача называется inpainting. К ней есть много подходов, и StyleGAN - лишь часть из них.
Повороты
Не смотря на то что можно попробовать поворачивать лицо через латентную репрезентацию, есть много статей где результат лучше (1,2):
![Хотя, конечно, косяки видны Хотя, конечно, косяки видны](https://habrastorage.org/getpro/habr/upload_files/147/259/279/14725927942feccb82248afe75213ffd.png)
Текстовое описание
Пол года назад Google выпустил шикарную сеть CLIP (вот тут я делал более подробный обзор). Она была про взаимную привязку пространства эмбединга для текста и пространства эмбединга для изображения:
![](https://habrastorage.org/getpro/habr/upload_files/90b/d4a/ec9/90bd4aec97ed16818f2b6dbf04e66064.png)
Основной смысл сети был в том, чтобы понимать какое описание подходит к какой картинке (дополнительный плюс этой работы - стабильность работы в разных доменах).
При этом, StyleGan - это такой же эмбединг, который выполняет роль описания изображения. Почему бы его не привязать у тексту? И действительно, есть очень интересная работа StyleCLIP, в которой можно изменять изображения вбивая текст.
![https://github.com/orpatashnik/StyleCLIP https://github.com/orpatashnik/StyleCLIP](https://habrastorage.org/getpro/habr/upload_files/647/b58/da8/647b58da871de00195091017cde1b57c.gif)
У авторов есть интересный колаб где можно поэкспериментировать. У них тоже не очень хороший энкодинг в пространство StyleGAN:
![После энкодера становлюсь на себя не похож! После энкодера становлюсь на себя не похож!](https://habrastorage.org/getpro/habr/upload_files/b1a/6aa/074/b1a6aa0747a3acd78138fe6f209f0af6.jpg)
Зато неплохо потом может добавлять разные детали (очки например), менять эмоции и прическу:
![Афро! Афро!](https://habrastorage.org/getpro/habr/upload_files/f61/c1b/836/f61c1b8363511e248a969de9d01df359.jpg)
![Не знал что могу так широко варежку растянуть Не знал что могу так широко варежку растянуть](https://habrastorage.org/getpro/habr/upload_files/26d/bc1/f0a/26dbc1f0ae43312f00f2fe460a0879ae.jpg)
Другой домен
Другим интересным подходом можно назвать перенос из одного домена в другой. Под доменом тут подразумевается "стиль"/"способ отрисовки лица":
![Да-да, Джеки Чан это тоже "домен";) Да-да, Джеки Чан это тоже "домен";)](https://habrastorage.org/getpro/habr/upload_files/174/64e/e5a/17464ee5aa6e5866c69f27ea44f68a3f.png)
К статье, к сожалению, нет исходников. Зато есть исходники к другой статье, которая переносит в домен "аниме".
![](https://habrastorage.org/getpro/habr/upload_files/702/a41/4cd/702a414cdeb4a00ba500d6d8e2af1cc2.png)
Правда она уже не про StyleGAN. Но тут, скорее про идею:) Вдруг захотите.
![](https://habrastorage.org/getpro/habr/upload_files/495/074/77e/49507477e7daa5ae51646a3b2185c314.gif)
ПОЧЕМУ ТОЛЬКО ЛИЦА?!
А вот тут мы немножко прервемся и поговорим о теории. Вы не задумывались над вопросом почему большая часть StyleGAN работ про лица?
Если что, многие не задумываются;) Регулярно приходят и предложением генерировать одежды, дизайны, и.т.д. Но не все так просто.
Подумаем как можно математически представить лицо. Удивительно, но лицо - это достаточно простой объект. Ещё лет 20 назад начали появляться работы на тему 3DMM (чуть более свежие - 1,2), где оценивается базис, по которому раскладывается лицо. И компонентов у такого базиса обычно 100-300, в зависимости от работы и подробности эмоций.
В статьях по Face Recognition для распознавания лица обычно хватает 128, а иногда и 64 компонента для получения вероятности ложного совпадения на уровне 10^-5.
Это значит что 99% лиц и эмоций можно описать всего сотней-другой параметров. Это не много. При работе с лицом, StyleGAN работает, по сути, как алгоритм компрессии/декомпрессии (при этом пространство самого StyleGAN шире, там в зависимости от разрешения 512*(16±2) значений латентного вектора). Нужно определить всего сотню параметров лица - и этого будет достаточно, чтобы сгенерировать лицо.
А теперь внимание. Чем больше параметров - тем сложнее работать сети. Ниже я приведу много примеров из других областей работы. И, чем сложнее объект - тем хуже будет работать StyleGAN.
Посмотрим на варианты
В оригинальном StyleGAN можно посмотреть обученные сетки с генерацией:
Автомобилей
Котов
Лошадей
Церквей
При этом качество 1024*1024 есть только для лиц. Все остальное хуже, что уже намекает. Посмотрим как это выглядит:
Котики. Котики, наверное, один из самых хорошо работающих объектов. Особенно если там нет лап, или сидят они в стандартной позе:
![У третьего котика что-то не то с прикусом. У первого странные блики. У третьего котика что-то не то с прикусом. У первого странные блики.](https://habrastorage.org/getpro/habr/upload_files/a54/c86/382/a54c86382ff854ead8fb9c6a105b1ca2.png)
Чем меньше лапок, чем меньше движений - тем лучше все работает. Котики, вообще хороший материал для StyleGAN. Вот работа, аналогичная латентной композиции, где можно скрещивать котов.
Машины. Машины с одной стороны хорошо определены. Пусть всего несколько тысяч основных моделей + пару сотен вариантов параметризации. Но на практике начинает вылезать слишком много проблем:
![](https://habrastorage.org/getpro/habr/upload_files/54e/01e/27e/54e01e27e18c08ad6fe21a1fde03e8d1.jpg)
Посмотрите на геометрию, особенно на краях. Номера не читаемы либо не логичны. Отражения не соответствуют фону, и.т.д. С поворотами, фоном, колесами параметров становится уже не так мало. При этом, конечно, можно найти хорошие примеры. И да, если что, то в Latent Composition можно вполне дотюнинговать машинку.
Лошади. Вспомним правило: "Чем больше параметров - тем хуже работает StyleGAN". А лошадь, это уже и геометрия, и обвес, и всадник. И тут - все хуже и хуже:
![Проблемы генерации оставляем в качестве домашнего задания Проблемы генерации оставляем в качестве домашнего задания](https://habrastorage.org/getpro/habr/upload_files/432/e65/642/432e65642066d3fd2fd541acd11be9ba.png)
Церкви. Можете ли вы параметризовать дома? Вряд ли. И у сети начинаются галлюцинации:
![Это НЛО над Ватиканом? Это НЛО над Ватиканом?](https://habrastorage.org/getpro/habr/upload_files/0c4/6ff/2e3/0c46ff2e33df20b72ee28f452ba00256.png)
Глаза. Хороший пример где простая картинка параметризуется. Статей нет, но, скорее всего, оно тоже на StyleGAN:
![](https://habrastorage.org/getpro/habr/upload_files/e50/5da/f9a/e505daf9a44e5165541824ab2c5b04ff.gif)
Вот тут все более красиво и под музыку.
Одежда
Как вы понимаете, создавать глаза, котиков, лошадок и церкви - плохой бизнес кейс. Всем нужно модифицировать лица. Всем нужно делать какой-то дизайн. Все хотят рисовать одежду. А с одеждой засада. Параметров то уже много. Но ведь бизнес. И люди стараются находить корнеркейсы где все работает. Но, по порядку.
Самая популярная задача для генерации одежды - Virtual Try On. Даже датасет неплохой есть. К ней есть много очень разных подходов, но мы будем говорить только про GAN-подходы. В лоб все работает не очень хорошо:
![https://towardsdatascience.com/this-dress-doesnt-exist-90002800f683 https://towardsdatascience.com/this-dress-doesnt-exist-90002800f683](https://habrastorage.org/getpro/habr/upload_files/28b/60a/7e7/28b60a7e7bd6167fce2f83484cf29220.png)
Конечно, автор тренирует всего 4 дня на одной GPU.
Больше GPU-шек (4 штуки на 4 недели) дают более интересный, но все равно, далекий от идеального результат:
![Проблемы на руках, лицах, точках где перегибы и сложная физика Проблемы на руках, лицах, точках где перегибы и сложная физика](https://habrastorage.org/getpro/habr/upload_files/321/ba9/3c3/321ba93c30eae9955a07d090120cf325.png)
Зато итоговый результат позволяет производить манипуляции с изображением (опять же, добавить к обученному StyleGan conditional составляющую):
![](https://habrastorage.org/getpro/habr/upload_files/838/eaa/cf9/838eaacf9b94cf701b7a3e5085208594.png)
В целом, итоговый результат тоже далек от идеала. Но работает (n.b. - сорсов нет, так что доказательств тоже):
![](https://habrastorage.org/getpro/habr/upload_files/a7c/d73/fcd/a7cd73fcd116778ac87af82bf7f68e40.png)
Две статьи выше, конечно, это 2019-2020 годы. С тех пор появился StyleGAN-2, и качество подросло. При почти той же загрузке (8 Tesla V100 на 12 дней) При правильной постановке задачи (одна и та же поза, отрубленная голова, руки не в карманах/без пальцев) можно получить такой результат:
![](https://habrastorage.org/getpro/habr/upload_files/a62/949/801/a629498016992089e39b23f8a04db719.gif)
![](https://habrastorage.org/getpro/habr/upload_files/dcc/e9b/7a5/dcce9b7a590434a9cda2c0d91d9f0a80.png)
Опять же, в данном случае нет исходников, так что гарантировать что все работает/что все это не CherryPicking/не кастомный подход - нельзя.
Модели. Вот ещё попытка создать работающий генератор людей + одежду. Как вы видите - даже не смотря на одинаковые и повторяющиеся позы, не смотря на минимум одежды - видно много проблем и огрехов. Хотя впечатление тоже неплохое.
![](https://habrastorage.org/getpro/habr/upload_files/e0c/a03/880/e0ca0388079ee6bba24aa67372a3084e.gif)
Шмот. А вот неплохая статья где автор рассказывает как обучал сетки создания обуви и одежды:
![](https://habrastorage.org/getpro/habr/upload_files/bd8/f74/234/bd8f74234e9d0b3824bb23f667d0b80c.gif)
Опять же, максимальное качество не сказать что супер - но уже неплохо (за счет того что все развернуто в одну проекцию).
А что с видео?
Сам по себе StyleGAN не нацелен на генерацию видео. И большая часть работ это какие-то хаки, нацеленные на то чтобы получить видео. Например вот тут люди используют изменение рта для анимации персонажей. Понятно, что штука очень узкоспециализированная. И в общем случае StyleGAN не решает таких вопросов.
![](https://habrastorage.org/getpro/habr/upload_files/2b1/ef7/2af/2b1ef72afb197e0360e78572615bc0a3.gif)
Есть другие подходы стремящееся к видео. Например вот в этой работе генерируется бесконечная панорама. По сути добавили информацию про сдвиг и старую картинку:
![](https://habrastorage.org/getpro/habr/upload_files/c92/51c/3ae/c9251c3ae7aeb6e49d21dfe8d53e270b.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/b34/b34/099/b34b34099dd1dc9b15cf70bbf762f70f.gif)
Переходя к следующему пункту, про то какие сети есть кроме StyleGAN - вот новая сетка от NVIDIA, которая частично решает вопрос плавной и аккуратной навигации в латентном пространстве:
![Слева - оригинальный StyleGan и попытка навигации в этом пространстве. Слева - оригинальный StyleGan и попытка навигации в этом пространстве.](https://habrastorage.org/getpro/habr/upload_files/4a1/a86/dc9/4a1a86dc966a16e013264bf4516f16d2.gif)
А что дальше?
StyleGAN и StyleGAN2 - появились уже давно. Второй StyleGAN ещё 2019 года. И, несмотря на огромную популярность - понятно что нужно что-то новое. И сейчас появляется множество других идей и подходов которые может быть когда-нибудь выстрелят. Может быть это будет Alias GAN, который выпустила NVIDIA (про который я говорил в прошлом пункте). Может быть это будет какая-нибудь модификация на трансформерах, например такая:
![Трансформеры везде... Трансформеры везде...](https://habrastorage.org/getpro/habr/upload_files/ab5/f12/56f/ab5f1256f7892935dfdc561d74351308.png)
А может быть это будут диффузионные модели, которыми занимаются Google Brain, Open Ai и много кто ещё.
Выводы
За последние пару лет в области GAN поменялось очень многое. Они становятся предсказуемыми , с ними можно работать, качество все лучше и лучше. Да, пока места где все работает очень ограничены. Да, обучать очень долго и дорого. Но это разрешимые проблемы. Так что ждем чего-нибудь интересного:)
P.S.
Если нахожу что-то новое и интересное - стараюсь рассказывать у себя на канале (tg, vk). На хабре стараюсь писать уже какие-то сформированные мысли, когда материала на статью накопилось. И да, все что тут расказано есть в формате видео.