Користувальницькі жести, 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 Mirror and 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

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.