Обнаружение шагов пользователя в виртуальной реальности с помощью UE и нейронных сетей

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

Осознав этот факт, я задался вопросом, возможно ли каким-то образом распознать этот самый момент на основе движения устройства HMD, когда пользователь делает шаг. У меня было некоторое время подумать об этом, и я понял, что мне нужно сначала собрать данные о скорости и ускорении в пространстве, а затем провести детальный анализ этих данных, чтобы понять, как создать правильный алгоритм распознавания шагов. Но, конечно, есть и другая сторона медали – я очень, очень ленив, поэтому я не хотел анализировать все эти данные. Я уже думал отказаться от этой идеи, но…

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

Рис. 1. Основная идея того, как работает компонент future

Первые исследования и сбор данных

Прежде всего, я решил выяснить, сработает ли эта идея вообще. Запустив поиск в Интернете, я наткнулся на программу под названием MemBrain – в ней можно создавать нейронные сети, обучать их и изучать их работу. Программа оказалась довольно простой в использовании – после прочтения руководства по программе я смог приступить к работе.

Сразу же я задал себе вопрос: где мне взять данные для обучения нейронной сети? Решение было простым. Я использовал возможности ведения журнала Unreal Engine, чтобы при нажатии одной из кнопок контроллера движения регистрировалась строка с линейными и угловыми скоростями и ускорениями устройства HMD в пространстве. В то же время в конце строки был отображен дополнительный параметр: он определяет, действительно ли был сделан шаг (в зависимости от нажатой кнопки контроллера движения).

Рис. 2. Скрипт, необходимый для сбора данных в журнал Unreal Engine

Как я собирал данные? Я запускал Unreal Engine в виртуальной реальности и выполнял разные действия – крутил головой, наклонялся, пригибался (без шагов) или делал то же самое, но с добавлением шагов к этим действиям. Наряду с ними я также нажимал одну из кнопок на контроллере движения, чтобы все данные были записаны в журнал.

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

Рис. 3. Данные обучения нейронной сети после обработки в Excel

Построение нейронной сети

Следующим шагом было построение нейронной сети, которая получала бы информацию о перемещении устройств HMD и выдавала бы на выходе только 2 возможных значения – 0 (если шага не было) или 1 (если был шаг). В тот момент у меня возникла мысль, что если эксперимент пройдет успешно, я перенесу эту нейронную сеть в Unreal Engine в виде сценария Blueprint. Поэтому я решил сделать нейронную сеть максимально простой. Поскольку я не являюсь экспертом в нейронных сетях, я решил использовать ту, которая имеет самую простую структуру, которая чаще всего описывается на картинках в Интернете.

Рис. 4 Исходная нейронная сеть в MemBrain

Итак, я создал простую нейронную сеть в приложении MemBrain, загрузил в нее набор уроков и, затаив дыхание, нажал кнопку //start //, чтобы начать обучение нейронной сети.

Я не знаю, чего именно я ожидал. Возможно, я ожидал, что появится огромное окно со словами “Какой же ты дурак! Немедленно закрой эту программу и никогда больше ее не запускай!”. Однако ничего не произошло. Вместо этого я увидел, что нейронная сеть начала обучаться. Прошло несколько минут (в конце концов, нейронная сеть была очень простой), и я понял, что моя идея сработала! Нейронная сеть действительно может распознать, сделал пользователь шаг или нет!

Рис. 5. Процесс обучения нейронной сети

Дублирование сети в UE

Я был настолько воодушевлен успехом, что немедленно попытался дублировать нейронную сеть, производную от MemBrain, в качестве сценария Blueprint в Unreal Engine. Я передавал обучающие данные (эти странные символы-цифры в параметрах отдельных нейронов и связях между ними) в Unreal Engine, просто копируя их в буфер обмена.

Рис. 6. Параметры отдельного нейрона, которые необходимо передать в Unreal Engine (обратите внимание на такие параметры, как Активация, Порог и тип функции активации)

Как только сеть была продублирована в Unreal Engine, я привязал звук шагов к событию “Шаг”. Как указано на диаграмме в MemBrain, нейронная сеть не выдала точных значений 0 и 1, она только предоставила значения, приближенные к ним. Я учел эту функцию в соответствующем месте сценария Blueprint.

