Как создать модель нейросети для генерации движений танца на основе музыки в формате MMD

Я работаю над проектом, в котором нужно создать модель нейросети для генерации движений танца на основе музыки. Стремлюсь достичь результата, подобного этому видео: https://youtu.be/FrA7f5F9TsI

Файл движений (формат .vmd или MMD) содержит данные о сгибах тела (кости). Каждая кость имеет 3 значения поворота в пространстве (x, y, z). Одна секунда файла MMD содержит 30 кадров, каждый кадр записывает значения всех костей

введите сюда описание изображения


Для уменьшения объема данных я предпринял следующие шаги:

  • Увеличил аудио до целой секунды (159.8 -> 160.0). Чтобы при изъятии мел-спектрограммы шаги имели чёткость данных в пределах секунды. то же самое в MMD. Продлевается путём установки пустых значений в конце
  • Сократил количество костей MMD с 100 до 25, оставив те, что генерируют 90% движений
  • Уменьшил частоту кадров с 30 до 10.
  • Использую только одного персонажа
  • Так выглядит после всех ограничений
  • Аудио. Использую ограниченную мел-спектрограмму с диапазоном от 0 до 5000 Гц. Параметры: n_mels = 200, n_fft = 4096, hop_length = 735000 (3 взятия шага на 1 секунду) (Длина 160 секунд = 480 шагов)

Формирование данных для нейросети:

Для формирования данных я разделил все итерации файлов обучений на секунды, чтобы они влезали в память и одновременно могли быть обработаны на видеокарте (4070)

  • Нормализация для спектрограммы от 0 до 1. Нормализация для MMD от -1 до 1 (С поправкой на их особенности)

  • В инпут я могу вписать мел-спектрограмму, любую часть, (например 2 прошлых, 1 текущую и 5 будущих её секунд). Также могу вписать несколько прошлых секунд MMD, (например 0 или 3) и любую другую информацию (Идея добавления прошлых MMD в инпут - чтобы при генерации новой итерации у него была связь с прошлыми результатами, чтобы было неразрывно)

  • В вывод я вписываю текущую обрабатываемую секунду MMD. То, что и хочу получить


Я пробовал различные комбинации моделей, такие как LSTM и Attention, но модели всегда перестают обучаться. Последние настройки и данные, с которыми я тренировал, можно найти. араметры - 1 секунда спектрограммы до, 1 текущая; 1 секунда mmd предыдущая. В выводе 1 секунда текущая. MMD и аудио источник - как на видео

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


Ответы (1 шт):

Автор решения: GravyTalk

Ваша цель:

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

Проблема:

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

Как я понял вопрос

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

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

Опять же LSTM и GRU предназначены для предсказывания последовательностей данных (или их классификации в зависимости от поставленных задач). В Ваших целях явно прослеживается задача по генерации, но не предсказывании.

Лирическое отступление

Если вспомнить о нашумевших генераторах изображений, таких как Stable Diffusion или нововышедшей SORA (генератор видео), то они по большей части основаны на подходе Unet (закаленная в боях архитектура, которая победила в соревнованиях по сегментации медицинских снимков на kaggle и начала набирать популярность) в ее основе заложен главный принцип работы этих генераторов. Изображения кодируются признаками (визуальными патчами), которые затем декодируются обратно в изображение. Так вот всем чем они отличаются это тем, что происходит со скрытым пространством, как раз этими визуальными патчами в процессе обучения.

Генераторы разделены на две составные части, одна из которых генерирует, а вторая проверяет насколько данные соотносятся с действительными (обучающей выборкой). Та вторая часть обычно представляет из себя стандартный кодировщик-классификатор. Шум, который генерируется после каждой иттерации генератором все больше начинает походить на наше изображение, за счет уменьшения ошибки (обычный loss по типу кроссэнтропии).

В сложных архитектурах (Stable Diffusion), где есть текстовые подсказки для генерации замешивают в скрытое пространство шума дополнительно кодированный текст (NLP). Или используют другие техники, например, механизмы внимания, генерация не чисто шума, а добавление в шума в обучающее изображение (диффузия) с обучением сети очищать этот шум (что-то вроде Auto-Encoder подхода).

GAN можно, конечно, использовать не в контексте изображений, а в контексте любых числовых данных (в этом и прелесть нейронных сетей).

Что я предлагаю

Все же для такой ситуации было бы уместно начать с GAN-архитектур по части генерации координат, которые будут конвертироваться в удобный Вам формат (vmd MMD).

То есть генерируете тензор шума с помощью генератора. Затем кодируете шум с помощью слоев свертки (CNN), получая таким образом скрытое пространство движений Вашей модели (девушки). По пути кодируете ваши мел-спектограммы, извлекая из них патчи, которые замешиваете с Вашим шумом в процессе обучения, таким образом Вы учтёте аудио-составляющую (какие-то признаки связанные с ритмом, который влияет на то, какое движение будет у модели. После чего оцениваете сгенерированные данные с помощью второй части енкодера-классификатора на соответствие тому танцу, который Вы заготовили в качестве примера (все тот же файл mvd с координатами движений). Можно добавить механизмы внимания, чтобы была запоминающая составляющая. Так же можно не генерировать шум с нуля, а брать ваши обучающие координаты и добавлять в них шум.

В любом случае что бы Вы не предприняли для решения такой специфической задачи, Вам потребуется большое/большее количество данных (и я сейчас имею в виду не растягивание Ваших данных, а увеличения разнообразия, то есть больше видов танцев, аудио-сопровождения), так как все эти подходы очень прожорливы. Посмотрите набор данных AIST++

→ Ссылка