Хабрахабр

3D-реконструкция лиц по фотографии и их анимация с помощью видео. Лекция в Яндексе

В фильме «Миссия невыполнима 3» был показан процесс создания знаменитых шпионских масок, благодаря которым одни персонажи становятся неотличимы от других. По сюжету, сначала требовалось сфотографировать того, в кого герой хотел превратиться, с нескольких ракурсов. В 2018 году простую 3D-модель лица можно пусть и не напечатать, но, по крайней мере, создать в цифровом виде — причём на основе всего одной фотографии. Научный сотрудник VisionLabs подробно описал процесс на мероприятии Яндекса «Мир глазами роботов» из серии Data&Science — с детализацией до конкретных методов и формул.

— Добрый день. Меня зовут Николай, я работаю в компании VisionLabs, которая занимается компьютерным зрением. Наш основной профиль — распознавание лиц, но также у нас есть технологии, которые применимы в дополненной и виртуальной реальности. В частности, у нас есть технология построения 3D-лица по одному фото, и сегодня я буду рассказывать о ней.

На слайде вы видите исходную фотографию Джека Ма и 3D-модель, построенную по этой фотографии в двух вариациях: с текстурой и без текстуры, просто геометрию. Начнем с рассказа о том, что это такое. Это задача, которую мы решаем.

д. Также мы хотим иметь возможность анимировать эту модель, менять направление взгляда, выражение лица, добавлять мимику и т.

Самое очевидное — игры, в том числе VR. Приложение находится в разных областях. Можно делать 3D-печать, потому что некоторым людям интересны персонализированные аксессуары под их лицо. Ткже можно делать виртуальные примерочные — примерять очки, бороды и прически. И можно делать лица для роботов: как печатать, так и показывать на каком-нибудь дисплее на роботе.

После этого мы остановимся на анимации и перейдем к челледжам, которые возникают в этой области. Я начну с рассказа о том, как вообще можно генерировать 3D-лица, и потом мы перейдем к задаче 3D-реконструкции как обратной задаче генерации.

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

Крайнее левое лицо на слайде — некая усредненная модель, к которой мы можем применять деформации с помощью настраивания ползунков. Один из способов решения задачи генерации — деформируемые модели. В верхнем ряду идут лица в сторону увеличения интенсивности ползунка, в нижнем ряду — в сторону уменьшения. Здесь представлено три ползунка. Устанавливая их, можно придавать лицам разные формы. Таким образом, мы будем иметь несколько настраиваемых параметров.

Чтобы построить деформируемую модель, нужно для начала взять несколько людей, привезти их в специальную лабораторию и отснять их лица специальным оборудованием, переведя их в 3D. Примером деформируемой модели является знаменитая Basel Face Model, построенная из сканов лиц. Потом на основе этого можно делать новые лица.

Мы можем представить трехмерную модель лица как вектор в 3n-мерном пространстве. Как это устроено математически? Здесь n — количество вершин в модели, каждой вершине соответствует три координаты в 3D, и таким образом мы получаем 3n-координаты.

Если мы имеем набор сканов, то каждый скан представлен таким вектором, и мы имеем набор из n таких векторов.

При этом нам хотелось бы, чтобы коэффициенты были какие-то осмысленные. Далее мы можем строить новые лица как линейные комбинации векторов из нашей базы. Одним из ограничений можно установить, чтобы все коэффициенты лежали в промежутке от 0 до 1. Очевидным образом они не могут быть совсем произвольными, и я скоро покажу почему. Это нужно делать, потому что если коэффициенты будут совсем произвольными, то лица будут получаться неправдоподобные.

То есть мы хотим смотреть на набор параметров и понимать, правдоподобное получится лицо или нет. Здесь хотелось бы придать параметрам какой-то вероятностный смысл. Этим мы хотим добиться того, чтобы искаженным лицам соответствовали низкие вероятности.

Мы можем применить метод главных компонент к набору сканов. Вот как это можно сделать. Тогда мы сможем по-новому взглянуть на генерацию лиц, мы будем представлять лица как некоторое усредненное лицо, плюс матрица главных компонент, умноженная на вектор параметров. На выходе мы получим усредненное лицо S0, получим матрицу V, набор главных компонент, а также получим вариации данных вдоль главных компонент.

А также мы можем приписать вектору параметров некоторое вероятностное значение. Значение параметров — это те самые интенсивности ползунков, о которых я говорил на одном из ранних слайдов. В частности мы можем договориться, чтобы этот вектор был гауссовским.

