Автор: Георгий Маркелов, разработчик Softellion
Оглавление
Введение
Еще совсем недавно в анимации персонажей за стандарт были приняты такие системы, как, например, анимация на основе ключевых кадров (keyframe) или процедурная анимация, подразумевающая под собой целое семейство совершенно различных подходов — на основе обратной кинематики, ragdoll, или более комплексных разработок (GTA IV — Euphoria). Однако, несмотря на широкое применение, они не лишены существенных недостатков — нереалистичность, дороговизна, ограниченная выразительность, потребность в ручном труде, сложность с выдерживанием единого художественного стиля. Затем пришел motion matching, обеспечивающий совершенно иной уровень качества анимации, но и позволить себе такие системы могут только разработчики проектов ААА уровня. К тому же такая система чрезвычайно требовательна к оперативной памяти ввиду необходимости хранить в ней всю библиотеку анимаций.
Некоторые из перечисленных недостатков естественным образом решаются посредством применения машинного обучения благодаря низкому потреблению памяти, масштабируемости в контексте данных и способности к обобщению. Сегодня можно наблюдать новый сдвиг: все больше задач, связанных с движением, мимикой и поведением персонажей, передаётся моделям машинного обучения. Причина проста — игры, VR/AR‑системы, виртуальные актёры, интерактивные симуляции — требуют не просто красивой анимации, а реалистичного поведения в реальном времени, адаптирующегося к окружению и действиям пользователя, чего традиционные системы не могут обеспечить.
Нейросети способны учиться на больших наборах данных захвата движения, предсказывать движение для следующих кадров, синтезировать переходы между позами, управлять походкой, балансом, реакциями на препятствия и даже мимикой, синхронизированной с голосом. В результате мы получаем анимацию, которая выглядит естественно, но при этом генерируется на лету — без заранее подготовленных клипов. Тем не менее вместе с новыми возможностями приходят и новые вызовы: производительность, стабильность, контроль над результатом, требования к качеству данных и интеграция в существующие пайплайны.
В этой статье я приведу некоторые решения для анимации персонажей, основанные на машинном обучении, которые имеются на данный момент. Поскольку рассматриваемые далее решения довольно тесно связаны с технологией motion matching, то в начале приведу по ней небольшую справку.
Motion matching является алгоритмом поиска и выбора в базе данных анимаций той позы, которая наилучшим образом подходит для данного контекста. На данный момент эта технология позволяет получать наиболее отзывчивые и правдоподобные анимации. Использовалась в следующих проектах: The Last of Us, For Honor, Fortnite.
Вместо того, чтобы описывать анимацию через граф состояний, motion matching позволяет аниматорам задавать параметры позы (features — фичи), которая должна быть получена, и она автоматически будет выбрана методом ближайшего соседа. Из этого следует, что качество и разнообразие анимаций напрямую зависят от размера базы данных. Благодаря тому, что сам по себе алгоритм берет позу из базы данных как есть, применяя только смешивание и добавляя постобработку, сохраняется качество исходной анимации, и аниматоры сохраняют контроль над результатом. Поэтапно процесс работы motion matching можно представить так:
-
вычисляется желаемая траектория движения
-
выполняется поиск в базе данных наиболее подходящей позы, учитывая параметры позы и траекторию движения
-
поза, наиболее близкая к найденной, назначается персонажу
-
постобработка
-
повторить пункты 1-4
Процесс насыщения базы данных анимаций новым материалом прост, может выполняться и отлаживаться в режиме реального времени. Получается, что потребление памяти растет линейно с количеством данных и параметров для поиска позы. В итоге задача сводится к поиску баланса между качеством результата, потреблением памяти и вычислительной производительности.

