Всем привет! Я работаю с генеративными моделями, одним из моих проектов является разработка DeepFake. Планирую создать несколько статей про этот проект. Данная статья является первой, в ней я рассмотрю архитектуры которые можно использовать, их достоинства и недостатки. Из существующих подходов к созданию DeepFake можно выделить следующие:
Архитектура основанная на схеме кодер-декодер
Генеративно-состязательные сети(GAN)
Энкодер-декодер архитектура
К данной подходу можно отнести методы генерации основанные на автоэнкодерах. Их объединяет использование пиксельных(изображение на входе попиксельно сравнивается с изображением на выходе, оптимизируется MSE,MAE и т.п. функции потерь) потерь, что определяет достоинства и недостатки и данной схемы. Плюс в том, что автоэнкодеры относительно просто(в сравнении с GAN) обучать. Минус - оптимизация по пиксельным метрикам не позволяет добиться фотореалистичности, сравнимой с другими методами(опять же в сравнении GAN). Первым вариантом, который я рассмотрел, была схема с двумя декодерами. Подробнее можно ознакомиться здесь .Архитектура представлена на рисунке ниже.
Идея данного подхода в следующем: используется энкодер-декодер схема, при этом энкодер один, а декодеров используется несколько, причем каждый декодер может создавать изображения только одного человека. Данный подход огранивает использование модели, требуя обучать отдельный декодер для каждого нового человека которого мы хотим сгенерировать. Для некоторых сценариев это не критично, например при производстве рекламных роликов это не будет проблемой. Но например для приложения, где пользователь хочет создать DeepFake с своим участием, такая схема не подходит, т.к. вряд ли пользователю понравится ждать несколько часов, пока под него обучается отдельный декодер. К достоинствам можно отнести относительную компактность - в отличие от других подходов, не нужно создавать и обучать(или искать готовые и адаптировать) дополнительные сетки для кодирования внешности. Но ограничение "каждому человеку - отдельный декодер" ограничивает применение данной архитектуры, поэтому рассмотрим следующую.
Condtional Autoencoder
Схема представлена на рисунке ниже. Больше информации можно найти здесь.
Идея данного подхода в следующем: на вход энкодера подается изображение и вектор атрибутов. На вход декодера поступает вектор размерности latent_dim являющейся выходом энкодера и вектор атрибутов. Атрибутом может быть любой признак характеризующий изображение, например наличие/отсутствие улыбки(и других эмоций), повернута голова вправо или влево, внешность человека и т.п. Т.к. вектор атрибутов поступает в декодер напрямую, энкодеру нет смысла извлекать из входного изображения эту информацию. Т.е. например, если в atrributes vectors задать внешность человека, то энкодер будет кодировать только свойства изображения не связанные с внешностью, такие как поворот и наклон головы, эмоции, освещение и т.п. И если к выходу энкодера добавить atrributes vectors другого человека, декодер восстановит картинку, где поворот головы и эмоции будут соответствовать исходному изображению, а внешность будет от другого человека. В данной схеме не требуется обучать отдельный декодер для каждого нового человека, которого мы хотим генерировать, т.к. замена внешности реализуется изменением atrributes vectors подаваемого в декодер. Примеры восстановленных изображений с помощью данного подхода можно увидеть на рисунке ниже.
Изображения разбиты по парам, слева - восстановленные автоэнкодером, справа - оригинальные. Хорошо виден недостаток присущий автоэнкодерам - "замыленность", недостаточная резкость восстановленных изображений. Можно попробовать доработать восстановленные изображения, повысить резкость и т.п. но существует подход изначально лишенный этих недостатков.
Conditional GAN
В GAN генератор получает на вход случайный вектор, и возвращает сгенерированное изображение. Т.к. в DeepFake изображение должно обладать рядом заданных свойств(обычно - внешность от одного человека, поворот головы и эмоции от другого), рассмотрим Conditional GAN. Сравнение GAN и Conditional GAN архитектур представлено на рисунке ниже. Рисунок взят из этой статьи, там можно найти больше информации.
В классическом GAN, генератор получает на вход случайный вектор и генерирует изображение. При этом изображение является случайным, т.е. неизвестно сгенерируется женщина или мужчина, будет смотреть прямо или направо, будет улыбаться или грустить. В Conditional Gan на вход генератору подается два вектора - случайный вектор Z и вектор атрибутов(на приведенной схеме обозначен label). Дискриминатор получает на вход изображение и соответствующий вектор атрибутов. В процессе обучения генератор учиться создавать не только реалистичные изображения, но и соответствующие вектору атрибутов. Результаты которые я получил с использованием Conditional GAN представлены на рисунке ниже.
Изображения сгруппированы по парам(слева - сгенерированные, справа - оригинал). В attributes vectors задаются поворот и наклон головы, эмоции и внешность человека. Xорошо видна способность GAN генерировать фотореалистичные изображения. Если сравнить сгенерированные картинки с рассмотренными ранее результатами автоэнкодеров, создается впечатление, что GAN выигрывает в одни ворота. Но не нужно забывать, что конечная цель - DeepFake, а это генерация не одной картинки, а видео. В следующей части я расскажу как перейти от генерации отдельных изображений к созданию видео. Последняя сборка DeepFake на основе GAN выглядит следующим образом:
В настоящий момент продолжается развитие проекта. Планируется много доработок, в первую очередь - увеличение разрешения, отработку сцен с сложным освещением. Если будет интересно, по мере появления новых результатов будут новые публикации.
Stantin
Как-то неконкретно..
Если бы минимальный пример с датасетом и кодом..
sergeim52b20 Автор
Датасеты с лицами в 1024*1024:
github.com/NVlabs/ffhq-dataset
github.com/switchablenorms/CelebAMask-HQ
Сейчас используется несколько сеток: генеративная модель(GAN либо AE) для создания отдельных кадров + кодирование внешности + кодирование эмоций + отдельная тема это переход от отдельных кадров к видео. Что именно интересно?
Stantin
Наверное интересен весь процесс по шагам и с кодом, а если это слишком много за раз, то его этапы (создание отдельных кадров etc).