Как на предыдущем слайде, мы имеем два набора параметров, два вектора α id и α exp, они такие, как на предыдущем слайде, но α id отвечает за форму лица, а α exp будет отвечать за эмоцию. Таким образом у нас получается метод, который позволяет генерировать 3D-лица, и эта генерация управляется следующими параметрами.

Он имеет такую же размерность, как вектор формы, и каждой вершине в этом векторе соответствуют три RGB-значения. Также появляется новый вектор T — вектор текстуры. Здесь не формализованы параметры, которые будут отвечать за освещение лица и за его положение, но они также существуют. Аналогичным образом вектор текстуры генерируется с помощью вектора параметров β.

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

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

д. На выходе мы будем иметь все параметры, на слайде представлены α id и α exp, а также будем иметь освещение, параметры текстуры и т.

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

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

Для этого можно использовать 68 ключевых точек лица. Как можно делать инициализацию? Поэтому мы имеем способ надежно детектировать 68 точек лица. Начиная с 2013-2014 года появилось очень много алгоритмов, которые позволяют с довольно хорошей точностью детектировать 68 точек, и сейчас они приближаются к сатурации своей точности.

Мы размечаем эти точки на модели, потом модель как-то деформируем, крутим, проецируя точки, и следим за тем, чтобы положения точек совпадали. Мы можем добавить в нашу функцию энергии новое слагаемое, которое будет говорить о том, что мы хотим, чтобы проекции таких же 68 точек модели совпадали с ключевыми точками лица. Одни точки были детектированы алгоритмом, а другие — спроецированы из модели. На левой фотографии точки двух цветов, фиолетового и желтого. Это сделано, потому что когда лицо поворачивается, разметка этих точек должна измениться, и точка выбирается с линией. Справа разметка точек на модели, но для точек по краю лица размечена не одна точка, а целая линия.

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

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

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

α id — параметры формы лица, α exp — параметры выражения, β — параметры текстуры, р — прочие параметры, о которых мы поговрили, но не формализовали их, это параметры положения и освещения. Коэффициенты при слагаемых в процессе минимизации не оптимизируются, они просто заданы.
Здесь функция энергии представлена как функция всех параметров.

Эту функцию энергии можно упростить. Остановимся на таком замечании. И это позволит построить какую-то 3D-модель. Из нее можно выбросить слагаемое, которое отвечает за текстуру, и использовать только информацию, передаваемую 68 точками. Слева представлена модель, построенная только по ключевым точкам. Однако обратите внимание на профиль модели. Обратите внимание, что справа профиль получается более соответствующий центральной фотографии, которая представляет фронтальный вид лица. Справа представлена модель с использованием текстуры при построение.

Вспомним, что при построении 3D-модели мы получаем два вектора параметров, один отвечает за форму, другой — за выражение. Анимация при имеющемся алгоритме построения 3D-модели лица работает достаточно просто. У пользователя один вектор параметров формы, у аватара он другой. Эти векторы параметров у пользователя и у аватара всегда будут свои. Мы возьмем параметры, отвечающие за выражение лица пользователя, и просто подставим их в модель аватара. Однако мы можем сделать так, чтобы векторы, отвечающие за выражение, у них стали одинаковы. Таким образом мы перенесем выражение лица пользователя на аватар.

Поговорим о двух челеджах в этой области: скорость работы и ограниченность деформируемой модели.

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

Можно использовать больше ресурсов, некоторые люди решают эту задачу на GPU. Как с этой проблемой можно бороться? И можно использовать методы машинного обучения. Можно использовать только ключевые точки, но при этом пострадает качество.

Вот работа 2016 года, в которой переносится выражение лица пользователя на некоторое заданное видео, вы можете управлять видео с помощью вашего лица. Посмотрим по порядку. Здесь построение 3D-модели производится в реальном времени с использованием GPU.

Идея в том, что мы можем сначала взять большую базу лиц, для каждого лица долгим, но точным алгоритмом построить 3D-модели, каждую модель представить как набор параметров, и дальше обучить сетку эти параметры предсказывать. Вот методы, которые используют машинное обучение. В частности, в этой работе 2016 года используется ResNet, который на вход берет изображение, а на выход дает параметры модели.

В этой работе 2017 года 3D-модель представляется не как набор параметров, а как набор вокселей. Трехмерную модель можно представлять и по-другому. Стоит заметить, что возможны варианты обучения сети, для которых 3D-модели вообще не требуются. Сеть предсказывает воксели, превращая картинку в некоторое трехмерное представление.

