Личный опыт Evgeny Kurt
408

Типа Prisma, но в геймдеве: как мы сделали AI-аватары

В решениях uKit Group компьютерное зрение и машинное обучение используются не первый год. Например, проект Webscore делает оценку визуальной привлекательности сайтов. Создавая браузерную игру Web Tycoon, мы подумали, что было бы круто, если геймеры смогут создавать похожие на себя аватары.

В закладки

Чтобы сделать симулятор интернет-бизнеса интересным, нужно проработать игру в деталях и игровые портреты пользователей — не исключение. Перед нами была непростая задача — научить искусственный интеллект анализировать фотографии пользователей, чтобы создавать похожие на них картинки.

Что в этом сложного

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

Стилистика игры

Чтобы понять, что для нашей задачи на самом деле нужно, перебрали несколько моделей. В качестве исходных взяли готовые Style Transfer решения — это техника визуальной перекомпоновки в стиле каких-либо изображений. Правда, Style transfer сам по себе нам не подошёл.

Мы пробовали всё подряд до тех пор, пока что-то не заработало. Первой удачной моделью стал CycleGAN, который и взяли за основу. Потом прикрепили Perceptual Loss, чтобы два визуально одинаковых изображения считывались как одинаковые. Но это было не самым сложным.

У всех моделей одинаковые проблемы — время обучения, чувствительность к инициализации, mode collapse. Поэтому заставить генеративную модель обучаться — вот настоящий челлендж.

Как решали проблемы

Возникли и инженерные сложности — обеспечение быстрой параллельной подгрузки данных с аугментаций, так как стандартного набора в keras/tf/pytorch не хватало. Чтобы модель обучалась, играли с функциями потерь и архитектурой генератора внутри CycleGAN’а, добавили identity loss и color loss и пришли к 12 блочному резнету.

В нашем случае разметка данных — субъективная вещь. Если дать 10 людям собрать для одной фотографии по аватарке, получится 10 разных аватарок. К тому же, если дизайнеры вдруг добавят, скажем, новый вид очков, то всё сломается и нужно будет размечать заново. Системы без разметки лишены этих недостатков и в теории гибкие.

Пример сгенерированного аватара

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

В чём прикол

1. Все, кто заявляет, что что-то там генерируют, по факту рисуют составные блоки руками, а потом из них собирают псевдорандомом. Это создаёт ощущение, что генеративные модели используются, но по факту нет.

2. Если кажется, что задача сложная — вероятно, она очень сложная. Готовые решения не подходили, GAN внезапно генерировал что-то странное, random seed забывали фиксировать. Поэтому, если решите тоже сделать что-нибудь типа этого, имейте в виду — это долго.

3. GAN могут использоваться как инструмент решения таких задач, как генерации изображений по текстам. Например, пишете «котик» — генерится котик. Компьютер может генерировать бесконечное количество представлений и наша задача научиться использовать это.

Что получилось

Первое — уменьшить количество ошибок. Для обучения модели, работали с функциями потерь — это метод позволяет оценить, насколько хорошо алгоритм моделирует данные. Если прогнозы слишком сильно отклоняются от результатов, функция потерь учится уменьшать количество ошибок.

Второе — прийти к 12 блочному резнету, заменив архитектуру генератора внутри CycleGAN’a, потому что исходный был коротковат.

Третье — написать более высокоуровневые обертки над моделями, которые позволяют переиспользовать код в случае с использования его в нескольких моделях сразу.

Четвертое — аналогично (по тем же причинам что и в третьем пункте) обобщить код для data-генераторов.

Пятое — сделать собственное решение для подгрузки с аугментациями на CPU. Для этого была придумана и написана специальная фишка, с помощью которой технология может быть применена в других проектах, не связанных с аватарами. Подробнее о ней расскажем в другой раз.

Пример работы GAN

За время работы над аватарами мы перепробовали много инструментов и методов, и теперь можем уверенно сказать, что за GANами будущее. Они могут быть применены везде, где может быть полезна генерация изображений и их частей. Вы можете рисовать ч/б скетчи, а генеративная модель будет их разукрашивать. Можете рисовать полигоны, и они будут дорисовываться. Можете генерировать внешний вид персонажа, и это только малая часть возможностей. Они ограничены только воображением применяющего эту сеть человека.

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

Написать
{ "author_name": "Evgeny Kurt", "author_type": "self", "tags": [], "comments": 2, "likes": 11, "favorites": 3, "is_advertisement": false, "subsite_label": "life", "id": 67032, "is_wide": false, "is_ugc": true, "date": "Mon, 13 May 2019 14:51:07 +0300" }
{ "id": 67032, "author_id": 275975, "diff_limit": 1000, "urls": {"diff":"\/comments\/67032\/get","add":"\/comments\/67032\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/67032"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199123, "last_count_and_date": null }

2 комментария 2 комм.

Популярные

По порядку

1

Мне кажется, Маск не очень похож..

Ответить
1

Вам не кажется, это так

Ответить
0
{ "page_type": "article" }

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Голосовой помощник выкупил
компанию-создателя
Подписаться на push-уведомления
{ "page_type": "default" }