Нейросетевой подход для классификации событий отслеживаемых сверхширокополосным радаром
В данной статье речь пойдёт о том, как используя разные архитектуры нейронных сетей классифицировать данные полученные со сверхширокополосного радара " 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 может отдать о том как они связаны.
Values - значения
Вектор V - вектор входной последовательности пропущенный через полносвязный слой Values чтобы выделить из него полезную информацию. В дальнейшем каждый вектор V будет умножен на соответствующий коэфицент
После того как мы обновили все вектора при помощи QKV Attention можно агрегировать их по среднему значению, а получившейся вектор пропустить через полносвязный слой чтобы получить распределение вероятностей для 12 классов.
На валидационной выборке я получил следующие значения accuracy:
Однослойный трансформер:
● Одна голова attention: 91.80%
● Семь голов attention: 93.39%
Трёхслойный трансформер:
● Одна голова attention: 94.44%
● Семь голов attention: 96.03%
Предполагаю, что результат можно улучшить, если добавить позиционное кодирование (Positional Encoding) и нормализацию слоя (Layer Normalization).
Отдельной задачей стоит сопаставление, а так же осмысление входной последовательности векторов и получившихся карт внимания.