предисловие
Некоторое время назад Deepfake был очень популярным приложением для изменения лица. С технической точки зрения, это очень успешное применение модели глубокого создания изображений. Хотя за последние два года было опубликовано много статей о моделях создания изображений, большинство из них можно Это демонстрация, и она не имеет большой практической ценности, если только она не относится к конкретной области (например, к медицине), даже если это шедевр Nvidia: постепенное создание лиц высокой четкостиPGGANКажется, что академическое значение больше, чем практическое значение. На самом деле, люди всегда искали более общую технологию генерации. Я думаю, что Deepfake является примером. Давайте начнем с этого и посмотрим, сможем ли мы получить от этого вдохновение.
1. Базовая структура
Давайте посмотрим, что такое дипфейк на самом деле Принцип можно сформулировать в одном предложении: используйте обучение с учителем для обучения нейронной сети восстановлению искаженного лица Чжан Саня до исходного лица и ожидайте, что эта сеть сможет восстановить любое лицо. лицом к способностям трех лиц Чжан Саня.
После долгого разговора это похоже на модель с автоматическим кодированием~, да,Оригинальная копияДипфейк такой, формула следующая:
XW здесь представляет собой искаженную картину. Некоторые люди, которые использовали обувь Deepfake, могут задаться вопросом: «Кажется, для запуска кода должны потребоваться данные о лицах двух человек». Правильно, причина использования данных двух человек одновременно не в том, что алгоритм может обмениваться только А и Б, а в повышении стабильности, т.к. сеть Encoder общая, а сеть Deocder отдельная, формула выше:
Для простоты понимания скопировалВторой проект(Добавлена версия Гана) на изображении описания:
Особое примечание: в оригинальной версии нет маски~
Я не собираюсь обсуждать версию 2, просто представлю, вкратце, добавление Adversarial Loss и Perceptual Loss, последнее представляет собой семантическое сравнение с параметрами обученной сети VGGFace (сеть не обучена).
2. Технические детали
Весь процесс Deepfake включает в себя три шага: один — извлечение данных, другой — обучение, а третий — конвертация. Первый и третий этапы требуют предварительной обработки данных, а на третьем этапе также используется технология слияния изображений. Поэтому я в основном анализирую его в трех аспектах: предварительная обработка изображений, сетевая модель и слияние изображений.
1. Предварительная обработка изображения
Определять и вырезать изображения лиц из больших изображений (или видео).В оригинальной версии используется библиотека распознавания лиц в dlib (этот модуль распознавания можно заменить).Эта библиотека может не только находить лица, но и выдавать людям координаты 36 ключевые точки лица, угол лица может быть рассчитан в соответствии с этими координатами, и окончательное извлеченное лицо представляет собой выпрямленное лицо.
2. Сетевая модель
Encoder: 64x64x3->8x8x512
x = input_
x = conv(128)(x)
x = conv(256)(x)
x = conv(512)(x)
x = conv(1024)(x)
x = Dense(ENCODER_DIM)(Flatten()(x))
x = Dense(4 * 4 * 1024)(x)
x = Reshape((4, 4, 1024))(x)
x = upscale(512)(x)
Decoder:8x8x512->64x64x3
x = input_
x = upscale(256)(x)
x = upscale(128)(x)
x = upscale(64)(x)
x = Conv2D(3, kernel_size=5, padding='same', activation='sigmoid')(x)
Вся сеть не сложная, это не что иное, как свертка плюс полное соединение, кодирование -> декодирование, но после тщательного изучения я обнаружил, что автор на самом деле гениален, почему я не спешу говорить, давайте посмотрим при внутренней реализации con и upscale:
def conv(filters):
def block(x):
x = Conv2D(filters, kernel_size=5, strides=2, padding='same')(x)
x = LeakyReLU(0.1)(x)
return x
return block
def upscale(filters):
def block(x):
x = Conv2D(filters * 4, kernel_size=3, padding='same')(x)
x = LeakyReLU(0.1)(x)
x = PixelShuffler()(x)
return x
return block
conv — хорошо зарекомендовавшая себя функция активации свертки плюс lrelu. В апскейле есть функция под названием PixelShuffler. Эта функция очень интересна. Ее функция — изменить размер фильтра на 1/4 от исходного, а высота — h а ширина w становится в два раза больше исходной, поэтому фильтр предыдущего сверточного слоя умножается на 4.
После тестирования и сравнения, например, удаления апскейла и замены его перемоточным станком с размером шага 2, или просто изменением размера в два раза по сравнению с оригиналом, эффект от эксперимента сильно снижается. Хотя автор не говорит, что этот дизайн является отсылкой к идее той статьи, и автор не читал статью, в которой напрямую обсуждается этот вопрос, есть статья, которую можно доказать:Deep Image Prior, включая полносвязные слои в Encoder, искусственно нарушают пространственную зависимость изображения, увеличивая сложность обучения, чтобы сеть могла более полно понимать изображение. Таким образом, полностью подключенный слой и PixelShuffler в кодировщике необходимы. После авторского теста, без добавления Гана, если убрать эти два элемента, сеть выйдет из строя.
3. Слияние изображений
Слияние изображений обсуждается при анализе технических трудностей.
3. Анализ сложности
1. Проблемы с ясностью
Исходный пиксель лица 64*64, что явно мало, но улучшить четкость лица нужно не только за счет улучшения разрешения картинки, но и за счет метода обучения и функции потерь. Хорошо известно, что простой L1Loss является математически средним и может привести к размытию. Решение лично предпочитает добавлять GAN на основе L1Loss, потому что GAN под строгим контролем имеет возможность различать более тонкие различия, которые упоминаются во многих статьях, таких как более ранняя.Статьи о сверхвысоком разрешении. Но у GAN тоже есть много проблем, о которых речь пойдет позже. Другая идея состоит в том, чтобы использовать PixelCNN для улучшения деталей, но на практике этот метод не только медленнее генерирует (хотя скорость можно в определенной степени оптимизировать, добавляя механизм кэширования), но и не так хорош, как GAN по качеству. .
2. Проблема распознавания лиц
Поскольку первым шагом является предварительная обработка лица, алгоритм должен сначала распознать лицо перед его обработкой, а алгоритм обнаружения лица в dlib должен быть «анфас». Если вы не можете его распознать, вы не можете «изменить свое лицо". Итак, второй проект использует MTCNN в качестве механизма распознавания.
3. Проблема эффекта преобразования лица
Эффект исходного алгоритма преобразования лица, автор считает его недостаточным, например, преобразование из A-> B, качество B связано с исходным изображением A, что легко понять из-за алгоритма себе, по XW -> X, как бы ни был закручен X, всегда будет предел. Таким образом, эффект от создания красоты В из красоты А гораздо лучше, чем от уродливого человека А, порождающего красоту В. Я думаю, что для решения этой проблемы проще всего придумать Gan.Средства вроде Cycle-Gan могут выполнять неконтролируемое семантическое преобразование. Кроме того, исходный алгоритм перехватывает только среднюю часть лица, а подбородок и лоб не входят в обучающую картинку, так что есть еще много возможностей для улучшения.
4. Проблема слияния изображений
Так как сгенерированный квадрат - это проблема, то как слить с исходным изображением - это проблема.Существует много методов слияния для исходного проекта, в том числепрямое покрытие,наложение маски, и естьКлонирование Пуассона «Бесшовное клонирование», с точки зрения эффекта, эффект покрытия маски и клонирование Пуассона являются лучшими, оба имеют свои преимущества, края покрытия маски относительно жесткие, а клонирование Пуассона очень мягкое, и его эффект одиночного изображения лучше, чем у маски, но из-за клонирования Пуассона немного сдвинет картинку, поэтому в видеокомпозиции будет некоторое дрожание. Идею улучшения задачи слияния изображений автор считает, что начинать все же необходимо с генерации самого изображения.Второй проектВведение маски — очень хорошая идея, а также относительно простая идея, то есть в конечном итоге создается RAGB-изображение с прозрачностью. Также автор перепробовал множество способов, среди которых эффект лучше:Добавьте очень маленький самосокращающийся L1Loss при вводе Gan, сделайте картинку "гармоничной, но разной". После тестирования этот метод может в основном объединить край изображения с исходным изображением, но у этого метода также есть недостатки, то есть сеть не хочет пробовать относительно большое изменение, такое как другая форма лица, и сеть имеет тенденцию сделать мелкий ремонт.небольшое дополнение,только меняет характеристики пяти чувств.
5. Проблема с дрожанием видео
Дрожание видео является критической проблемой. В основном это происходит из двух моментов.Первый пункт-это проблема прерывания распознавания лиц.Например, в 30 последовательных кадрах 1-секундного видео внезапно появляется несколько кадров, которые невозможно распознать из-за проблем с углом или четкостью. Второй момент заключается в том, что точность самого алгоритма приведет к изменению размера лица. Это вызвано самим алгоритмом, потому что это всегда XW->X, а XW искажается.При увеличении XW алгоритм должен восстанавливать от большего к меньшему.При уменьшении XW он должен уменьшаться от малого.Восстановить большой. То есть для одного и того же изображения лица ему имеет смысл синтезировать лицо, которое больше или меньше его самого, кроме того, когда угол лица сильно меняется, дрожание будет более очевидным. В настоящее время нет хорошего решения для дрожания видео, и единственный способ - постоянно улучшать точность алгоритма и в то же время повышать точность распознавания и преобразования лиц.
4. Дипфейк на улучшенной версии Гана
Присоединяйтесь к Гану в оригинальной версии,Второй проектЭто то, что автор провел глубокое исследование.
Преимущество Gan заключается в том, что он может выполнять преобразование стиля быстрее.При тех же параметрах Gan обучается 2w раз, чтобы создать относительно четкое целевое лицо, в то время как исходному алгоритму требуется около 5w или более.Ганское лицо более четкое и может уменьшить зависимость от исходного образа.Подождите, после одновременного добавления Гана зависимость от конкретной модели сети может быть уменьшена, а FC и Shuffer в исходной сети могут быть полностью удалены.
Недостатки Гана также заметны, и его обучение, как известно, трудно контролировать. Ган принесет много неконтролируемых факторов. Например, если цвет кожи человека белый, сгенерированное лицо также станет белым, но вы забудете, чтобы цвет кожи соответствовал исходному изображению. челка Ган также подумает, что у человека должна быть челка, независимо от того, есть ли челка на исходном изображении. Даже если будет добавлено Состояние, «субъективные» и «самодовольные» характеристики Гана не могут быть искоренены.В общем, после присоединения к Гану вы часто будете «обучаться». Эта ситуация также имела место в проекте генерации шрифтов, который автор делал ранее. Например, при синтезе символов династии Сун из жирных символов Ган часто добавляет галочку к длинной вертикали крючка «忄» (например, «刂»). . Кроме того, один из самых больших недостатков Гана в том, что он будет слишком подходить к образцам обучающей выборки без учета факторов экспрессии, например, человек на исходной картинке смеется, а таких картинок в обучающей мало. установлен, поэтому сгенерированные изображения могут быть только улыбающимися. Я не могу не вспомнить статью Nvidia.Хотя безусловный Ган может генерировать изображения высокой четкости, он не может искусственно управлять случайным фактором z, и невозможно указать, какое лицо генерировать, а условные образцы Гана слишком дорогие. . Этот основной недостаток GAN сделает выражения персонажей в сгенерированном видео очень жесткими, а ситуация с дрожанием изображения будет более серьезной.Даже если добавить сильный контроль L1Loss, GAN все равно будет иметь вышеуказанные недостатки. Короче говоря, добавление Гана на основе оригинальной версии требует дальнейших исследований.В 2017 году работ Гана было много, но не так много бросающихся в глаза вещей.Гугл даже выпустил статью, в которой говорится, что так много улучшенных версий такие же, как и оригинальные.Разница не существенная.После тестирования автор сделал вывод,что самое сложное в Гане это то,что джиттер большой,и эффект при синтезе видео не очень.Может причина в том,что Ган слишком сильный .
V. Заключение
С чисто технической точки зрения Deepfake - очень хорошее приложение. Автор надеется, что его можно будет использовать в правильном направлении. Оно может сыграть роль в кинопроизводстве, записи воспоминаний, документальных фильмов и действительно восстановить первоначальный вид исторических Это не могут сделать одни только актеры и гримеры. Автор также ожидает, что в 2018 году появятся генеративные модели на основе изображений с более практичными приложениями.