Здесь наиболее важная часть — слой, который может взять на вход параметры деформируемой модели и срендерить картинку. Это работает следующим образом. Сеть принимает на вход изображение, предсказывает параметры, скармливает эти параметры слою, который рендерит изображение, сравнивает это изображение с входным, получает ошибку, делает обратное распространение ошибки и продолжает обучаться. Он обладает таким замечательный свойством, что через него можно делать обратное распространение ошибки. И это очень интересно. Таким образом сеть учится предсказывать параметры трехмерной модели, имея в качестве обучающих данных только картинки.

Давайте формализуем, что это значит, как можно оценить точность 3D-реконструкции лица. Мы много говорили о точности — в частности, что она страдает, если мы выбрасываем какие-то слагаемые из функции энергии. Если такая база есть, то мы можем наши реконструируемые модели сравнивать с ground truth. Для этого нужна база ground truth сканов, полученных с помощью специального оборудования, с помощью методов, относительно которых есть какие-то гарантии точности. Это нужно делать, потому что лица бывают разные, какие-то больше, какие-то меньше, и на маленьком лице ошибка была бы меньше, просто потому что само лицо меньше. Это делается просто: мы считаем среднее расстояние от вершин нашей модели, которую мы построили, до вершин в ground truth, и нормируем на размер скана. Поэтому нужна нормировка.

Мы делаем похожие вещи, мы обучаем MobileNet предсказывать параметры деформируемой модели. Я хотел бы рассказать про нашу работу, она будет на воркшопах, есть ECCV. Оцениваем точность на базе сканов BU4DFE. В качестве обучающих данных мы используем 3D-модели, построенные для фотографий из датасета 300W.

Мы сравниваем два наших алгоритма с state of the art. Вот что получается. Здесь по оси Х — ошибка, о которой мы только что говорили, среднее расстояние между вершинами. Желтая кривая на этом графике — алгоритм, который занимает 30 секунд и заключается в минимизации полной функции энергии. На этом графике чем выше кривая, тем лучше. По оси Y — доля изображений, на которых эта ошибка меньше, чем та, что на оси X. Далее три работы, о которых мы говорили. Следующая кривая — наша сеть, основанная на архитектуре MobileNet. Сеть, предсказывающая параметры, и сеть, предсказывающая воксель.

Здесь получается выигрыш, поскольку мы используем MobileNet, достаточно легкий. Также мы сравнивали нашу сеть с аналогами в терминах размера модели и скорости работы.

Второй челендж — ограниченность деформируемой модели.

Здесь тени на крыльях носа. Обратите внимание на левое лицо, посмотрите на крылья носа. Причиной этого может быть то, что деформируемая модель в принципе не способна построить нос требуемой формы, потому что эта деформируемая модель была получена из сканов всего 200 лиц. Границы теней не совпадают с границами носа на фотографии, таким образом получается дефект. Таким образом, нам нужно за рамки деформируемой модели как-то выйти. Нам хотелось бы, чтобы нос все-таки был правильный, как на правой фотографии.

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

Вернемся к обозначению меша как вектора в 3n-мерном пространстве и посмотрим на оператор усреднения. Это можно делать следующим образом. Соседи вершины — это те, что соединены с ней ребром. Это оператор, который в S с шапкой заменяет каждую вершину на среднее ее соседей.

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

Они делали 3D-реконструкцию лиц по нескольким фотографиям. Такие техники применялись, например, в работе 2015 года. Делали несколько фотографий с телефона, получали облако точек, а дальше адаптировали модель лица к этому облаку с помощью непараметрической модификации.

Остановимся на действии оператора сглаживания. За рамки деформируемой модели можно выйти и другим способом. На модели слева есть много деталей, на модели справа эти детали были сглажены. Здесь для простоты представлен двумерный меш, к которому был применен этот оператор. А можем ли мы что-то сделать, чтобы детали добавить, а не убрать?

Оператор сглаживания модифицирует коэффициенты меша в разложении по этому базису. Для ответа мы можем посмотреть на базис векторов оператора сглаживания.

Можно делать и по-другому: просто модифицировать эти коэффициенты каким-то внешним образом. Обязательно ли решать задачу таким образом? Такая техника действительно позволяет получить улучшения, так делается в работе 2016 года. Давайте просто возьмем несколько первых векторов оператора сглаживания и добавим его в нашу деформируемую модель как новый набор ползунков. На этом мой доклад завершается, всем спасибо.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть