Пользовательские жесты, Kinect + Unity. Часть 1
Здравствуй, сегодня мы научимся использовать кастомные жесты в наших Unity-приложениях, делать мы это будем с помощью Kinect’a v2. Жесты можно использовать для широкого круга задач: перемещение по сцене, управление объектами, работа с пользовательским интерфейсом и др. В первой части мы рассмотрим процесс обучения жестов, во второй будем использовать полученную в результате обучения модель в Unity. Также узнаем о возможных проблемах и решениях.
Что нам понадобится:
1. Unity 5.0 Pro
2. Kinect v2 SDK
3. Kinect v2 Unity plugin
Прелюдия. Проверка Kinect
После того, как мы скачали и установили Kinect SDK, нужно убедиться, что все у нас работает. Откроем Kinect SDK Browser, и запустим пример Body basic WPF — вы должны увидеть скелет человека, которого видит Kinect. Если все хорошо, идем дальше, если нет — открываем в том же SDK Browser первый пример — Kinect Configuration Verifier, и смотрим, что именно у нас не работает.
Обучающая выборка
Наш пример будет построен вокруг обучения дискретного (discrete) жеста взмаха руки сверху вниз. «Дискретный» здесь означает, что наша обученная модель позволит детектировать сам факт наличия жеста (возвращая степень уверенности — был ли в данный момент времени жест). В противовес дискретному возможно обучение продолжительного (continuous) жеста. Главное отличие тут в том, что у продолжительного жеста мы можем узнать относительное положение между начальной и конечной фазами жеста. Продолжительные жесты находятся за рамками нашего туториала.
Для записи обучающих видео нам понадобится Kinect Studio V2.0. Посмотрим на интерфейс:
Если вы не видите вывод с Kinect’a — нажмите на кнопку в левом верхнем углу для подключения. Слева мы видим список потоков, которые будут записаны. По умолчанию выключены потоки аудио и цветной камеры, что нас устраивает, так как для обучения они нам не нужны. Чтобы начать записывать ролик, нажмите на кнопку для записи.
Рекомендации к записи ролика: в ролике должны быть как «позитивы», так и «негативы», поэтому имеет смысл сперва записать несколько правильно выполненных жестов, а затем несколько неправильных — это облегчит разметку видео в дальнейшем. Ролики лучше записывать с разными людьми, иначе возможно обучение на специфичное выполнение жеста конкретного человека
Обучение
Наконец-то мы записали несколько роликов для обучения, для наших учебных целей достаточно 3–4 подобных роликов. Теперь перейдем к обучению. Для этого воспользуемся утилитой Visual Gesture Builder. Выглядит она следующим образом:
Приступим, создаем новое решение, File → New Solution, выбираем папку и указываем название.
Теперь ПКМ по созданному решению и «Create New Project», логика аналогичная Visual Studio — одно решение может содержать несколько проектов, каждый проект — это определенный жест. Настройка проекта достаточно понятна, нас интересует дискретный жест правой руки, поэтому убираем зеркалирование (Duplicate and Mirror Data During Training) и игнорируем нижнюю часть тела (Ignore Lower Body) и левую руку (Ignore Left Arm). Настройка Use Hands используется, когда нам важны кисти рук. Игнорирование здесь означает, что мы не будем учитывать данные части тела в процессе обучения.
Теперь добавляем наши ролики в проект (рекомендую скопировать ролики в папку с проектом):
Выделяем ролик, нас интересует вот эта панелька:
Это и есть панель для разметки ролика на участки-позитивы и участки-негативы. Управление: перемещение влево-вправо — стрелочками, с shift’ом будет выделяться, установить выделение в негатив — пробел, в позитив — enter.
Для начала выделим все и установим в негатив, для этого установим курсор в начало полосы, жмем shift + end (выделится весь таймлайн), жмем пробел. Далее двигаемся стрелочками по нашему ролику и ищем моменты с нашими жестами, выделяем каждое правильное выполнение жеста (помним, с shift’ом) и жмем enter.
После всех манипуляций должно получиться примерно следующее:
Где синее сверху — это позитив, в это время делается правильный жест, все, что снизу — негатив, там нет нашего жеста
И последнее — билдим решение (правой кнопкой мыши по решению → Build), можно попить чай, в зависимости от числа роликов процесс может затянуться. На выходе в нашей папке с роликами появится файл с расширением .gdb (поэтому мы скопировали ролики в папку с проектом — чтобы все вместе было). Этот файл и есть обученная модель, которую мы будем использовать в дальнейшем.
Проверка
Давайте посмотрим, что мы наобучали. Запустим Visual gesture builder, нажмем «O» и выберем наш .gdb файл, слева есть вывод с камеры глубины, справа по одному окошку на каждый жест (у нас он один) когда мы его выполняем, стоя перед Kinect’ом, мы должны получить что-то вроде «елочки»:
Этот график показывает степень уверенности в том, что жест есть в момент времени (ось абсцисс — время, ординат — степень уверенности)
На этом с первой частью все. Во второй части мы рассмотрим как использовать нашу обученную модель в Unity.
Замечания
На практике, мы (Singularis lab) использовали кастомные жесты в реальном проекте и в ходе разработки столкнулись с рядом проблем:
— Kinect достаточно требователен к железу — работает не со всеми usb3 контроллерами. Кроме того, на одной машине нам пришлось помучаться с драйверами на контроллер, несмотря на рекомендацию «обновить драйверы до последней версии», с самыми свежими драйверами не работало, а с более старыми — завелось.
— Во время записи обучающей выборки не нужно бросаться в крайности: одинаково вредно стараться делать жест идентично и делать его максимально разнообразно. На одном этапе у нас было много роликов с большим количеством людей и очень разнообразным выполнением одного и того же жеста (свайп рукой), в результате после обучения было много ложных срабатываний. Кроме того, Kinect чувствителен к относительному положению и наклону, то есть если вы снимали ролики на высоте полуметра, а потом используете обученную модель устройством уже на высоте двух метров, то результаты могут вас неприятно удивить.
Полезности
— Видеоролики от майкрософта по обучению с Kinect’ом v2
— Блог Евангелиста Майкрософта, Peter Daukintis, где есть множество статей как о Kinect’е в целом, так и об обучении жестов и интеграции с Unity