Как работает FaceSwap?

15 ИЮНЯ 2022

------------------------------------------------------------------------

Наш телеграм-канал: t.me/@mailsgun_online

Youtube: youtube.com/@mailsgun_online

------------------------------------------------------------------------

Привет, Хабр!

Сегодня мы, команда Sber AI, расскажем про различные подходы к FaceSwap с помощью нейросетей. Также мы хотим разобраться, какие у разных подходов есть преимущества и недостатки? И главное — как же все это работает?

Что такое FaceSwap и как он появился?

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

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

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

Как работает Face Swap? 

Первые подходы

Одним из первых является подход (посмотреть код можно, например, здесь), под которым лежит довольно простая идея автоэнкодеров. Автоэнкодеры — это нейросети, которые состоят из двух частей — encoder и decoder. Первый сжимает изображение в низкую размерность, называемую скрытым представлением или латентным кодом, а второй разжимает обратно и пытается получить такую же картинку, какая была на входе у энкодера. Если таким образом обучить сеть, то получится, что скрытое представление довольно хорошо описывает признаки изображения.

image

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

Допустим, мы обучили автоэнкодеры и теперь хотим заменить первого человека на изображении на второго. Тогда всё, что нам останется сделать — прогнать картинку с лицом первого человека через энкодер и отдать полученное скрытое представление декодеру, который обучался на втором человеке. Интуиция тут такая: так как энкодер у них общий, то он научился кодировать в векторе довольно общую информацию про то, куда смотрит взгляд человека, какое у него выражение лица и т. д., а каждый из декодеров уже обучен, чтобы использовать эту информацию для восстановления итогового лица. Так что осуществив такую операцию, мы получим лицо второго человека с тем же выражением, взглядом и другими деталями, как на оригинальной фотографии.
image

Полностью процесс будет выглядеть примерно так:

  1. Обучить автоэнкодеры на первом и втором человеке
  2. Покадрово вырезать лицо, которое хотим заменить
  3. Прогнать его через нашу систему, получив на выходе лицо человека, которого хотим перенести, с нужным выражением лица и прочими деталями
  4. Вставить лицо обратно
  5. Наслаждаться результатом

https://media.giphy.com/media/fo23NLu9hCqAZYi4Eh/giphy.gif

А что сейчас?

Пожалуй, State-Of-The-Art среди подходов, основанных на этой идее, на данный момент является DeepFaceLab (статья, github). В данной работе авторы развивают идею, указанную выше, а также добавляют много других возможностей для более качественного переноса — дополнительные функции потерь при обучении, немного видоизменённая архитектура, дополнительные аугментации и многие другие параметры.

Одним из самых известных примеров работы данной модели является перенос лица Тома Круза на другого человека.

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

Какие ограничения у такого подхода?

Несмотря на практически безграничные возможности по качеству, у данного подхода есть несколько существенных минусов:

  • перенос работает хорошо только тогда, когда у нас есть множество кадров с лицом человека, которого мы хотим перенести. А желательно ещё и со всеми возможными ракурсами, хорошим освещением и т. д. (например, будет очень кстати видео человека в хорошем качестве);
  • качество того, как выглядит итоговый перенос, напрямую зависит от того, насколько человек для переноса похож на оригинал;
  • требует больших вычислительных и временных ресурсов;
  • необходимо, чтобы человек, который осуществляет перенос, имел опыт работы с данным подходом, поскольку множество гиперпараметров требуют тонкой ручной настройки в процессе обучения;
  • для каждого нового человека, которого мы хотим перенести, и нового видео, куда мы хотим перенести, требуется обучать модель практически с нуля.

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

Подходы, основанные только на одном фото

First Order Motion Model  / Motion-supervised Co-Part Segmentation

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

image

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

Few-Shot Adversarial Learning of Realistic Neural Talking Head Model

image

