Этот пример показывает, как классифицировать пешеходов и велосипедистов на основе их микродопплеровских характеристик с помощью нейронной сети для глубокого обучения и частотно-временного анализа.
Перемещения различных частей объекта, расположенного перед радаром, создают микродопплеровские сигнатуры, которые могут использоваться для идентификации объекта. Этот пример использует сверточную нейронную сеть (CNN), чтобы идентифицировать пешеходов и велосипедистов на основе их подписей.
Этот пример обучает нейронную сеть для глубокого обучения с помощью моделируемых данных, а затем исследует, как сеть работает при классификации двух случаев перекрытия сигнатур.
Данные, используемые для обучения сети, генерируются с помощью backscatterPedestrian
(Radar Toolbox) и backscatterBicyclist
(Radar Toolbox) из Radar Toolbox™. Эти функции моделируют радарное обратное рассеяние сигналов, отраженных от пешеходов и велосипедистов, соответственно.
Функция помощника helperBackScatterSignals
генерирует заданное количество пешеходов, велосипедистов и автомобильных радиолокационных возвратов. Поскольку целью примера является классификация пешеходов и велосипедистов, этот пример рассматривает сигнатуры автомобилей только как источники шума. Чтобы получить представление о проблеме классификации, чтобы решить, исследуйте одну реализацию микродопплеровской подписи от пешехода, велосипедиста и автомобиля. (Для каждой реализации обратные сигналы имеют размерности около-, где количество быстрых выборок и количество медленных выборок. Для получения дополнительной информации см. Radar Data Cube (Phased Array System Toolbox).
numPed = 1; % Number of pedestrian realizations numBic = 1; % Number of bicyclist realizations numCar = 1; % Number of car realizations [xPedRec,xBicRec,xCarRec,Tsamp] = helperBackScatterSignals(numPed,numBic,numCar);
Функция помощника helperDopplerSignatures
вычисляет кратковременное преобразование Фурье (STFT) радиолокационного возврата, чтобы сгенерировать микродопплеровскую сигнатуру. Чтобы получить микродопплеровские сигнатуры, используйте вспомогательные функции для применения STFT и метода предварительной обработки к каждому сигналу.
[SPed,T,F] = helperDopplerSignatures(xPedRec,Tsamp); [SBic,~,~] = helperDopplerSignatures(xBicRec,Tsamp); [SCar,~,~] = helperDopplerSignatures(xCarRec,Tsamp);
Постройте графики частотных карт для пешеходов, велосипедистов и автомобилей.
% Plot the first realization of objects figure subplot(1,3,1) imagesc(T,F,SPed(:,:,1)) ylabel('Frequency (Hz)') title('Pedestrian') axis square xy subplot(1,3,2) imagesc(T,F,SBic(:,:,1)) xlabel('Time (s)') title('Bicyclist') axis square xy subplot(1,3,3) imagesc(T,F,SCar(:,:,1)) title('Car') axis square xy
Нормированные спектрограммы (абсолютные значения STFT) показывают, что три объекта имеют совершенно разные сигнатуры. В частности, спектрограммы пешехода и велосипедиста имеют богатые микродопплеровские сигнатуры, вызванные качанием рук и ног и вращением колес, соответственно. Напротив, в этом примере автомобиль моделируется как точечная цель с твёрдым телом, поэтому спектрограмма автомобиля показывает, что краткосрочный доплеровский сдвиг частоты изменяется мало, что указывает на небольшой эффект микродопплера.
Классификация одной реализации в качестве пешехода или велосипедиста относительно проста, поскольку микродопплеровские сигнатуры пешехода и велосипедиста отличаются друг от друга. Однако классификация нескольких перекрывающихся пешеходов или велосипедистов с сложением гауссовского шума или автомобильного шума намного сложнее.
Если в области обнаружения радара одновременно существует несколько объектов, принятый радиолокационный сигнал является суммированием сигналов обнаружения от всех объектов. В качестве примера сгенерируйте принятый радиолокационный сигнал для пешехода и велосипедиста с Гауссовым фоновым шумом.
% Configure Gaussian noise level at the receiver rx = phased.ReceiverPreamp('Gain',25,'NoiseFigure',10); xRadarRec = complex(zeros(size(xPedRec))); for ii = 1:size(xPedRec,3) xRadarRec(:,:,ii) = rx(xPedRec(:,:,ii) + xBicRec(:,:,ii)); end
Затем получают микродопплеровские сигнатуры полученного сигнала при помощи STFT.
[S,~,~] = helperDopplerSignatures(xRadarRec,Tsamp); figure imagesc(T,F,S(:,:,1)) % Plot the first realization axis xy xlabel('Time (s)') ylabel('Frequency (Hz)') title('Spectrogram of a Pedestrian and a Bicyclist')
Поскольку сигнатуры пешехода и велосипедиста перекрываются во времени и частоте, различение между этими двумя объектами затруднено.
В этом примере вы обучаете CNN с помощью данных, состоящих из моделируемых реализаций объектов с различными свойствами - например, велосипедистов, педалирующих с разной скоростью, и пешеходов с разной высотой ходьбы с разной скоростью. Если предположить, что радар зафиксирован в источник, в одной реализации один объект или несколько объектов равномерно распределены в прямоугольной области [5, 45] и [-10, 10] метров вдоль осей X и Y, соответственно.
Другие свойства трех объектов, которые случайным образом настроены, следующие:
1) Пешеходы
Высота - равномерно распределена в интервале [1,5, 2] метров
Курс - Равномерно распределен в интервале [-180, 180] степеней
Скорость - равномерно распределена в интервале [0, 1,4h] метров/секунду, где h
- значение высоты
2) Велосипедисты
Курс - Равномерно распределен в интервале [-180, 180] степеней
Скорость - равномерно распределена в интервале [1, 10] метров/секунду
Передаточное число - равномерно распределено в интервале [0,5, 6]
Педалирование или покрутка - 50% вероятность педалирования (покатывание означает, что велосипедист движется без педалирования)
3) Автомобили
Скорость - равномерно распределена в интервале [0, 10] метров/секунду по направлениям X и Y
Вход для сверточной сети является микродопплеровской сигнатурой, состоящей из спектрограмм, экспрессированных в децибелах и нормализованных до [0, 1], как показано на этом рисунке:
Радарные возвраты происходят от разных объектов и разных частей объектов. В зависимости от строения, некоторые возвраты намного сильнее других. Более сильные возвраты, как правило, затмевают более слабые таковые. Логарифмическое масштабирование увеличивает функции, делая возвращаемые сильные стороны сопоставимыми. Нормализация амплитуды помогает CNN сходиться быстрее.
Набор данных содержит реализации следующих сцен:
Один пешехода, присутствующий на месте происшествия
Один велосипедист, присутствующий в сцене
Один пешеходный и один велосипедист присутствуют на месте происшествия
Два пешехода, присутствующие на месте происшествия
Два велосипедиста, присутствующие в сцене
Данные для этого примера состоят из 20 000 пешеходов, 20 000 велосипедистов и 12 500 автомобильных сигналов, генерируемых при помощи вспомогательных функций helperBackScatterSignals
и helperDopplerSignatures
. Сигналы разделены на два набора данных: один без выборок шума автомобиля и один с выборками шума автомобиля.
Для первого набора данных (без автомобильного шума) были объединены пешеходные и велосипедистские сигналы, добавлен Гауссов шум, и микродопплеровские сигнатуры были вычислены, чтобы сгенерировать 5000 сигнатур для каждой из пяти сцен, которые будут классифицированы.
В каждой категории 80% сигнатур (то есть 4000 сигнатур) зарезервированы для обучающих данных набора, в то время как 20% сигнатур (то есть 1000 сигнатур) зарезервированы для тестовых данных набора.
Чтобы сгенерировать второй набор данных (с автомобильным шумом), была соблюдена процедура для первого набора данных, за исключением того, что шум автомобиля был добавлен к 50% сигнатур. Доля сигнатур с автомобильным шумом и без нее одинаковая в наборах обучающих и тестовых данных.
Загрузите и разархивируйте данные во временной директории, местоположение которого задано tempdir
MATLAB ® команда. Размер данных составляет 21 ГБ, и процесс загрузки может занять некоторое время. Если у вас есть данные в папке, отличной от
tempdir
измените имя директории в последующих инструкциях.
% Download the data dataURL = 'https://ssd.mathworks.com/supportfiles/SPT/data/PedBicCarData.zip'; saveFolder = fullfile(tempdir,'PedBicCarData'); zipFile = fullfile(tempdir,'PedBicCarData.zip'); if ~exist(zipFile,'file') websave(zipFile,dataURL); elseif ~exist(saveFolder,'dir') % Unzip the data unzip(zipFile,tempdir) end
Файлы данных следующие:
trainDataNoCar.mat
содержит обучающий набор обучающих данных trainDataNoCar
и его набор меток trainLabelNoCar
.
testDataNoCar.mat
содержит набор тестовых данных testDataNoCar
и его набор меток testLabelNoCar
.
trainDataCarNoise.mat
содержит обучающий набор обучающих данных trainDataCarNoise
и его набор меток trainLabelCarNoise
.
testDataCarNoise.mat
содержит набор тестовых данных testDataCarNoise
и его набор меток testLabelCarNoise
.
TF.mat
содержит информацию о времени и частоте для микродопплеровских сигнатур.
Создайте CNN с пятью слоями свертки и одним полносвязным слоем. За первыми четырьмя слоями свертки следуют слой нормализации партии ., слой активации выпрямленного линейного модуля (ReLU) и слой максимального объединения. В последнем слое свертки максимальный слой объединения заменяется средним слоем объединения. Слой выхода является классификационным слоем после активации softmax. Для руководства по проекту сетей смотрите Советы по глубокому обучению и трюки.
layers = [ imageInputLayer([size(S,1),size(S,2),1],'Normalization','none') convolution2dLayer(10,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(10,'Stride',2) convolution2dLayer(5,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(10,'Stride',2) convolution2dLayer(5,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(10,'Stride',2) convolution2dLayer(5,32,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(5,'Stride',2) convolution2dLayer(5,32,'Padding','same') batchNormalizationLayer reluLayer averagePooling2dLayer(2,'Stride',2) fullyConnectedLayer(5) softmaxLayer classificationLayer]
layers = 24x1 Layer array with layers: 1 '' Image Input 400x144x1 images 2 '' Convolution 16 10x10 convolutions with stride [1 1] and padding 'same' 3 '' Batch Normalization Batch normalization 4 '' ReLU ReLU 5 '' Max Pooling 10x10 max pooling with stride [2 2] and padding [0 0 0 0] 6 '' Convolution 32 5x5 convolutions with stride [1 1] and padding 'same' 7 '' Batch Normalization Batch normalization 8 '' ReLU ReLU 9 '' Max Pooling 10x10 max pooling with stride [2 2] and padding [0 0 0 0] 10 '' Convolution 32 5x5 convolutions with stride [1 1] and padding 'same' 11 '' Batch Normalization Batch normalization 12 '' ReLU ReLU 13 '' Max Pooling 10x10 max pooling with stride [2 2] and padding [0 0 0 0] 14 '' Convolution 32 5x5 convolutions with stride [1 1] and padding 'same' 15 '' Batch Normalization Batch normalization 16 '' ReLU ReLU 17 '' Max Pooling 5x5 max pooling with stride [2 2] and padding [0 0 0 0] 18 '' Convolution 32 5x5 convolutions with stride [1 1] and padding 'same' 19 '' Batch Normalization Batch normalization 20 '' ReLU ReLU 21 '' Average Pooling 2x2 average pooling with stride [2 2] and padding [0 0 0 0] 22 '' Fully Connected 5 fully connected layer 23 '' Softmax softmax 24 '' Classification Output crossentropyex
Задайте оптимизационный решатель и гиперпараметры, чтобы обучить CNN с помощью trainingOptions
. В этом примере используется оптимизатор ADAM и мини-пакет размером 128. Обучите сеть с помощью CPU или GPU. Для использования графический процессор требуется Parallel Computing Toolbox™. Информацию о том, какие графические процессоры поддерживаются, см. в разделе Поддержка GPU Release (Parallel Computing Toolbox). Для получения информации о других параметрах смотрите trainingOptions
. Этот пример использует для обучения графический процессор.
options = trainingOptions('adam', ... 'ExecutionEnvironment','gpu',... 'MiniBatchSize',128, ... 'MaxEpochs',30, ... 'InitialLearnRate',1e-2, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',10, ... 'Shuffle','every-epoch', ... 'Verbose',false, ... 'Plots','training-progress');
Загрузите набор данных без шума автомобиля и используйте функцию helper helperPlotTrainData
для построения графика одного примера каждой из пяти категорий в наборе обучающих данных,
load(fullfile(tempdir,'PedBicCarData','trainDataNoCar.mat')) % load training data set load(fullfile(tempdir,'PedBicCarData','testDataNoCar.mat')) % load test data set load(fullfile(tempdir,'PedBicCarData','TF.mat')) % load time and frequency information helperPlotTrainData(trainDataNoCar,trainLabelNoCar,T,F)
Обучите CNN, который вы создали. Вы можете просмотреть точность и потери в процессе обучения. За 30 эпох процесс обучения достигает почти 95% точности.
trainedNetNoCar = trainNetwork(trainDataNoCar,trainLabelNoCar,layers,options);
Используйте обученную сеть и classify
функция для получения предсказанных меток для тестовых данных набора testDataNoCar
. Переменная predTestLabel
содержит сетевые предсказания. Сеть достигает точности около 95% для тестовых данных набора без шума автомобиля.
predTestLabel = classify(trainedNetNoCar,testDataNoCar); testAccuracy = mean(predTestLabel == testLabelNoCar)
testAccuracy = 0.9530
Используйте матрицу неточностей, чтобы просмотреть подробную информацию о эффективности предсказания для каждой категории. Матрица неточностей для обученной сети показывает, что в каждой категории сеть предсказывает метки сигналов в тестовые данные наборе с высокой степенью точности.
figure confusionchart(testLabelNoCar,predTestLabel);
Чтобы проанализировать эффекты шума автомобиля, классифицируйте данные, содержащие шум автомобиля, с trainedNetNoCar
сеть, которая была обучена без автомобильного шума.
Загрузите поврежденный шумом автомобиля набор тестовых данных testDataCarNoise.mat
.
load(fullfile(tempdir,'PedBicCarData','testDataCarNoise.mat'))
Введите поврежденные шумом автомобиля тестовые данные в сеть. Точность предсказания для тестовых данных с автомобильным шумом значительно падает, примерно до 70%, потому что сеть никогда не видела обучающих выборок, содержащих автомобильный шум.
predTestLabel = classify(trainedNetNoCar,testDataCarNoise); testAccuracy = mean(predTestLabel == testLabelCarNoise)
testAccuracy = 0.7176
Матрица неточностей показывает, что большинство ошибок предсказания происходит, когда сеть принимает сцены из классов «пешеходный», «пешеходный + пешеходный» или «пешеходный + велосипедист» и классифицирует их как «велосипедист».
confusionchart(testLabelCarNoise,predTestLabel);
Шум автомобиля значительно препятствует эффективности классификатора. Чтобы решить эту проблему, обучите CNN с помощью данных, которые содержат шум автомобиля.
Загрузите поврежденный шумом автомобиля набор обучающих данных trainDataCarNoise.mat
.
load(fullfile(tempdir,'PedBicCarData','trainDataCarNoise.mat'))
Переобучите сеть с помощью поврежденного шумом автомобиля набора обучающих данных. За 30 эпох процесс обучения достигает почти 90% точности.
trainedNetCarNoise = trainNetwork(trainDataCarNoise,trainLabelCarNoise,layers,options);
Введите поврежденные шумом автомобиля тестовые данные в сеть trainedNetCarNoise
. Точность предсказания составляет около 87%, что примерно на 15% выше эффективности сети, обученной без выборок автомобильного шума.
predTestLabel = classify(trainedNetCarNoise,testDataCarNoise); testAccuracy = mean(predTestLabel == testLabelCarNoise)
testAccuracy = 0.8728
Матрица неточностей показывает, что сеть trainedNetCarNoise
намного лучше выполняет прогнозирование сцен с одним пешеходом и сцен с двумя пешеходами.
confusionchart(testLabelCarNoise,predTestLabel);
Чтобы лучше понять эффективность сети, исследуйте ее эффективность при классификации перекрывающихся сигнатур. Этот раздел предназначен только для рисунка. Из-за недетерминированного поведения обучения графический процессор, вы можете не получить одинаковые результаты классификации в этом разделе при повторном запуске этого примера.
Например, подпись # 4 поврежденных шумом автомобилей тестовых данных, которая не имеет шума автомобиля, имеет двух велосипедистов с перекрывающимися микродопплеровскими сигнатурами. Сеть правильно предсказывает, что у сцены есть два велосипедиста.
k = 4; imagesc(T,F,testDataCarNoise(:,:,:,k)) axis xy xlabel('Time (s)') ylabel('Frequency (Hz)') title('Ground Truth: '+string(testLabelCarNoise(k))+', Prediction: '+string(predTestLabel(k)))
Из графика подпись представляется только от одного бициклиста. Загрузите данные CaseStudyData.mat
из двух объектов в сцене. Данные содержат сигналы возврата, суммированные в течение быстрого времени. Примените STFT к каждому сигналу.
load CaseStudyData.mat M = 200; % FFT window length beta = 6; % window parameter w = kaiser(M,beta); % kaiser window R = floor(1.7*(M-1)/(beta+1)); % ROUGH estimate noverlap = M-R; % overlap length [Sc,F,T] = stft(x,1/Tsamp,'Window',w,'FFTLength',M*2,'OverlapLength',noverlap); for ii = 1:2 subplot(1,2,ii) imagesc(T,F,10*log10(abs(Sc(:,:,ii)))) xlabel('Time (s)') ylabel('Frequency (Hz)') title('Bicyclist') axis square xy title(['Bicyclist ' num2str(ii)]) c = colorbar; c.Label.String = 'dB'; end
Амплитуды подписи бициклиста 2 намного слабее, чем у бициклиста 1, и подписи двух бициклистов перекрываются. Когда они перекрываются, две сигнатуры не могут быть визуально различимы. Однако нейронная сеть классифицирует сцену правильно.
Другой интересный случай - когда сеть путает шум автомобиля с велосипедистом, как в подписи # 267 поврежденных шумом автомобилей тестовых данных:
figure k = 267; imagesc(T,F,testDataCarNoise(:,:,:,k)) axis xy xlabel('Time (s)') ylabel('Frequency (Hz)') title('Ground Truth: '+string(testLabelCarNoise(k))+', Prediction: '+string(predTestLabel(k)))
Подпись велосипедиста слабая по сравнению с подписью машины, а у подписи - шипы от шума машины. Поскольку подпись автомобиля тесно напоминает подпись велосипедиста с педалями или пешехода, идущего на низкой скорости, и имеет небольшой эффект микродопплера, существует высокая вероятность того, что сеть неправильно классифицирует сцену.
[1] Chen, V. C. Эффект микродопплера в радаре. Лондон: Artech House, 2011.
[2] Gurbuz, S. Z., and Amin, M. G. «Radar-Based Human-Motion Recognition With Глубокое Обучение: Promising Applications for Indoor Monitoring». Журнал обработки сигналов IEEE. Том 36, Выпуск 4, 2019, стр. 16-28.
[3] Belgiovane, D., and C. C. Chen. Микро-допплеровские характеристики пешеходов и велосипедов для автомобильных радарных датчиков на 77 ГГц. В 11-й Европейской конференции по антеннам и распространению (EuCAP), 2912-2916. Париж: Европейская ассоциация по антеннам и распространению, 2017.
[4] Ангелов, А., А. Робертсон, Р. Мюррей-Смит, и Ф. Фиоранелли. Практическая классификация различных движущихся целей с использованием автомобильных радаров и глубоких нейронных сетей. Радар IET, гидролокатор и навигация. Том 12, № 10, 2017, с. 1082-1089.
[5] Парашар, К. Н., М. К. Овенеке, М. Рыкунов, Х. Сахли и А. Бурду. «Микро-допплеровские Редукции данных, использующие сверточные автоэнкодеры для целевой классификации с низкой задержкой». В 2017 году IEEE Radar Conf, 1739-1744. Сиэтл: IEEE, 2017.
batchNormalizationLayer
| classify
| convolution2dLayer
| layerGraph
| trainingOptions
| trainNetwork