Недавно мы написали на Хабр колонку о том, как выпустили собственную онлайн-игрушку. Одной из фишек, над которой мы серьезно заморочились, стала AI-генерация аватарок для своего персонажа «на лету» по фотографии (пока работает в прототипе и частью игры не является). При этом технология сама по себе интересна и может быть применима далеко не только у нас. Как обещали, рассказываем про неё подробнее и даем пощупать прототип вживую!
Под катом также можно найти: почему сделали выбор в пользу нетипичной системы обучения ИИ — без разметки данных, и почему считаем это научной инновацией; наши факапы при создании AI-аватаров, которые не нужно повторять; как и где сегодня используется Domain Adaptation.
![image](https://habrastorage.org/webt/l_/99/co/l_99co05f8rjk18vz4jstw7mv-g.jpeg)
Если нет времени читать пост
Переходим по ссылке, чтобы посмотреть на работу ИИ прямо сейчас.
Обратите внимание:
1. Конвертер отрабатывает не быстро, потому запасайтесь терпением, используются нон-продакшен мощности.
2. Система обучалась только на мужском поле, так что из женских фотографий у вас выйдут мужчины, вероятно женоподобные. Портретного сходства ожидать не стоит, т.к. число используемых элементов заведомо ограничено, об этом мы ещё расскажем ниже.
Откуда пришла идея создать AI-аватары?
Возникла она не на ровном месте. Работа над машинным обучением в uKit Group идет на протяжении нескольких лет. Так, проект WebScore AI, который в режиме реального времени оценивает визуальную привлекательность сайта, около года назад был открыт для всех желающих и успешно используется для внутренних целей компании.
Применение нейронных сетей в геймдеве — тема, периодически приобретающая немалый хайп. Вспомним No Man's Sky или RimWorld, которые получили свою порцию внимания игрового, да и не только сообщества за счет полностью сгенеренной вселенной, обладающей чуть ли не бесконечной вариативностью со слов самих авторов. Правда в реальности генерация миров была процедурная, а потому к нейросетям это не имеет никакого отношения. Однако тренд тут очевиден — рынок к этому готов и ждет, потирая руки!
Мы подумали, что возможность загрузить в игру свое фото и тут же получить персональный, максимально похожий на тебя аватар, которого нет больше ни у кого — это прикольно и может стать интересной завлекающей фишкой. Кроме того, технология явно может найти свое применение и за пределами игры.
Стоит заметить, что схожесть персонажа с реальным человеком в Web Tycoon будет относительной. Это осознанный шаг, ведь собирать аватары мы будем из нарисованных нашими дизайнерами элементов. И на это есть сразу несколько причин. Во-первых, на выходе мы хотим получить игровые аватары в стилистике игры, сохраняя полюбившийся многим флэт. Во-вторых, мы конечно же перестраховываемся, поскольку это позволяет всегда получать портретное изображение вне зависимости от того, что загрузил пользователь.
![image](https://habrastorage.org/webt/mx/qd/zv/mxqdzvnlqj9cag-di5sornoqmdy.png)
Ведь не каждый захочет увидеть среди соперников реалистичный огурец.
Обучение моделей без размеченных данных
Такой подход к machine learning можно назвать инновационным, ведь по сути ИИ обучается вообще без исходных размеченных данных. За счет чего же это происходит? Залогом успеха является наличие тулзы для генерации синтетических данных. Опережая возможные вопросы: дать свою мы не можем.
Почему решили обучать наш ИИ именно так? Разметка данных — это монотонный и очень объемный труд асессоров. А если дизайнеры вдруг решат добавить в игру, к примеру, третий вид очков (на момент написании системы их было два), то нужно будет размечать всё заново, ведь каждый размеченный ранее пример теперь становится потенциально не оптимальным.
Кроме того, в нашем случае стоило учитывать ещё и такой момент как субъективность: если дать 10 людям собрать для одной фотографии по аватарке, на выходе мы получим 10 разных аватарок. Мы проверяли.
Исходное фото:
![image](https://habrastorage.org/webt/dx/no/ci/dxnociumngnvsmjvbcexuwbdmdm.png)
И результаты от двух разных дизайнеров нашей компании:
![image](https://habrastorage.org/webt/p1/wl/nk/p1wlnkivljc0frnkjstwncrk1uy.png)
Человек vs Машина
Обучение давалось непросто. Сначала наш ИИ капитулировал по всем параметрам:
![image](https://habrastorage.org/webt/5c/m3/hq/5cm3hqtrmgzjhfz8pkex4a51vf4.png)
Если кто-то вдруг не понял, то исходное фото здесь то же самое. Мешки под глазами ИИ превращает в солнцезащитные очки. Гусарские усики — в подарок. Настоящие трудоголики могут расценить это как фичу, а не баг.
Далее ещё несколько показательных результатов.
![image](https://habrastorage.org/webt/h9/hv/mp/h9hvmpqsgt_xeijf7zp4al1wxmk.png)
![image](https://habrastorage.org/webt/cb/ih/jt/cbihjtqkihmnjlgsxr6dc9frs_u.png)
Очки просто так уже не добавляет и может даже приодеть! С передачей цвета есть определенные проблемы.
Непосредственно о процессе разработки
В качестве отправной точки мы взяли несколько готовых Style Transfer решений, но от них быстро пришлось отказаться, поскольку в чистом виде они нам не подошли. Мы также пробовали использовать генеративные модели сами по себе, но быстро уперлись в то, что большинство попадавшихся нам решений либо не имели примеров реализации, либо не давали результата.
В итоге первой удачной генеративной моделью стал CycleGAN, который мы взяли за основу, допиливая под свои нужды. К стандартному CycleGAN’у на подмогу был призван Perceptual Loss. Это очень заметно добавило красивости получаемым в итоге изображениям.
Ниже можно увидеть CycleGAN в действии:
![image](https://habrastorage.org/webt/zl/yr/4c/zlyr4cwdqut7oiqrihq_rvghazu.gif)
Или другой пример, понятный и знакомый всем, кто хоть раз юзал приложение Prisma:
![image](https://habrastorage.org/webt/s_/2g/0e/s_2g0enplniq7gj6vo9cj21dwyu.jpeg)
Основная сложность традиционно заключается в том, чтобы заставить генеративную модель нормально обучаться. У всего семейства таких моделей есть масса довольно характерных болячек, которые в последние годы все пытаются решать: долгое время обучения, mode collapse, чувствительность к инициализации.
Были и чисто инженерные проблемы, с которыми, по идее, должны сталкиваться многие, но почему-то мало кто об этом пишет. Например, нам нужно было делать быструю параллельную подгрузку данных с аугментацией, причем стандартного набора аугментаций, представленных в keras/tf/pytorch, нам не хватало. Плюс, изначально хотелось аугментировать на CPU. Аугментация на CPU имеет свои неоспоримые преимущества, главным из которых, на наш взгляд, является возможность «разгрузить» видеокарту, тем самым разделив обязанности между двумя вычислителями.
Как решали проблемы
В случае с обучением GAN’ов мы в основном работали с функциями потерь (лосс-функции). Так, мы добавили ещё identity loss и color loss. Параллельно игрались с архитектурой генератора внутри CycleGAN’а, в результате чего пришли к 12-ти блочному резнету (исходный был для нас коротковат).
В случае с повторяющимся кодом мы написали более высокоуровневые обертки над моделями, позволяющие переиспользовать код, использующийся в нескольких моделях сразу. Код для дата генераторов тоже обобщили подобным образом по тем же причинам.
Для решения третьей проблемы (подгрузка с аугментациями на CPU) пришлось придумать и написать свою собственную фишку, но об этом как-нибудь в следующий раз. Скажем лишь, что именно за счет нее технология может быть успешно использована для других проектов, никак не связанных с аватарами.
Факапы при создании AI-интерфейсов
Главная ошибка — неверная оценка сложности задачи. На первый взгляд часто кажется, что вокруг огромное количество готовых решений, которые на 99% тебе подходят. Их нужно лишь взять и смело перенести на свой кейс. Так вот, всё не так. Отдельно стоит показать, каково это наблюдать за тем, как в GAN’е, который успешно учится несколько дней, внезапно что-то буквально взрывается, отчего он начинает генерить полную дичь.
Примерно вот так:
![image](https://habrastorage.org/webt/jt/mf/mn/jtmfmn4oxizs9vzfxvaedcnrwhk.gif)
Другим серьезным факапом стало то, что на начальных этапах мы забывали про фиксацию random seed'a, а мы помним, что GAN’ы крайне чувствительны к инициализации. Весьма позорный провал с нашей стороны, ставьте лайк за откровенность.
Где сегодня используется Domain Adaptation
Доменная адаптация медленно, но верно проникает в AI-задачи. Эта устойчивая тенденция обусловливается тем, что несмотря на стремительный рост доступной информации в современном мире, разметка всё также остается занятием долгим и дорогим. Развитие Transfer Learning и его обобщения в лице Domain Adaptation решает эту проблему.
Примером практического применения доменной адаптации является работа компании Apple по расширению датасета фотографий глаз человека путем адаптации синтетически сгенерированных изображений. В своем исследовании они показали, что эффективным подходом является генерация изначально размеченных искусственных данных с последующим приближением к реальным данным методами Domain Adaptation.
![image](https://habrastorage.org/webt/4p/bx/ml/4pbxmlnu7eg1loz7hbzgppbjenq.png)
Или вот другой интересный пример. В 2017 году группа ученых придумала необычный подход к сбору данных об улицах, дорогах, пешеходах и прочем окружении, в котором должны находиться самоуправляемые автомобили для своего обучения.
Они предложили брать эту информацию из GTA V.
![image](https://habrastorage.org/webt/mz/uq/ef/mzuqef2pd0bhjw2e2j8fhq5irro.png)
Для этого в виртуальной среде Grand Theft Auto V было сгенерировано более 480 000 помеченных виртуальных образов нормального вождения по шоссе. Используя эти изображения, система была обучена считывать все основные переменные, необходимые для базового автономного вождения: определять расстояние до автомобилей и прочих объектов впереди, разметку полосы и угол вождения (угловой курс относительно осевой линии полосы). Была проанализирована также авария Tesla со смертельным исходом в штате Флорида.
Будущее за NST и GAN
Можно ли об этом уверенно говорить? Пожалуй, да. Neural Style Transfer использует Prisma. По аналогии с этим создаются новые приложения, причем не только для развлекательных нужд. GAN’ы тоже могут использоваться как инструмент решения самых разнообразных задач: раскраска изображений, генерация образов из шума, даже генерация изображений из текста.
Возвращаясь к теме геймдева. Здесь возможности доменной адаптации потенциально безграничны: если в кейсе с обучением беспилотных автомобилей брались текстуры игрового мира GTA V, из которых получалось что-то очень похожее на фотографии реального мира, то абсолютно ничего не мешает сделать наоборот: генерировать игровые текстуры из панорамных снимков реальных городов.
Плюс машины в том, что она не устает. Компьютер уже сейчас может за доли секунды генерировать огромное количество различных представлений. Наша задача в том, чтобы научиться делать это эффективно и качественно, а дальше останется только отделять зерна от плевел и кайфовать.
Остались вопросы? С удовольствием ответим на них в комментариях.