Итак, я собрал проект Unreal Engine, запустил его в виртуальной реальности и… Я понял, что ничего не работает. Нейронная сеть выдавала на выходе какие-то данные, но это был просто шум.

Оказалось, что я плохо разбираюсь в базовой математике нейронных сетей. Мне пришлось еще немного почитать о том, как устроены нейронные сети, и провести несколько тестов на простейших нейронах. В ходе этих тестов я отправлял одни и те же данные на вход нейронных сетей как в MemBrain, так и в Unreal Engine. Затем я сравнил сигнал на выходе. Сделав это, я смог точно воспроизвести математику нейронов, которая мне была нужна в Unreal Engine.

Рис. 7. Примитивный нейрон в Unreal Engine

Рис. 8. Логарифмическая передаточная функция в Unreal Engine

В итоге, после нескольких часов экспериментов, я скомпилировал новую нейронную сеть в Unreal Engine. Я собрал VR-проект, запустил его… и понял, что нейронная сеть работает. Я шел – и услышал свои шаги в виртуальной реальности! Этот момент был незабываемым!

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

Улучшение сети

Следующие несколько дней было проведено множество экспериментов: я варьировал количество слоев нейронной сети, менял ее структуру, добавлял все больше и больше данных для ее обучения. Я ходил, крутил головой взад-вперед (одновременно нажимая необходимые кнопки контроллера движения), тренировал нейронную сеть, передавал сетевые данные в Unreal Engine (копируй, вставляй, копируй, вставляй – ух!). Я протестировал сеть, определил движения, в которых сеть допускала ошибки, ввел обучающие данные для этих движений, дополнил обучающий набор и обучил его снова. Это был действительно кропотливый и длительный процесс. Однако с каждым разом нейронная сеть работала все лучше и лучше.

Рис. 9. Как выглядела нейронная сеть после всех этих изменений

Трудно сказать, сколько раз я переобучал нейронную сеть и сколько раз вносил изменения в ее структуру. Однако в какой-то момент я понял, что он практически перестал ошибаться (пока я двигался естественно и не пытался намеренно “обмануть” его). Компонент был готов. Позже, когда мои коллеги протестировали его производительность, я понял, что людям нравится, как он работает.

Рис. 10. Нейронная сеть в Unreal Engine

После добавления компонента в Unreal Engine Marketplace один из клиентов связался со мной и указал, что нейронная сеть постоянно допускает ошибки, если голова пользователя совершает определенное движение. Самым интересным было то, что это движение было практически единственным, которое не было распознано нейронной сетью. Я хотел решить эту проблему, но очень боялся испортить уже готовый проект. И я подумал – эй, а что, если я добавлю специальную (очень, очень простую!) нейронную сеть, которая будет распознавать только те случаи, в которых базовая нейронная сеть допускала ошибки, и вносить коррективы в результат?

Сначала идея показалась мне странной. Но чем больше я думал, тем больше она мне нравилась. Просто небольшое напоминание – я ленивый человек и не люблю много думать и выполнять дополнительную работу!

Я переработал схему в Unreal Engine, чтобы параметры движения шлема можно было записывать в журнал после события. Другими словами, я мог протестировать основную нейронную сеть, и если бы я заметил, что базовая нейронная сеть допустила ошибку, я бы нажал кнопку контроллера, чтобы параметры, которые засвидетельствовали ошибку, появились в журнале. Создав простую дополнительную нейронную сеть, обучив ее и заставив работать параллельно с первой, я смог добиться значительного снижения частоты ложных срабатываний компонента.

Рис. 11. Финальная версия сценария Blueprint в Unreal Engine

Заключение

Как вы можете видеть, нейронная сеть — это легко и увлекательно (даже если вы никогда не занимались этим профессионально), особенно в сочетании с Unreal Engine. Я надеюсь, что эта статья дала толчок вашему творчеству и вдохновила вас на эксперименты с нейронными сетями. Просто помните, что аналогичный инструмент может появиться в вашем наборе инструментов.

Источник

Search this website