Как это сделано: фейковый порноролик с Галь Гадот

Изображение с сайта http://blog.otoro.net/2016/04/01/generating-large-images-from-latent-vectors/
Изображение с сайта http://blog.otoro.net/2016/04/01/generating-large-images-from-latent-vectors/

Пока все обсуждают фейковый порно-ролик шутников Deepfake с известной по роли Чудо-Женщины актрисой Галь Гадот и другими звёздами, попробуем разобраться, какие алгоритмы позволяют программистам средней квалификации генерировать столь правдоподобные фальшивки.

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

Однако в наше время приближающейся технологической сингулярности можно действовать по-другому. Программист-одиночка скачивает с гитхаба бесплатный софт от Гугла или Фейсбука, и находит несколько сотен фотографий кинозвезды в интернете. Далее в работу включаются технологии искусственных нейронных сетей.

Понять, каким образом можно сгенерировать фальшивое видео с участием требуемого персонажа, легче на классической задаче из теории машинного обучения — MNIST. Этой аббревиатурой обозначена база сканов рукописных начертаний цифр 0-9, изготовленная в далеком 1998 году Яном Лекуном, Крисом Бургесом и Коринной Кортес. С тех пор MNIST используется для сравнения разнообразных алгоритмов примерно так же часто, как задачки типа «Из пункта А в пункт Б вышел поезд...» для обучения школьников арифметике.

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

Итак, на входе нашей машины — изображение рукописной цифры размером 28х28 пикселей. Заставим машину построить собственное понимание этого изображения. Назовем такое «понимание» вектором латентного (т. е. скрытого) представления. Пусть это будет вектор Z из 32-х чисел от 0 до 1. Тогда нейронная сеть-кодировщик E преобразует изображение рукописной цифры (28х28=784 пикселя совместно с их координатами) в вектор из 32 чисел.

Теперь добавим вторую нейронную сеть-декодер D. Заставим ее нарисовать цифру, максимально похожую на ту, что закодирована сетью E в 32-вектор Z. Не вдаваясь в подробности того, как можно заставить нейросеть что-либо сделать, давайте осознаем самый важный принцип. Мы нигде не говорим нейронным сетям, что на входе цифра «0» или цифра «7». Забегая вперед, мы не будем говорить другим нейронным сетям, что на фотографии Алла Пугачева или рэпер Гнойный. Мы просто требуем, чтобы сеть сначала сжала изображение до 32 чисел, а потом восстановила максимально похоже это изображение.

Помните, что сеть Е учитывает координаты пикселей изображения? Это очень важно, и это передовой подход. Это позволяет обучить сеть D также учитывать координаты порождаемых ею пикселей, а значит генерировать картинки любого размера. Например, здесь показано, как можно из рукописных цифр MNIST генерировать мегапиксельные арты:

Изображение с сайта http://blog.otoro.net/2016/04/01/generating-large-images-from-latent-vectors/
Изображение с сайта http://blog.otoro.net/2016/04/01/generating-large-images-from-latent-vectors/

При этом вектор Z, несмотря на кажущуюся простоту, содержит в себе знания о всевозможных способах написания цифр. Вам кажется, что слово «знание» в данном контексте — преувеличение? А как вам такой результат. Закодируем такую цифру:

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

Закодируем эти единички с помощью сети Е, и получим векторы Z_1 и Z_01. Теперь немного арифметики, прибавим к вектору девятки разницу между векторами прямой и наклонной единички:

Z_09 = Z_9 + (Z_01 - Z_1)

Пропустим получившийся новый вектор девятки через сеть D и получим... наклонную девятку! Так наши нейронные сети освоили концепцию начертания символа, и много других нюансов человеческого почерка (см. блог).

Если из вектора латентного представления наклонной единицы вычесть вектор прямой единицы, то признаки ЕДИНИЦЫ как таковой сократятся, останется лишь признак "наклонное начертание"
Если из вектора латентного представления наклонной единицы вычесть вектор прямой единицы, то признаки ЕДИНИЦЫ как таковой сократятся, останется лишь признак "наклонное начертание"

Теперь от рукописных цифр перейдем по ссылке и увидим, что тот же принцип работает с любыми графическими изображениями. Например, мы можем (просто скачав программное обеспечение по указанной ссылке) довольно реалистично редактировать лица, пользуясь той же арифметикой латентного представления. Вы видите, как авторы (кстати, сотрудники компании Nvidia), прибавляют к лицу персонажа очки, улыбку или трехдневную щетину.

Изображение с сайта https://github.com/mingyuliutw/unit
Изображение с сайта https://github.com/mingyuliutw/unit

Гражданин deepfakes, автор скандального фейкового видео с образом Галь Гадот, пишет на reddit, что использовал в своей работе именно этот алгоритм ребят из Nvidia. «Я нашел хитрый способ подмены лица», заявил он. Имея несколько сотен изображений нужного персонажа, легко сгенерировать миллионы искаженных изображений, как на картинках выше, и использовать их для тренировки нейронной сети.

Здесь используется принцип состязательности: нейронную сеть учат находить искусственные подмены и восстанавливать правильное, неизмененное лицо. Состязания проходят между нейронной сетью D, которая генерирует искусственно искаженные изображения, и третьей нейронной сетью А, которая должна определить, искусственное или реальное изображение ей показали. В конечном итоге, нейронная сеть А нам нужна только для того, чтобы обучить D как можно правдоподобнее генерировать изображения заданного лица из произвольного лица в произвольном ракурсе, с учетом мимики, освещения и т.п.

Если после этого подать на вход сети видео с дешевой дублершей, сеть решит, что это очередная подмена и «восстановит» в кадре лицо актрисы, на портретах которой обучалась нейронная сеть.

В этой области, только без "глубоких фейков" , в России работает Научно-исследовательский кинофотоинститут (НИКФИ) - легенда отечественной кинотехнической науки. На его счету и "Оскар" за стереокино в СССР, и фотографирование обратной сторны Луны, а теперь вот нейросети и искусственный интеллект.
Мы в НИКФИ активно изучаем возможности применения нейросетевых технологий в кинопроизводстве. Разработанные нами решения уже внедряются в системах управления медиа-архивами для контроля качества и автоматической аннотации кинофотодокументов. Нейронные сети используются в крупном проекте многокамерной видеосъемки для генерации объемной модели сцены. Этот результат мы планируем использовать при создании голографического телевидения.
Мы обязательно поэкспериментируем с состязательными нейронными сетями и вариационными автокодировщиками, описанными в этой статье, для создания виртуальных персонажей и попытаемся реализовать удобное программное обеспечение для конвейера кинопроизводства.
Приглашаем студентов и аспирантов на стажировку и работу в самых передовых областях компьютерной графики, виртуальной реальности и искусственного интеллекта!