30
правок
Изменения
Нет описания правки
'''DeepfakeДипфейк''' (''англ. дипфейк'') {{---}} результат работы ряда алгоритмов для синтеза изображений человеческого лица или голоса. Основные алгоритмыАлгоритмы, применяемые для решения данной задачи основаны на ГенеративноПорождающе-состязательных сетях. Современные алгоритмы позволяют генерировать не только лицо человека, но и его голос. C таким примером можно ознакомится по ссылке [https://www.youtube.com/watch?v=2svOtXaD3gg Home Stallone DeepFake]
[[Файл:Deep_fake_title_crop.png|thumb|400px|Примеры дипфейков #1]]
Задача замены лиц или генерация Deepfake изображений состоит в том, чтобы перенести лицо с исходного (source) изображения на нужное (target) изображение. Такой перенос должен быть бесшовным и незаметным человеческому глазу.
Одним из этапов замены является реконструкция лица. Реконструкция лица заключается в изменении лица из source изображения, так чтобы мимика и любая лицевая геометрия была соблюдена и соответствовала target изображению.
Методы, решавшие данную задачу в прошлом, были основаны на детектировании ключевых точек лица и далее анимацией получившегося меша используя триангуляцию данные точки, с помощью триангуляции Делоне<ref name=Delaunay>[https://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D1%80%D0%B8%D0%B0%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%94%D0%B5%D0%BB%D0%BE%D0%BD%D0%B5 Триангуляция Делоне]</ref> строилась сетка(меш) лица и все треугольники из source изображения масштабировались в соответствии с target изображением. В основе современных алгоритмов лежат Генеративно-Состязательные Сети сети с различными модификациями.Так же некоторые из используемых методов основаны на попытке аппроксимации некого распределения признаков. Данные методы пытаются вычислить соответствующее распределение и переносят с помощью нейронных сетей эти скрытые представления. В результате генерируется новое фотореалистичное лицо, которое соответствует необходимым характеристикам и метрикам. Первые методы как было сказано выше были основаны на детектировании ключевых точек, одним Одним из известных алгоритмов в этой области является Face2Face<ref name=Face2Face>[http://www.graphics.stanford.edu/~niessner/thies2016face.html Face2Face]</ref>, метод вычисляет меш лица и с помощью алгоритма 3D morphable face model<ref name=3DmorphableFaceModel>[https://arxiv.org/pdf/1909.01815.pdf 3D Morphable Face Model]</ref> переносит геометрию.Методам на основе Генеративно-состязательных сетей не требуется никакие многоуровневые эвристические методы, они берут исходное изображение и сразу делают перенос в end-to-end стилепропуская промежуточные шаги.
== Реконструкция лица и сегментация ==
Первый этап рассмотренного рассматриваемого алгоритма состоит из двух шагов, сегментации лица в target и source изображениях и изменением изменении геометрии из source лица, чтобы оно соответствовало target геометрии лица.Имея изображение $I \in {\rm I\!R}^{3 \times H \times W}$ и тепловую карту лицевых точек соответствующего изображения $H(p) \in {\rm I\!R}^{N \times H \times W}, p \in {\rm I\!R}^{N \times D}$, где $N$ {{--- }} число точек, $D$ {{--- }} размерность точек, обычно она равна 2, а число точек не превышает 70, мы обучаем генератор, чтобы он делал трансформацию данной тепловой карты и входного изображения в изображение с необходимой нам геометрией $G_r : \{ {\rm I\!R}^{3 \times H \times W}, {\rm I\!R}^{N \times H \times W} \} \to {\rm I\!R}^{3 \times H \times W} $.Пусть $v_s, v_t \in {\rm I\!R}^{70 \times 3}$ и $e_s, e_t \in {\rm I\!R}^{3}$ будут $3$ мерными трёхмерными ключевыми лицевыми точками лица и углами Эйлера <ref name=euler>[https://ru.wikipedia.org/wiki/%D0%A3%D0%B3%D0%BB%D1%8B_%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%B0 Углы Эйлера]</ref> в соответствии к $F_s$ и $F_t$, где $F_s$ {{---}} лицо с source изображение, $F_s$ {{---}} лицо с target изображение. Тогда мы построим 2D проекцию $p_j$ интерполируя между $e_s$ и $e_t$ и центроидами $v_s$ и $v_t$ , и используя промежуточные точки мы обратно спроецируем $v_s$ на $I_s$.Другими словами алгоритм реконструкции является рекурсивным для каждой итерации $i< j < n$:
$I_{r_{j}}, S_{r_{j}} = G_r(I_{r_{j - 1}};H(p_j)), I_{r_{0}} = I_s, i < j < n$
Наша модель $G_r$ имеет 2 двы выхода, первый на выходе . Первый выход выдает изображение с перенесенной геометрией, второй выход {{---}} маску для сегментации. Так же стоить заметить, что маска для сегментации содержит в себе часть лица с кожей и часть с волосами отдельно. Такой подход позволяет увеличить точность всего процесса переноса.
Такой генератор обучается с помощью следующей функцию потерь:
$Loss(G_r) = \lambda_{stepwise} Loss_{rec}(I_{r_{n}}, I_{t}) + \lambda_{rec}Loss_{rec}(I_{r}, I_{t}) + \lambda_{adv}Loss_{adv} + \lambda_{seg}Loss_{pixel}(S_r, S_t)$
$Loss(G_s) = Loss_({CE) } + \lambda_{reenact}Loss_{pixe}(S_t, S_{t} {r})$
Где $G_r$ {{- --}} генератор переноса геометрии, $G_s$ {{--- }} генератор сегментации лица.
[[Файл:Deep_fake_more_results.png|thumb|400px|Примеры дипфейков #2]]
== Перенос сгенерированного лица ==
Далее после того, как мы получили изображение лица с нужной нам геометрией необходимо перенести его на исходное изображение.
Общеизвестным способ переноса геометрии одной текстуры на другую является перенос полигонов из сеток двух мешей<ref name=trns>[https://cmsc733.github.io/assets/2019/p2/results/pdf/Abhi1625_p2.pdf Face Swap]</ref>. Однако существуют более современные способы.
Имея множество исходных изображения $\{ I_{s_0}, ..., I_{s_{n}} \}$, углов Эйлера $ \{e_1, ..., e_n \}$ лиц $\{ F_{s_{0}}, ..., F_{s_{n}} \}$ строится карта внешнего вида (appearance map).
Строится она следующим образом.
В начале соответствующие углы Эйлера проецируются на плоскость. Далее используя С помощью K-D дерева <ref name=kd>[https://neerc.ifmo.ru/wiki/index.php?title=%D0%9A-d_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F_%D0%B8_%D0%BF%D0%B5%D1%80%D0%B5%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%82%D0%BE%D1%87%D0%B5%D0%BA_%D0%B2_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B5_(%D1%81%D1%82%D0%B0%D1%82%D0%B8%D0%BA%D0%B0) K-D дерево tree]</ref> точки в пространстве сегментируются и удаляются слишком близкие по расстоянию, поскольку они не несут в себе много полезной информации, а вычислительная сложность разительно увеличивается. В конце используя Используя оставшиеся точки мы строим меш лица , используя триангуляцию Делоне<ref name=Delaunay>[https://arxivneerc.orgifmo.ru/abswiki/1311index.0117 php?title=%D0%A2%D1%80%D0%B8%D0%B0%D0%BD%D0%B3%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%94%D0%B5%D0%BB%D0%BE%D0%BD%D0%B5 Триангуляция Делоне]</ref>.
Для каждого угла $e_t$ лица $F_t$, точки $x_t$ мы ищем треугольник $T$ соответствующий данной точке.
Пусть $x_{i_{1}}, x_{i_{2}}, x_{i_{3}}$ будут трисом (треугольником) $T$ и $I_{s_{i_{1}}}, I_{s_{i_{2}}}, I_{s_{i_{3}}}$ {{---}} соответствующие лица. Необходимо вычислить барицентрические координаты <ref name=bari>[https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D1%80%D0%B8%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D1%8B Барицентрические координаты]</ref> $\lambda_{1}, \lambda_{2}, \lambda_{3}$ от $x_t$ относительно $x_{i_{1}}, x_{i_{2}}, x_{i_{3}}$. Тогда результат интерполяции:
$I_r = \sum_{k=1} {3} \lambda_k G_r(I_{s_{i_{k}}}; H(p_t))$
$f(i, j) = I_t(i, j), \forall S_t(i, j) = 0$
$\nabla$ {{- --}} оператор взятия градиента.
Данное уравнения используется в качестве функции для оптимизации нашего генератора $G_b$, который и будет заниматься отрисовкой финальной версии нашего Deepfake изображения.