Генеративно-состязательная нейросеть (GAN) для подмены лиц
Добавление состязательных и перцептуальных (VGGface) функций потерь в архитектуру автоэнкодера дипфейков.
Общее описание нейросети
Алгоритм классического машинного обучения без учителя. Суть идеи состоит в комбинации двух нейросетей, при которой одновременно работает два алгоритма “генератор” и “дискриминатор”.
Дискриминатор. Для распознавания используются сверточные нейронные сети (CNN). Задача дискриминатора – пытаться распознать созданный образ и определить ложная ли она.
Генератор. Формирование изображений начинается с генерации произвольного шума, на котором постепенно начинают проступать фрагменты искомого изображения. Задача генератора – генерировать образы заданной категории.
Таким образом эти две имеют состязательные отношени, при котором генератор во время обучения пытается сгенерировать реалистичные ложные данные для замены лица таким образом, чтобы дискриминативная сеть не смогла бы разпознать подмену лица. Таким образом обе сети тренируют друг друга до состояния оптимального равновесия, при котором генератор будет сгенерировать неотличимые от реальных данные, а дискриминатор более точно подтвердить ложность или истинность полученных данных.
####Обучение
- Для простого обучения вполне достаточно иметь 2 видео исходного и целевого лиц, а дальше алгоритмы определят лица в видео (FaceNet) и оптимально извлекать кадры с лицом, по этой причине в кадре необходимо присутствие только и только одного лица.
- Для лучших результатов подмены лица, количество итераций должно быть не меньше 18’000.
Ниже представлен один из этапов процесса обучения GAN нейросети для подмены лиц при различных итерациях обучения:
7200
7500
21k
График потерь:
Де
Архитектура сети
Результаты применения подхода
- Улучшенное качество вывода: Функция состязательных потерь улучшает качество реконструкции сгенерированных изображений.
Особенности
-
VGGFace perceptual loss: Функция перцептуальных потерь улучшает направление глазных яблок, чтобы дыть более реалистичный и соответствовующий входному лицу выходной. Это также сглаживает артефакты в маске сегментации, что приводит к повышению качества вывода.
-
Attention mask
: Модель предсказываетattention mask
, которая помогает справиться с окклюзией, устраняя артефакты и создавая естественный тон кожи. -
Отслеживание/выравнивание лиц с использованием MTCNN и фильтра Калмана при преобразовании видео:
- Используется сеть MTCNN для более стабильного обнаружения и надежного выравнивания лица.
- Фильтр Калмана сглаживает положение ограничивающей рамки (bounding) на кадрах и устраняет дрожание на заменяемом лице.
-
Обучение с учетом глаз: Использование высоких значений
reconstruction loss
иedge loss
в области глаз позволяет модели создавать реалистичные глаза.
Замена частей лица
Способ №1
- Заменить только часть исходного лица (рот/нос/глаза) на целевое лицо, обрабатывая замененное лицо как расширенные обучающие данные для исходного лица.
- Для каждого исходного изображения лица аналогичное целевое лицо извлекается с помощью knn (с использованием усредненной карты объектов в качестве входных данных) для замены частей лица.
-
Недостатки:
- модель также учится генерировать артефакты, которые появляются в дополненных данных, например, острые края вокруг глаз/носа и странно искаженное лицо.
- артефакты дополненных данных вызваны несовершенным смешиванием (из-за ложных ориентиров и плохого perspective warping).
- необходимо для каждой части лица выполнять обучение.
Способ №2
- Во время трансформации лица производим поиск ориентиров частей лица на кадре с помощью библиотеки
face-alignment
на исходном лице; - Производим
convex hull
для расширения найденных точек в жирную линию; - Производим обрисовку контуров полученного
convex hull
- Для того чтобы ненужные части лица были удалены, оставив только нужные, производим объединение исходного лица с бинарным исходного лица;
- Производим снова masking и дальше проискодит замена лица.
Google Colab
FaceswapGAN train для faceswap на Google Colab.
Пользователи могут обучать свою собственную модель в браузере.
-
- Блокнот для обучения FaceswapGAN модели.
- Требуются дополнительные обучающие изображения, созданные с помощью prep_binary_masks.ipynb.
-
faceswap_video_conversion.ipynb
- Ноутбук для преобразования видео FaceswapGAN модели.
- Выравнивание лица с использованием 5-точечных ориентиров используется в преобразовании видео.
-
- Ноутбук для предварительной обработки обучающих данных. Выходные двоичные маски сохраняются в
{dir}/binary_masks/face_src_eyes
и{dir}/binary_masks/face_dst_eyes
. - Требуется пакет face_alignment. Альтернативный метод для генерации бинарных масок без требования библиотек
face_alignment
иdlib
, находятся в video_face_detection_alignment.ipynb.
- Ноутбук для предварительной обработки обучающих данных. Выходные двоичные маски сохраняются в
-
video_face_detection_alignment.ipynb
- Этот ноутбук выполняет распознавание/выравнивание лиц на входном видео.
- Обнаруженные лица сохраняются в
{dir}/faces/raw_faces
и{dir}/faces/aligned_faces
для выровненных и без результатов соответственно. - Двоичные маски глаз также генерируются и сохраняются в
{dir}/faces/binary_masks_eyes
. Эти двоичные маски могут служить субоптимальной альтернативой маскам, созданным с помощью prep_binary_masks.ipynb.
Прочее
Как использовать?
Выполняйте faceswap-demo.ipynb для реализации всех этапов FaceSwap в одном ноутбуке (в Google Colab).
Примечание: Для хранения обучаемых данных рекомендуется использовать Google Drive или Google Storage. В ноутбуке есть необходимые инструкции. Примечание: Для реализации проекта были выбраны не самые оптимальные параметры
from converter.config import (
ConverterConfig,
ColorCorrectionType,
ImageOutputType,
TransformDirection,
SegmentationType
)
RESOLUTION=64 # возможно: 64, 128, 256
image_shape=(RESOLUTION, RESOLUTION, 3)
# для обучения
arch_config = {
"image_shape": image_shape,
"use_self_attn": True, # SAGAN
"norm": "hybrid", # instancenorm, batchnorm, layernorm, groupnorm, none, hybrid
"model_capacity": "lite" # 'standard', 'lite'
}
# для конвертации/замены
config = ConverterConfig(
image_shape=image_shape,
use_smoothed_bbox=True,
use_kalman_filter=True,
use_auto_downscaling=False, # для понижения разрешения изображения
bbox_moving_avg_coef=0.65, # если фильтры Кальмана отключены
min_face_area=35 * 35, # минимально допустимая площадь лица для выбора
kf_noise_coef=1e-3, # коэфициент шума для фильтра Кальмана
color_correction=ColorCorrectionType.HISTMATCH, # коррекция цвета для замены, чтобы убрать несоответствие цветов лиц
detection_threshold=0.8,
roi_coverage=0.9, # размер заменяемой части лица
output_type=ImageOutputType.COMBINED, # SINGLE, COMBINED, TRIPLE - формат вывода результата
direction=TransformDirection.AtoB, # направление для замены между двумя файлами
segmentation=SegmentationType.EYES_ONLY # какие части лица заменить
)
Вышеописанный ноутбук состоит из ячеек, взятых из следующих ноутбуков:
- video_face_detection_alignment.ipynb для извлечения лиц из видео.
- prep_binary_masks.ipynb для создания двоичных масок обучающих изображений.
- faceswap_train.ipynb для обучения моделей.
- faceswap_video_conversion.ipynb для создания видео с использованием обученных моделей.
Примечание: Только для ознакомительных целей.
Формат обучающих данных
- Face images are supposed to be in
{dir}/face_src/
or{dir}/face_dst/
folder for source and target respectively. - Изображения лиц должны находиться в папке
{dir}/face_src/
или{dir}/face_dst/
для исходного и целевого лиц соответственно. - Во время обучения размер изображений будет изменен до 256x256.
Ссылки на используемые алгоритмы
Алгоритмы
- GANotebooks
- Keras-GAN
- deep-learning-with-python-notebooks
- SAGAN
- PixelShuffler layer for Keras by t-ae
- keras-contrib
- CycleGAN
- FaceNet
- cnn_finetune
- ICNR
- reddit user deepfakes’ project
Библиотека
- Jun Fu et al. - Dual Attention Network for Scene Segmentation
- Han Zhang, Ian Goodfellow, Dimitris Metaxas, Augustus Odena
- Taesung Park, Ming-Yu Liu, Ting-Chun Wang, Jun-Yan Zhu
- Jimmy Lei Ba, Jamie Ryan Kiros, Geoffrey E. Hinton - Layer Normalization
- Dmitry Ulyanov, Andrea Vedaldi, Victor Lempitsky