Таким образом, можно выделить следующие ключевые недостатки motion matching:
-
необходимость огромного датасета, например, в TLOU 2 только для Элли и Эбби суммарно 2627 анимационных клипов — 2 часа 17 минут анимаций
-
отсутствие генеративности
Типичный пайплайн
Пайплайн концептуально для всех трех архитектур не отличается и выглядит следующим образом:
-
Предобработка: на этом этапе подготавливаются тренировочные данные и автоматически извлекаются параметры контроллера, а также сопоставляется рельеф с передвижением, используя отдельную карту высот
-
Тренировка: выполняется так, что нейросеть учится выдавать движение персонажа на каждом кадре, используя параметры контроллера
-
Инференс в режиме реального времени: собираются данные для входа в нейросеть (контроллер и окружающая среда), подаются в систему, которая определяет движение персонажа
Исходными тренировочными данными является обычный захват движений, записанный в длинную последовательность, описывающую различные походки и направления движений. На этапе предобработки в целях насыщения набора данных выполняется зеркалирование всей последовательности.
Данные, относящиеся к позиции и скорости костей используются авторегрессивным способом — подсчитанный результат с прошлого кадра используется как входные данные для следующего.
Phase-functioned neural networks for character control (PFNN)
PFNN представляет из себя архитектуру нейросети, работающую посредством генерации весов регрессионной нейросети на каждом кадре анимации как функцию от фазы — переменной, отражающей время цикла движения. Далее эти веса используются для выполнения регрессии от параметров контроллера на текущем кадре к соответствующей позе персонажа. Предложенная архитектура благодаря своей скорости вычислений и легковесности в контексте потребляемой оперативной памяти подходит для работы в режиме реального времени, и, вдобавок к этому, жертвуя компактностью, можно дополнительно ускорить работу посредством предварительного расчета фазовой функции.
Значительное улучшение выразительности анимации достигается за счет динамического изменения весов нейросети в зависимости от фазовой функции — такой подход позволяет нейросети обучаться на основе большого набора данных с высокой размерностью, где геометрия окружающей среды и данные о движении человека взаимосвязаны. Архитектура PFNN позволяет избегать смешивания данных с разных фаз, и функция регрессии плавно изменяется со временем в зависимости от фазы. После обучения система может автоматически генерировать подходящие и выразительные движения для персонажа, передвигающегося по пересеченной местности, прыгающего и избегающего препятствий — как в естественной, так и в городской среде.
Входными данными для нейросети являются предыдущая поза и вход с контроллера, а выходные данные включают в себя изменение фазы, текущую позу персонажа и некоторые дополнительные параметры.
В качестве данных для тренировки вместе с анимацией подаются параметры контроллера, состоящие из фазы движения, семантических лейблов походки, траектории движения персонажа и карты высот вдоль траектории.
-
Разметка фаз: выполняется в полуавтоматическом режиме. Контакт ног с поверхностью вычисляется автоматически через скорость, после чего вручную корректируются. После получения данных о контакте назначаются фазы: когда правая нога контактирует с поверхностью, фаза = 0, далее левая =
, снова правая =
. Между кадрами выполняется интерполяция
-
Разметка походки: выполняется вручную, представляется в виде бинарного вектора, чтобы устранить неоднозначность близких по типу движений и описать специфические сценарии движения
-
Траектория и карта высот: извлекается root transformation персонаа описывающая траекторию движения. Далее, вдоль всей траектории движения и перпендикулярно по бокам от нее вычисляется высота поверхности.
Для описания состояния персонажа берутся локальные по отношению к root transformation позиции и скорости костей на текущем кадре анимации, а для построении траектории выполняется семплирование 5 кадров из будущего и 6 из прошлого, суммарно покрывающих 1 секунду движения в прошлом и 0.9 секунд в будущем. Для каждого семпла извлекается позиция и направление траектории относительно root transformation, бинарный вектор, описывающий походку, и высота поверхности под траекторией и по бокам от нее на удалении в 25 см. Таким образом, полный вектор входных данных для нейросети для одного кадра анимации выглядит так:
-
– текущий кадр
-
– предыдущий кадр
-
– количество семплированных кадров (12 штук)
-
– количество костей в скелете
-
– позиции траектории движения в 2D горизонтальной плоскости
-
– направления траектории движения в 2D горизонтальной плоскости
-
– высоты в точках слева, справа и посередине траектории движения
-
– семантические лейблы, описывающие походку персонажа и другую информацию
-
– локальные позиции костей
-
– локальные скорости костей
В оригинальной статье в качестве лейблов использовались следующие:
-
состояние покоя
-
ходьба
-
бег
-
прыжок
-
приседание
Результатом инференса нейросети является вектор:
-
— количество семплированных кадров (12 штук)
-
— количество костей в скелете
-
— предсказанные позиции таректории на следующем кадре
-
— предсказанные направления траектории на следующем кадре
-
— локальные позиции костей
-
— локальные скорости костей
-
— углы костей, выраженные в форме экспоненциальной карты
-
— линейная скорость root transformation по оси
относительно направления движения «вперед»
-
— линейная скорость root transformation по оси
относительно направления движения «вперед»
-
— угловая скорость root transformation вокруг вертикальной оси
-
— изменение фазы
-
— информация о контакте ног (носка и пятки) с поверхностью
Нейросеть состоит из 3х слоев:
Количество нейронов в каждом слое = 512. Веса нейросети a вычисляются в зависимости от параметровна каждом кадре отдельной фазовой функцией
. В качестве этой функции могут выступать еще одна нейросеть или гауссовский процесс, в самой же статье предлагается использовать циклический кубический сплайн Catmull-Rom c 4-мя контрольными точками. Такой подход означает, что каждая контрольная точка
отражает конкретную конфигурацию весов
нейросети, а функция
делает гладкую интерполяцию между этими конфигурациями.
Тренировка нейросети сводится к решению задачи оптимизации параметров фазовой функции . Используется следующая функция потерь:
-
— среднее квадратическое отклонение
-
— регуляризация, введеная, чтобы веса не были слишком большими (
)
В качестве оптимизатора выбран Adam
В режиме реального времени на каждый кадр анимации на вход нейросети подаются фаза и вектор
. Скорость и направление движения, полученное с контроллера по каждому будущему кадру, смешивается с данными, предсказанными нейросетью на предыдущем кадре
, по следующей формуле:
-
-
— дополнительное смещение (bias), контролирующее отзывчивость персонажа
Mode-adaptive neural networks for quadruped motion control (MANN)
Данная работа посвящена развитию архитектуры PFNN с расширением до анимации четвероногих объектов. Ввиду принципиальных отличий в характере движений, невозможно определить одну фазу для всех четырех конечностей при смене походки. Ручная разметка неструктурированного набора данных также становится нецелесообразной. Поэтому фазовая функция заменяется дополнительной нейросетью. В итоге система включает в себя нейросеть предсказания движения и нейросеть выбора экспертов (gating network — аналогично архитектуре mixture of experts): если первая нейросеть предсказывает состояние персонажа, принимая на вход состояние персонажа с предыдущего кадра и данные с контроллера, то вторая нейросеть динамически обновляет веса первой нейросети посредством выбора и смешивания новой сущности под названием «экспертные веса», каждая из которых присуща конкретному шаблону движения. Такая архитектура позволяет нейросетям учиться на данных с неразмеченными походками, полностью исключая этап разметки фаз движения.
Классификация движений выполняется вручную с целью выделения 6-ти классов движения: передвижение, сидение, стояние, ожидание, лежание и прыжки. Делается это так, чтобы в режиме реального времени пользователь с помощью контроллера мог задавать класс движения.
В работе рассматриваются четыре вида походки: шаг, иноходь, рысь и галоп. Хотя для управления персонажем в реальном времени системе эти лейблы не требуются, выполняется анализ распределения этих видов в наборе данных, основываясь на расчетах скорости.
Входные и выходные данные в целом аналогичны PFNN: также семплируются 5 кадров из будущего и 6 из прошлого, вычисляется root transformation персонажа, направление движения.
Вектор входных данных:
-
– текущий кадр
-
– предыдущий кадр
-
– количество семплированных кадров (12 штук)
-
– количество костей
-
– позиции траектории движения в 2D горизонтальной плоскости
-
– направления траектории движения в 2D горизонтальной плоскости
-
– скорости в точках траектории движения в 2D горизонтальной плоскости
-
– желаемая скорость в точках траектории движения
-
– one-hot вектор классов движения в точках траектории движения
-
– локальные позиции костей
-
– локальные вращения костей
-
– локальные скорости костей
Добавление вращения костей в вектор входных данных позволило получить более отзывчивую анимацию.
Результатом инференса нейросети является вектор:
-
— текущий кадр
-
— следующий кадр
-
— количество семплированных кадров (12 штук)
-
— количество костей
-
— позиции траектории движения
-
— направления траектории движения
-
— скорости в точках траектории движения
-
— локальные позиции костей
-
— локальные вращения костей
-
— локальные скорости костей
-
— линейная скорость root transformation по оси
-
— линейная скорость root transformation по оси
-
— угловая скорость root transformation в 2D горизонтальной плоскости
Вращения костей представлены в виде относительных векторов «вверх» и «вперед» чтобы исключить проблемы с интерполяцией кватернионов в процессе обучения нейросети.
Архитектура нейросети предсказания движения аналогична PFNN, веса же вычисляются посредством смешивания
экспертных весов
,
где .
— настраиваемый мета параметр, зависимый от сложности и размера
тренировочных данных. — коэффициенты смешивания, которые вычисляет gating network.
Архитектура gating network состоит из 3-х слоев:
-
— подмножество
, в которое входят скорости костей стоп, текущие классы движения и желаемая скорость персонажа.
-
— softmax функция для нормализации входных данных так, что их сумма становится = 1, что необходимо для дальнейшего линейного смешивания
Параметры нейросети определяются следующим образом:
-
— количество нейронов в скрытых слоях (32)
Тренировка нейросети сводится к нахождению для соответствующего
, что является типичный задачей регрессии. Используется следующая функция потерь (СКО между предсказанием и ground truth):
В качестве оптимизатора выбран AdamWR.
Learned motion matching (LMM)
LMM основан на собственной реализации motion matching, разработанной в стенах Ubisoft. Классический motion matching представлен 3-мя этапами: Projection, Stepping, Decompression — для каждого из которых предлагается альтернатива в виде обученной нейросети.
В качестве параметров позы для сценария передвижения предлагается использовать вектор из 27-ми элементов на каждый кадр анимации:
-
— позиции траектории движения в 2D спроецированные на поверхность 20, 40, 60 кадров в будущем (при 60 FPS)
-
— направление траектории движения 20, 40, 60 кадров в будущем
-
– локальные позиции костей стоп
-
– линейные скорости костей стоп
-
– линейная скорости кости бедра
Далее определяется вектор, содержащий в себе всю информацию о позе для каждого кадра анимации:
-
– локальные позиции костей
-
– локальные вращения костей в виде представления ось-угол
-
– линейные скорости костей
-
– угловые скорости костей
-
– линейные скорости root transformation
-
– угловые скорости root transformation
-
– специфичные для задачи дополнительные данные (например, информация о контакте ног с поверхностью)
Эти вектора вычисляются для каждого кадра, объединяются в матрицы ,
, называемые matching database и animation database соответственно, и используются в алгоритме тренировки. Далее в режиме реального времени каждые
кадров или когда сильно меняется ввод с контроллера, строится вектор запроса
, аналогичный вектору параметров позы и подается в качестве входных данных в Projection. Как только найден новый кадр, воспроизведение анимации начинается с него и вставляется переход (transition).
-
Projection: выполняется поиск методом ближайшего соседа для нахождения в
вектора параметров позы, наиболее подходящего для
.
-
Stepping: выполняется перемещение индекса в matching database.
-
Decompression: выполняется поиск позы в animation database, соответствующей текущему индексу в matching database.
Заменив каждый из этих этапов нейросетью, получится избавиться от необходимости хранения matching database и animation database в памяти. С этой целью вводятся 4 нейросети:
-
Decompressor: устраняет необходимость хранить в памяти
, принимает на вход
и латентный вектор
-
Compressor: выступает в роле энкодера для нахождения
посредством сжатия
в более малоразмерный вектор
-
Stepper: совместно с projector устраняет необходимость хранить в памяти
, обучается динамике системы, вычисляя изменения значений
и
для получения
и
на следующий кадр
-
Projector: эмулирует поиск методом ближайшего соседа, принимает на вход
и предсказывает ближайшие
и
Объединив эти 4 нейросети, получается learned motion matching, представленный на изображении ниже.