В основе данной модели лежит использование точек лица для генерации. А также это первая статья из тех, что мы сегодня рассмотрим, которая использует подход, основанный на генеративно-состязательных сетях, обычно называемых GAN. Если коротко, то основная идея таких сетей состоит в том, что у нас есть две сети — генератор и дискриминатор. Генератор учится генерировать реалистичные изображения, а дискриминатор пытается научиться отличать сгенерированные изображения от настоящих. В итоге они играют в такую игру, где генератор пытается переиграть дискриминатор, а дискриминатор пытается не дать себя обмануть.

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

  1. Берём из видео несколько кадров одного и того же человека
  2. Достаём некоторые ключевые точки (называемые landmarks) лица из одного кадра
  3. Из остальных кадров — их может быть один или несколько — достаём фичи с помощью свёрточной сетки
  4. С помощью генератора по лендмаркам, а также фичам лица из других фотографий пытаемся восстановить оригинальный кадр, откуда доставали ключевые точки
  5. Обучаем модель, сравнивая выход генератора с оригинальным фото, а также используя функцию потерь, основанную на дискриминаторе

Как эта, так и предыдущая статьи обучались на большом наборе видео, каждое из которых потом нарезалось на кадры.

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

FaceShifter

В следующей статье , про которую я бы хотел рассказать, приводится модель, которая на данный момент показывает одни из лучших результатов, и только недавно вышла статья, показывающая что-то сравнимое в данной задаче (про неё мы тоже поговорим подробней). В этой статье довольно отличительной особенностью является то, что авторы используют не одну, а две модели. Первая модель, Adaptive Embedding Integration Network (AEI-Net), используется для осуществления самого по себе переноса лица, а вторая, Heuristic Error Acknowledging Network (HEAR-Net), используется для улучшения качества итогового переноса. Давайте разберёмся, как именно работают данные модели.

image

Для начала разберёмся с тем, как работает AEI-Net — модель, осуществляющая основную часть переноса. Пусть $X_s$ — это изображение, откуда мы хотим взять лицо для переноса, а $X_t$ — это изображение, куда мы это лицо переносим. Тогда общий пайплайн выглядит так:

  1. С помощью некоторой предобученной модели ArcFace (Identity Encoder на изображении) из $X_s$ достаётся вектор, который хорошо кодирует identity человека, которого мы хотим перенести
  2. С помощью некоторой UNET-like архитектуры (синяя часть на изображении) мы достаём признаки из $X_t$$z^{1}_{att}, z^{2}_{att}, ..., z^{n}_{att}$
  3. Последовательно смешиваем эти признаки с вектором признаков для identity
  4. Получаем на выходе изображение $hat{Y}_{s,t}$, которое сохраняет идентичность человека из $X_s$ и всё остальное из $X_t$.

Обучаться такой зверь будет суммой сразу нескольких лоссов:

  • $L_{id}$ — лосс идентичности. Мы хотим, чтобы выходы Identity Encoder для $hat{Y}_{s,t}$ и $X_s$ были похожи;
  • $L_{adv}$ — GAN лосс, основанный на дискриминаторе (adversarial loss);
  • $L_{rec}$ — лосс реконструкции. Будем иногда давать модели $X_s=X_t$ и требовать, чтобы в таком случае на выходе было $hat{Y}_{s,t}=X_t$
  • $L_{att}$ — лосс атрибутов. Хотим, чтобы $z^{1}_{att}, z^{2}_{att}, ..., z^{n}_{att}$ для $hat{Y}_{s,t}$ и $X_t$ были близки.

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

Также в статье приводится вторая архитектура — HEAR-Net. Интуиция за ней такая, что некоторые объекты на $X_t$, которые закрывают лицо — руки или какие-то небольшие детали вроде капель, могут плохо сохраняться. А поэтому давайте подскажем нашей модели, где она ошибается, и пусть она доделает перенос. Работает модель следующим образом:

  1. Получим $hat{Y}_{s,t}$ — результат переноса с  $X_s$ на $X_t$, а также $hat{Y}_{t,t}$ — это будет результат переноса личности с $X_t$ на $X_t$ (в идеале $X_t$ никак не изменится, но добиться этого полностью невозможно)
  2. Получим разницу между $X_t$ и $hat{Y}_{t,t}$ и сконкатенируем её с матрицей $hat{Y}_{s,t}$ — таким образом мы дадим модели информацию, какие именно части $X_t$ она теряет при переносе
  3. Прогоним через UNET-like архитектуру и получим на выходе итоговое изображение ${Y}_{s,t}$.

image

Обучать будем довольно просто — опять возьмём identity лосс, а также лосс реконструкции и добавим к ним $L_{chg}$, который будет отвечать, чтобы картинка не слишком сильно менялась (${Y}_{s,t}$, была похожа на $hat{Y}_{s,t}$).

Обучение тут построено так, что сначала отдельно обучается AEI-Net, а потом уже поверх неё обучается HEAR-Net. Для обучения таких моделей используются довольно большие датасеты с изображениями лиц — от нескольких сотен тысяч до нескольких миллионов изображений. А также требуется некоторое количество времени — как минимум несколько дней обучения на Tesla V100. К сожалению, у статьи нет оригинального кода, но есть ряд открытых реализаций.

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

Вот результаты авторов, которые они показывают в статье.

image

А вот пример переноса лица Илона Маска на кадры из «Кавказской пленницы» с использованием одной из наших версий данной модели.

image

SimSwap

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

image

Пайплайн модели также очень похож:

  1. Достаём из $I_S$ (лицо для переноса) вектор identity, используя тот же предобученный Identity Encoder, что и в FaceShifter
  2. Достаём фичи из $I_T$ с помощью энкодера
  3. Комбинируем их с identity вектором в блоке IIM
  4. Декодируем в итоговое изображение $I_R$.

Для обучения здесь также используются вариации identity лосса, reconstruction лосса и GAN лосса, однако вместо лосса атрибутов используется нововведение данной статьи — Weak Feature Matching Loss, который сравнивает выходы на последних слоях дискриминатора для $I_R$ и $I_T$.

Модель показывает довольно хорошее качество переноса, однако ориентируется на то, чтобы итоговое изображение было скорее похоже на $I_T$, чем на $I_S$. Сравнивать с FaceShifter по качеству довольно непросто — каких-то стабильных метрик, которые все используют, для данной задачи нет, но по тем, что использовали авторы — в статье показываются сравнимые результаты, используя только одну модель вместо двух.

Вот пример работы модели (для большего количества примеров можете поизучать гитхаб):

https://github.com/neuralchen/SimSwap/raw/main/docs/img/results1.PNG

Если говорить про само обучение, то и для FaceShifter модели и для SimSwap необходимо большое количество изображений лиц. В качестве данных использовались датасеты: CelebA HQ (30 тысяч лиц селебрити 1024х1024), FFHQ (70 тысяч лиц обычных людей 1024х1024), VggFace и VggFace2 (большие датасеты с более чем миллионом изображений лиц людей разного разрешения в естественной среде). Обе эти модели требуют тонкой настройки во время обучения, которое занимает как минимум несколько дней и требует больших вычислительных ресурсов. Зато после обучения модели показывают довольно хорошее качества переноса, быстро работают и не требуют дообучения для работы с новыми личностями.

Заключение

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

Команда: Даниил Чесаков Danyache, Денис Димитров ddimitrov

Всего голосов 5: ↑5 и ↓0+5
  • 30 августа в 18:00
    Всего голосов 9: ↑8 и ↓1+7

    697

  • 1 июля в 14:04
    Всего голосов 8: ↑8 и ↓0+8

    2.6K

  • 12 июля 2018 в 10:00
    Всего голосов 17: ↑14 и ↓3+11

    4.1K

Source: habr1

Ну и напоследок напоминаю вам о нашем новом проекте vkserfing bot.