Хабрахабр

Как мы не выиграли хакатон

Основной задачей было сделать AI решение для обработки фото или видео, которое можно будет использовать в приложение PicsArt. С 30 ноября по 2 декабря в Москве прошел PicsArt AI hackathon c призовым фондом — 100,000$. Также Артур позвал Илью Кибардина — студента МФТИ (кому-то же нужно было писать код). Коллега по работе(на тот момент) Артур Кузин предложил поучаствовать, заинтересовав меня идеей — анонимизация личных фотографий пользователей с сохранением деталей(мимики и т.д). Название родилось очень быстро: DeepAnon.

Это будет рассказ про наше решение, его деградацию развитие, хакатон, и как не надо подстраиваться под жюри.

До хакатона

Первый — пройти в топ-50 лидерборда на задаче сегментации лиц — “Datascience гений”. Было три пути попадания на хакатон. В последнем варианте было необходимо просто прислать описание своей гениальной идеи. Второй — сразу объединиться в группу до 4-х человек и показать работающий MVP — “бодрая команда”. Ну и вообще мы решили, что классные, поэтому всей тимой попали в топ 10 на лидерборде и, соответственно, инземани. Мы решили не терять время и сразу, за неделю до хакатона, делать MVP.

Чтобы обезопасить себя, можно зацензурить свое лицо “квадратиками”, а фон замазывать. Основная идея нашего продукта заключается в следующем: люди бездумно шарят фотографии с собой (иногда не совсем законные) в социальных сетях, о которых они потом могут пожалеть, или за которые их даже могут наказать в будущем. Чтобы сохранить эмоции на лице и объекты на фоне, наше приложение меняет все лица на фотографии, а фон делает мультяшным. Но тогда будет скрыто не только лицо, но и эмоции на нем, а фон будет испорчен. А чтобы человека нельзя было узнать по одежде, она заменяется на другую.

Для каждого этапа использовалась отдельная нейронная сеть (а иногда даже несколько). За неделю нам удалось сделать почти все задуманное. Далее, с помощью сегментации человека, отделяли фон и делали на нем перенос стиля на мультяшный (Рик и Морти). Сначала на изображении находились все лица и заменялись на одно и то же лицо знаменитости — для этого использовалось решение, похожее на DeepFake. На последнем этапе происходила сегментация разных частей одежды и их изменение — случайное смещение цветов в HSV пространстве, так как перенос стиля не успели перед показом MVP жюри.

Например, все реализации DeepFake на гитхабе умели превращать только определенное лицо X в определенное лицо Y. На каждом этапе возникали свои технические трудности. Наиболее простой способ собрать такой набор данных — найти видео выступлений человека, где большую часть времени показывается только он, и, с помощью детекции лиц, нарезать фото. В такой постановке задачи необходимо множество фотографий двух людей. Мы попробовали вместо одного лица X использовать множество всевозможных лиц из датасета CelebA, и, к нашему счастью, это завелось. Основной упор в нашей идеи был как раз в том, что можно из любого лица сделать одно и тоже другое лицо Y. Ниже схема DeepFake, взятая с реализациии, которую мы использовали.

Вот так выглядело описание нашего МВП для жюри. Результат был завернут в веб-демо на flask и запущен для показа.

В базовом варианте сервис скрывает лица. Представляем сервис, позволяющий анонимизировать медиа контент (фото и видео). В качестве альтернативного использования, сервис может служить для создания фановых и вирусных роликов или фото с замененными лицами знаменитостей. В расширенном — меняет лица пользователей на лица других людей (DeepFake), изменяет одежду и фон (сегментация + Style Transfer).

Если до этого это было изменение цветов в HSV, то теперь на каждый тип одежды применялся свой стиль (различных художников). До начала хакатона оставалось несколько дней, и мы успели улучшить изменение одежды. А в последний момент успели добавить различные уровни анонимизации в веб демо — появилась возможность выбрать, какие элементы анонимизации использовать. Еще появилась идея, что лучше будет делать изменение лица не в одну знаменитость, а сначала классифицировать по полу, и после этого переносить лица мужчин и женщин по-разному (например, в Навального и Собчак).

Одно из сообщений в нашем командном чате: На оффлайн часть мы шли с настроем, что это полезный, необычный юзкейс, а не просто вирусные маски на лица.

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

На хакатоне

Каждой команде был отведен отдельный стол, а в буфете были бесконечные быстрые углеводы печеньки. В пятницу началась оффлайн часть. Пообщавшись с несколькими организаторами неформально, мы почувствовали, что анонимность их не зацепила. После официального открытия мы решили не терять время и сразу узнать у жюри, чего они хотят от участников. Также стало понятно, что от нас хотят чего-то, что можно внедрить в PicsArt. Но понравилась идея с сегментацией отдельных частей фотографии и их изменение. Тем не менее, к вечеру наша команда отправила описание проекта, в котором говорилось об анонимизации, но уже с акцентом на сегментацию и редактирование отдельных частей фото.

Описание проекта для жюри на вечер пятницы:

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

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

Также члены жюри очень воодушевленно приняли идею со сменной прически по нажатию на волосы (оказалось, что они сейчас пытаются сделать что-то похожее). На первой же комиссии в субботу мы не смогли продать жюри анонимизацию, но увидели, что им нравится идея редактирования отдельных предметов на фотографии.

Было решено сделать акцент на качественную смену одежды. Наша команда не устояла под таким напором (к сожалению) и согласилась изменить видение продукта.

В демо на главном экране планировалось показывать несколько вариантов исходной фотографии (в идеале, одежда меняется по тапу на экран):

Верхняя одежда:

  • оставить как есть
  • джинса
  • леопард

Штаны:

  • оставить как есть
  • джинса
  • леопард

Обувь:

  • оставить как есть
  • веселая обувь

Для этого из датасета знаменитостей CelebA были выбраны лысые и все остальные. В базовом варианте с волосами было решено сделать трансформацию “лысый — не лысый”. На этих двух группах был поставлен учиться CycleGAN, который умеет трансформировать картинки домена A в домен Б, и наоборот (другим примером может быть превращение лошади в зебру).

Он не очень верил в успех нашего эксперимента с волосами, но накидал ссылок, в какую сторону смотреть. Нам удалось познакомиться с одним из разработчиков PicsArt и немного узнать об их внутренней кухне. Зато она научилась менять тон кожи (угадайте, почему). К нашему разочарованию нейронка действительно не научилась добавлять-убавлять волосы.

В планы добавилось улучшение неба и смена стилей отдельных объектов (изначально только одежда): зданий, машин, а также аксессуаров на людях. Видение продукта менялось после каждого общения с тех комиссией. Для итоговой презентации решили придерживаться следующей структуры из 4-х слайдов: Фокус уходил с анонимизации все больше.

  1. Сегментация одежды. Фото: оригинальная фотография, сегментированная одежда, 4 варианта обработки одежды.
  2. Сегментация сцены. Тусклое фото с пересвеченным небом. Небо делается артистичным, здания мультяшными.
  3. Фейс свап и изменение волос. Тут что заведется.
  4. Все вместе. Слайд, который показывает, что это делается в "три клика".

К вечеру субботы всем объявили, что на защите должно быть выступление на 3 минуты без презентации. Но оказалось, что презентация не нужна. Организаторы хотят увидеть работающие технологии, а не красивые презентации, и это круто. Со сцены необходимо будет показывать свое демо в режиме реального времени. Небольшая проблема была лишь в том, что на тот момент наша куча моделей запускалась по отдельности и очень долго. Сравнивая с другими хакатонами, где выигрывали команды с неработающим демо, такая концепция нам понравилось. Для показа со сцены была необходима оптимизация.

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

Несколько сообщений из командного чата на тот момент

То им вирусный эффект на сайте хакатона, то серьезный редактор

Бле, не хакатон, а сплошное: "тут новая инфа, переделываем все что у нас есть"

Вначале сегментировать волосы, а затем на них применять inpainting. После того, как изменение волос не завелось CycleGAN-ом, решили попробовать другой подход. По нашему плану — скрываем волосы, а нейронная сеть будет пытаться восстановить их. Задача inpainting — восстановить скрытую часть изображения по окружающему контексту. Проблема в том, что даже обученные на лицах людей модели не смогли нормально восстанавливать волосы (если закрасить лишь часть волос, то работает). Но так как сеть не видела, какие волосы у данного человека, она будет восстанавливать другую прическу.

Была идея обучить inpainting только на лысых людях, и тогда бы модель, вероятно, научилась менять любую прическу на отсутствие волос. Основная сложность — огромное разнообразие причесок. Реализацию нейронной сети мы взяли из этого репозитория.

Наибольшей прирост скорости дал перенос всех нейронных сетей в память на все время работы приложения. Так как демо нужно будет показывать со сцены в режиме реального времени, пришлось оптимизировать скорость работы пайплайна. На самом деле сложно не попасть в такую ситуацию, когда в день пробуешь запустить десяток репозиториев с гитхаба, в каждом из которых используется разная версия tensorflow, обновляя до нужной версии в одном месте — ломаешь в другом. Не обошлось и без трудностей: начиная делать все в docker, но забив по ходу, несколько раз попадали на боль с версиями tensorflow. Тем не менее, поддаваясь на такое искушение, вы рискуете еще больше времени потратить на отладку кода и попытки понять, какая версия библиотеке в каком месте вам нужна. Docker может быть хорошим другом в такой ситуации, но в условиях хакатона хочется каждую минуту тратить на проверку новых гипотез, а не на создание нового образа.

Финальный день

Хотелось максимально сузить задачу, но и делать только изменение одежды казалось слишком мало. В воскресенье утром мы определились с финальным видением продукта (пора бы уже): изменение одежды с возможностью улучшения неба. Вот так выглядел “дизайн” нашего веб приложения.

Но время поджимало, и наш дизайн свелся к np.vstack(imgs_list). Изначально хотели добавить адаптивный дизайн, чтобы было удобно смотреть с телефона.

Было добавлено альфа смешивание одежды и фона — исчезли резкие переходы. Перед финальным выступлением хотелось довести фичу с одеждой до законченного состояния. За несколько часов до показа удалось запустить сегментацию неба и перенос стиля на него из этого репозитория. Оставили только самые реалистичные текстуры — джинса и крокодиловая кожа. Но самым подходящим тематике конкурса стало зимнее небо — его применение давало эффект “улучшателя” неба. Были варианты с превращением неба в апокалиптическое, ядовитое, мультяшное.

Мы скачали множество фотографий с социальных сетей и планировали запускать на них приложение, чтобы выбрать самые удачные кейсы (начерепикать). Оставалось совсем немного времени, когда все компоненты соединились в единое целое и заработали. Но оказалось, что наша команда выступает первой, поэтому все было максимально честно — показывали демо на случайных фотографиях.

Артур, выступая на сцене, смог раскрыть нашу идею, а Илья на проекторе демонстрировал наш MVP — на всех фото одежда поменялась, а небо улучшилось.

Еще фото

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

Результаты

В итоге, по инсайдерской инфе, наша команда заняла 6-е место в шаге от мани.

Даже сейчас, мы убеждены в том, что она годная и принесет ценность для ряда пользователей. Постфактум, мы пришли к общему мнению (ну, кроме того, что 3 из топ 5 команд получили приз незаслуженно), что нужно было проявить стойкость и решительно допиливать первоначальную идею анонимизации. Занимаясь развитием идеи с анонимизацией все выходные, мы бы, как минимум, получили больше фана.

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

Текущее состояние проекта

А также есть отдельный репозиторий, который делает именно анонимизацию. Наша команда выложила код финальной демки на GitHub. В будущем есть планы по развитию первоначальной версии с анонимизацией: переписать все на PyTorch, обучить на фотографиях с большим разрешением и меньшим количеством шума (фотография только с одним лицом), а также поднять бота в telegram.

Он работает на сервере Dbrain(наша благодарность), на котором происходило все обучение переноса лиц, поэтому пробуйте пока не выключили. Для тех, кто уже сейчас хочет попробовать версию, рожденную в самом начале хакатона, в демо режиме запущен бот в telegram(@DbrainDeepAnon -> /start -> /unlock dbraindeepanon). В скором времени wrappa станет доступна в open source. Для работы сервиса используется внутренняя обертка Dbrain — wrappa, которая позволяет легко обернуть docker контейнер и запустить telegram бота.

Благодаря DeepAnon, один “аноним”, сильно переживающий за приватность своих данных, наконец-то смог вести инстаграм о своей жизни. Хочется отметить, что наш труд не был напрасным. Лица всех людей в его инстаграме также подвергаются анонимизации. Он больше не боится, что камеры в городе смогут распознать его лицо по фотографиям из социальных сетей, тем не менее друзья смогут узнать его.

Ссылки на репозитории, которые мы использовали:
https://github.com/shaoanlu/faceswap-GAN
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
https://github.com/sacmehta/ESPNet
https://github.com/JiahuiYu/generative_inpainting
https://github.com/NVIDIA/FastPhotoStyle

S. P. Попробуйте угадать на кого. Также, для фана, я попробовал переобучить сеть по замене лиц на одного из членов ODS. Сети дали название — TestesteroNet.

Eще фото

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть