В данной статье речь пойдёт о том, как используя разные архитектуры нейронных сетей классифицировать данные полученные со сверхширокополосного радара » XETHRU by NOVELDA X4M02 290056-010 «. Моя работа основана на публикации » UWB-gestures, a public dataset of dynamic hand gestures acquired using impulse radar sensors » в которой подробно рассмотрена задача классификации человеческих жестов заснятых на сверхширокополосный радар при помощи свёрточной нейронной сети. Авторы оригинальной статьи выложили весь датасет собранный ими в открытый доступ, благодаря чему у меня появилась возможность воспроизвести их результат, а так же превзойти его применив архитектуры рекуррентных нейронных сетей и трансформеров.
Оригинальная статья:
https://www.researchgate.net/publication/350811193_UWB-gestures_a_public_dataset_of_dynamic_hand_gestures_acquired_using_impulse_radar_sensors https://www.nature.com/articles/s41597-021-00876-0
Данные:
https://figshare.com/articles/dataset/A_Public_Dataset_of_Dynamic_Hand-gestures_Acquired_using_Impulse-radar_sensors_/12652592
Мой GitHub с кодом:
https://github.com/DenissStepanjuk/UWB-Gestures-classification-with-Neural-Networks
Давайте посмотрим на данные

Данные записаны на 3 СШП радара » XETHRU by NOVELDA X4M02 290056-010 « расположеных слева, по центру и справа от волонтёра.
8 волонтёров записали по ~ 100 экземпляров 12 жестов, где 12-й жест это полное отсутсвие движения, снятых с трёх ракурсов.
1 экземпляр представляет собой двумерную матрицу записаную следующим образом:
-
20 раз в секунду радар присылает вектор с данными длинной 189.
-
Запись одного движения занимает 4.5 секунды.
-
За 4.5 секунду радар присылает 90 векторов длинной 189
-
Вектора склеивают в матрицу 90х189 чтобы получить псевдоизображение.
Подробно ознакомится со всеми данными можно используя мой скрипт:
https://github.com/DenissStepanjuk/UWB-Gestures-classification-with-Neural-Networks/blob/main/UWB_PLT.ipynb

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

Уже с очищенными данными мы можем преступить к обучению разных нейросетевых структур, отмечу то, что как и в оригинпльной статье я буду использовать только очищенные данные с левого радара.
Свёрточная нейронная сеть

С моей реализацией CNN можно ознакомиться по ссылке:
https://github.com/DenissStepanjuk/UWB-Gestures-classification-with-Neural-Networks/blob/main/UWB_CNN.ipynb
В целом в оригинальной статье достаточно подробно рассмотрен данный подход. Псевдоизображение переданное на вход модели проходит через четыре свёрточных слоя следующих друг за другом, полученная карта активаций конкатенируется в вектор, который передаётся на вход полносвязного слоя, пройдя через два полносвязных слоя на выходе получаем распределение вероятностей для 12 классов.
В общей сложности такой поток преобразования данных даёт accuracy в 94%.
Рекуррентные нейронные сети

С моей реализацией RNN можно ознакомиться по ссылке:
https://github.com/DenissStepanjuk/UWB-Gestures-classification-with-Neural-Networks/blob/main/UWB_RNN.ipynb
Отличительной чертой рекуррентной сети является то, что она предназачена для работы с последовательностями данных, так что нам не придётся формировать псевдоизображение, а будем передовать вектора длинной 189 элементов полученные с радара на вход сети. На один жест приходиться 90 векторов полученных с радара.
Благодаря своей структуре рекуррентная сеть каждый раз получая на вход вектор с радара будет агрегировать часть информации в своё внутренее скрытое состояние, которое будет передано на следующею итерацию приёма данных с радара. Таким образом к моменту когда на вход сети придёт последний вектор с радара во внутренем скрытом состоянии будет агрегирован обьём информации достаточный для классификации записаного радаром жеста.
На валидационной выборке я получил следующие значения accuracy:
● RNN: 92.86%
● GRU: 97.88%
● LSTM: 98.41%
Трансформер (QKV Attention)

С моей реализацией трансформера можно ознакомиться по ссылке:
https://github.com/DenissStepanjuk/UWB-Gestures-classification-with-Neural-Networks/blob/main/UWB_Attention_and_Transformers.ipynb
Архетиктура трансформера (QKV Attention) примечательна тем, что он принимает на вход последовательность векторов, выявляет разного рода связи между входными векторами и имея эту информацию обновляет эти вектора таким образом чтобы они содержали информацию друг о друге. Давайте попробуем разобраться.
Вектора Queries, Keys и Values это вектора входной последовательности пропущенные через три разных полносвязных слоя чтобы выделить из них разную информацию.
Queries — запрос
Вектор Q — вектор входной последовательности пропущенный через полносвязный слой Queries от лица которого идёт обращение ко всем векторам входной последовательности пропущеным через полносвязный слой Keys, чтобы получить информацию о том как вектор Q связан со всеми векторами входной последовательности.
Keys — ключ
Вектор K — вектор входной последовательности пропущенный через полносвязный слой Keys к которому обращается вектор Q чтобы выявить какую информацию вектор K может отдать о том как они связаны.
— скалярное произведение вектора Q на вектор K, числовое значение (коэфицент) отражающие как сильно связаны между собой вектор Q с вектором K.
Values — значения
Вектор V — вектор входной последовательности пропущенный через полносвязный слой Values чтобы выделить из него полезную информацию. В дальнейшем каждый вектор V будет умножен на соответствующий коэфицент , после чего все отмаштабированные вектора V будут сложены между собой чтобы сформировать новый вектор содержащий обобщённую информацию обо всех векторах. Данный вектор встанет на место вектора Q.
После того как мы обновили все вектора при помощи QKV Attention можно агрегировать их по среднему значению, а получившейся вектор пропустить через полносвязный слой чтобы получить распределение вероятностей для 12 классов.
На валидационной выборке я получил следующие значения accuracy:
Однослойный трансформер:
● Одна голова attention: 91.80%
● Семь голов attention: 93.39%
Трёхслойный трансформер:
● Одна голова attention: 94.44%
● Семь голов attention: 96.03%
Предполагаю, что результат можно улучшить, если добавить позиционное кодирование (Positional Encoding) и нормализацию слоя (Layer Normalization).
Отдельной задачей стоит сопаставление, а так же осмысление входной последовательности векторов и получившихся карт внимания.


ссылка на оригинал статьи https://habr.com/ru/articles/897714/
Добавить комментарий