Поскольку вектор параметров позы обычно не содержит достаточно информации, необходимой для выведения соответствующей позы, вводится латентное пространство . Его значения находятся посредством нейросети Compressor — выполняется маппинг
к соответствующему
. Далее этот вектор конкатенируется к
и подается на вход в Decompressor, который пытается восстановить исходную позу
. Таким образом нейросеть находит какой информации не хватает в векторе параметров позы
и кодирует ее в
.
Ключевым аспектом тренировки Decompressor является функция потерь, разработанная для минимизации визуального восприятия ошибки, которая использует прямую кинематику для оценки ошибки в пространстве персонажа, также добавляются функции потерь, учитывающие скорость, чтобы результат гладко изменялся во времени.
Псевдокод алгоритма тренировки Compressor (C) + Decompressor (D)
После тренировки для работы алгоритма в режиме реального времени нейросеть Compressor не требуется, поскольку она необходима только для нахождения , используемого для тренировки других нейросетей.
Нейросеть Stepper тренируется брать на вход векторы и
текущего кадра и выдавать дельту, добавляемую к ним, для получения векторов
и
на следующий кадр. Берется небольшое окно векторов
и
и повторно предсказываются следующие значения параметров позы и латентных переменных и подаются на следующий кадр.
Псевдокод алгоритма тренировки Stepper
Наконец, нейросеть Projector позволяет полностью избавиться от необходимости хранения и
в памяти. Для ее обучения берут вектор
, семплируется гауссовский шум
и масштабируется случайным шумом
, полученная величина добавляется к
для получения
, по ней выполняется нахождение ближайших
методом ближайшего соседа. Projector далее обучается выдавать соответствующие вектора параметров позы
и латентные переменные
.
Посредством сэмплирование шума разной величины, Projector делается устойчивым к возмущениям разного масштаба.
Для всех функций потерь во всех алгоритмах тренировки коэффициенты w* подбираются такими, чтобы уравнять исходные (на 1-й итерации обучения) полученные значения.
В качестве оптимизатора выбран RAdam.
Количество слоев, нейронов и функции активации для нейросетей представлены на изображении ниже:

Порядок работы архитектуры в режиме реального времени следующий:
-
Формируется
, подается на вход в Projector, который выдает
и
-
Найденные
и
подаются на вход в Stepper, который перемещает их во времени
-
Результат из шага 2 и подается на вход в Decompressor, который выдает конечную позу персонажа
Ограничения хабра не позволяют приложить демонстрацию работы, с видеоматериалами можно ознакомиться здесь.
Заключение
В статье не были приведены оценки качества работы и производительности рассмотренных подходов, с ними вы можете ознакомиться более подробно в первоисточниках.
Также не были разобраны некоторые важные составляющие (построение траектории движения, сопоставление персонажа с картой высот) ввиду выхода этих тем за рамки статьи. В следующей статье я планирую раскрыть часть из опущенных деталей.
Список литературы:
-
Motion matching: Motion Matching and The Road to Next-Gen Animation
-
The Last of us Part II: Bringing Allies to Life in the ‘Last of Us Part II’
-
PFNN: Phase-Functioned Neural Networks for Character Control
-
MANN: Mode-Adaptive Neural Networks for Quadruped Motion Control
ссылка на оригинал статьи https://habr.com/ru/articles/1034842/