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



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


До хакатона


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



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



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



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



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


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

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




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


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

На хакатоне


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


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


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

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



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


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


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


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


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

Штаны:


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

Обувь:


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

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


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



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


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

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


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


Несколько сообщений из командного чата на тот момент
То им вирусный эффект на сайте хакатона, то серьезный редактор

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

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



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


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


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


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



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


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



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



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



Еще фото









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


Результаты


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


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


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


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


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


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


Хочется отметить, что наш труд не был напрасным. Благодаря 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


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



Eще фото


Комментарии (16)


  1. bazil
    26.12.2018 14:16

    Мы очень хотели выиграть и поэтому делали то что от нас ожидали. Это до сих пор хакатонами называют ?


    1. digitman Автор
      26.12.2018 14:38

      А зачем участвовать, если не хочешь выиграть. Вопрос в том, нужно ли для этого оправдывать ожидания жюри. А что, по вашему, называют хакатонами в 2018?


      1. bazil
        26.12.2018 16:13

        в мире ИТ это походе на MVP, когда вы хотите продать своё решение потенциальному заказчику.
        со стороны это похоже на тендер, кто предложит лучшее решение для заказчика.
        т.е. я ж не осуждаю вас, я аппелирую к слову хакатон.

        … скоро любая разработка на любой галере будет хакатоном.


        1. digitman Автор
          26.12.2018 16:36

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


      1. SiliconValleyHobo
        26.12.2018 18:23

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


  1. Slavik_Kenny
    26.12.2018 15:13

    Что-то не совсем понял идею глобальной анонимизации…

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

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


    1. digitman Автор
      26.12.2018 15:57

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


  1. egm86
    26.12.2018 15:57
    +1

    так и не понял, в чем смысл предложенной вами анонимизации. мне кажется правильно сделали, что сразу отсеяли подобную идею


  1. willyd
    26.12.2018 17:31

    КПДВ можно занести в аналы…


    1. QtRoS
      27.12.2018 12:23
      +2

      Те анналы, в которые можно что-то занести, пишутся с двумя «н»…


  1. defecator
    27.12.2018 09:45

    Что-то не очень понял, что тут сделано авторами. Судя по статье, всё было взято готовым с разных гитхабов, и соединено вместе, чтобы работало


    1. roryorangepants
      27.12.2018 11:56
      +2

      Судя по статье, всё было взято готовым с разных гитхабов, и соединено вместе, чтобы работало

      Software engineering in 2018 in a nutshell.
      Что тут такого?


  1. Stasklymenko
    27.12.2018 12:45
    +2

    Так само, как и предыдущие комментаторы, не до конца понимаю разрабатываемую идею и ее перспективность.

    Для анонимизации фотографии возможно и достаточно эмодзи на лицо, но имхо, это не так круто.

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

    Сам сок публикации видео заключается в том, что тебя на нем узнают. Если ты заснял, как угоняешь банкомат из магазина или разбиваешь витрины, ты либо фрагменты с лицом удалишь, либо покажешь видео на своем смартфоне друзьям, не более.
    С другой стороны, если публиковать видео с анонимными эмоциями, придется публиковать с фейка, явно не со своего аккаунта. В этом случае у меня в принципе возникают вопросы о целесообразности распространения видео.
    С третьей стороны, вы опираетесь на то, что стоит замазывать себя, если делаете что-то незаконное. То есть, ваш проект будет помогать условным преступникам совершать и скрывать правонарушения?

    К слову, просто интересно узнать, среди друзей/знакомых проводили опрос, кто бы такой функцией пользовался бы? Есть какая-то статистика заинтересованности? В комментах ее не увидел, самого не зацепило, как и жюри, исходя из ваших же слов.

    Понимаю, что за готовыми примерами стоит уйма работы и кода, но пока фактический результат с анонимизацией — это размытие по гауссу с непрозрачностью + мазок инструментом «палец».
    ИМХО, работа в направлении смены одежды, неба и фона по типу добавления ушек или «мимимишности» лица из смартфонов мне кажется более перспективной.

    Энивей, успехов вашему проекту в будущем.


    1. digitman Автор
      27.12.2018 15:12
      +1

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

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


  1. computerix
    27.12.2018 15:05

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


    1. qnok
      27.12.2018 17:04
      +1

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

      А если нужно исказить старую фотографию на старом форуме, то как пользователь доберется до этой фотографии? Никак. Просить применить фильтр у владельцев каждого сайта? Может тогда уже легче будет заняться их удалением. К сожалению не вижу возможности практического применения.

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

      Ваша история мне очень понравилась. Продолжайте участвовать и радовать нас своими успехами.