В этом примере показано, как классифицировать пешеходов и велосипедистов на основе их micro-Doppler характеристик с помощью нейронной сети для глубокого обучения и частотно-временного анализа.
Перемещения различных частей объекта, помещенного перед радаром, производят micro-Doppler подписи, которые могут использоваться, чтобы идентифицировать объект. Этот пример использует сверточную нейронную сеть (CNN), чтобы идентифицировать пешеходов и велосипедистов на основе их подписей.
Этот пример обучает нейронную сеть для глубокого обучения с помощью симулированных данных и затем исследует, как сеть выполняет при классификации двух случаев перекрывающихся подписей.
Данные, используемые, чтобы обучить сеть, сгенерированы с помощью и от Phased Array System Toolbox™. Эти функции симулируют радарное обратное рассеяние сигналов, отраженных от пешеходов и велосипедистов, соответственно.
Функция помощника helperBackScatterSignals
генерирует конкретное количество пешехода, велосипедиста, и автомобильный радар возвращается. Поскольку цель примера состоит в том, чтобы классифицировать пешеходов и велосипедистов, этот пример рассматривает автомобильные подписи как источники шума только. Чтобы понять проблему классификации решить, исследуйте одну реализацию micro-Doppler подписи от пешехода, велосипедиста и автомобиля. (Для каждой реализации сигналы возврата имеют размерности -, где количество быстро-разовых выборок и количество медленно-разовых выборок. Смотрите для получения дополнительной информации.)
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) радара, возвращаются, чтобы сгенерировать micro-Doppler подпись. Чтобы получить micro-Doppler подписи, используйте функции помощника, чтобы применить 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) показывают, что три объекта имеют довольно отличные подписи. А именно, спектрограммам пешехода и велосипедиста вызвало богатые micro-Doppler подписи колебание рук и участков и вращения колес, соответственно. В отличие от этого, в этом примере, автомобиль моделируется как цель точки с твердым телом, таким образом, спектрограмма автомобиля показывает, что краткосрочный Доплеровский сдвиг частоты варьируется мало, указывая на небольшой микроэффект Доплера.
Классификация одной реализации как пешеход или велосипедист относительно проста, потому что пешеход и велосипедист micro-Doppler подписи отличаются. Однако классификация нескольких перекрывающихся пешеходов или велосипедистов, со сложением Гауссова шума или автомобильного шума, намного больше затрудняет.
Если несколько объектов существуют в области обнаружения радара одновременно, полученный радарный сигнал является суммированием сигналов обнаружения от всех объектов. Как пример, сгенерируйте полученный радарный сигнал для пешехода и велосипедиста с Гауссовым фоновым шумом.
% 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
Затем получите micro-Doppler подписи полученного сигнала при помощи 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,4 ч] метры/секунда, где h
значение высоты
2) Велосипедисты
Заголовок — Равномерно распределенный в интервале [–180, 180] степени
Скорость — Равномерно распределенный в интервале [1, 10] метры/секунда
Коэффициент передачи механизма — Равномерно распределенный в интервале [0.5, 6]
Езда на велосипеде или каботажное судоходство — 50%-я вероятность езды на велосипеде (курсирующий средние значения, которые велосипедист перемещает, не ездя на велосипеде),
3) Автомобили
Скорость — Равномерно распределенный в интервале [0, 10] метры/секунда вдоль направлений X и Y
Вход к сверточной сети является micro-Doppler подписями, состоящими из спектрограмм, выраженных в децибелах и нормированных к [0, 1], как показано в этом рисунке:
Радар возвращается, происходят из различных объектов и различных частей объектов. В зависимости от настройки некоторые возвраты намного более сильны, чем другие. Более сильные возвраты имеют тенденцию затенять более слабые единицы. Логарифмическое масштабирование увеличивается, функции созданием возвращают сопоставимые сильные места. Амплитудная нормализация помогает CNN сходиться быстрее.
Набор данных содержит реализацию следующих сцен:
Один пешеход, присутствующий в сцене
Один велосипедист, присутствующий в сцене
Один пешеход и один велосипедист, присутствующий в сцене
Два пешехода, присутствующие в сцене
Два велосипедиста, присутствующие в сцене
Данные для этого примера состоят из 20 000 пешеходов, 20 000 велосипедистов и 12 500 автомобильных сигналов, сгенерированных при помощи функций помощника helperBackScatterSignals
и helperDopplerSignatures
. Сигналы разделены на два набора данных: один без автомобильных выборок шума и один с автомобильными выборками шума.
Для набора First Data (без автомобильного шума), были объединены сигналы пешехода и велосипедиста, Гауссов шум был добавлен, и micro-Doppler подписи были вычислены, чтобы сгенерировать 5 000 подписей для каждой из этих пяти сцен, которые будут классифицированы.
В каждой категории 80% подписей (то есть, 4 000 подписей) резервируются для обучающего набора данных, в то время как 20% подписей (то есть, 1 000 подписей) резервируются для набора тестовых данных.
Чтобы сгенерировать второй набор данных (с автомобильным шумом), процедура для набора First Data была выполнена, за исключением того, что автомобильный шум был добавлен к 50% подписей. Пропорция подписей с и без автомобильного шума является тем же самым в наборах тестовых данных и обучении.
Загрузите и разархивируйте данные в своей временной директории, местоположение которой задано tempdir
MATLAB® команда. Из-за большого размера набора данных, этот процесс может занять несколько минут. Если у вас есть данные в папке, отличающейся от
tempdir
, измените имя каталога в последующих инструкциях.
% Download the data dataURL = 'https://www.mathworks.com/supportfiles/SPT/data/PedBicCarData.zip'; saveFolder = fullfile(tempdir,'PedBicCarData'); zipFile = fullfile(tempdir,'PedBicCarData.zip'); if ~exist(saveFolder,'dir') websave(zipFile,dataURL); end % Unzip the data unzip(zipFile,tempdir)
Файлы данных следующие:
trainDataNoCar.mat
содержит обучающий набор данных trainDataNoCar
и его метка установила trainLabelNoCar
.
testDataNoCar.mat
содержит набор тестовых данных testDataNoCar
и его метка установила testLabelNoCar
.
trainDataCarNoise.mat
содержит обучающий набор данных trainDataCarNoise
и его метка установила trainLabelCarNoise
.
testDataCarNoise.mat
содержит набор тестовых данных testDataCarNoise
и его метка установила testLabelCarNoise
.
TF.mat
содержит время и информацию о частоте для micro-Doppler подписей.
Создайте 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. Обучите сеть с помощью или центрального процессора или графического процессора. Используя графический процессор требует Parallel Computing Toolbox™, и CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.0 или выше. Для получения информации о других параметрах смотрите 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');
Загрузите набор данных без автомобильного шума и используйте функцию помощника 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
Матрица беспорядка показывает, что большинство ошибок прогноза происходит, когда сеть берет в сценах от "пешехода", "pedestrian+pedestrian", или "pedestrian+bicyclist" классы и классифицирует их как "велосипедиста".
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 поврежденных автомобилем-шумом тестовых данных, которая не имеет автомобильного шума, имеет двух велосипедистов с наложением micro-Doppler подписи. Сеть правильно предсказывает, что сцена имеет двух велосипедистов.
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] Чен, V. C. Микроэффект Доплера в радаре. Лондон: дом Artech, 2011.
[2] Gurbuz, S. Z. и Амин, M. G. "Основанное на радаре Распознавание Человеческого Движения с Глубоким обучением: Обещание Приложений для Внутреннего Контроля". Журнал Обработки сигналов IEEE. Издание 36, Выпуск 4, 2019, стр 16–28.
[3] Belgiovane, D. и К. К. Чен. "Характеристики Micro-Doppler Пешеходов и Велосипедов для Автомобильных Радарных Датчиков на уровне 77 ГГц". На 11-й европейской Конференции по Антеннам и Распространению (EuCAP), 2912–2916. Париж: европейская Ассоциация на Антеннах и Распространении, 2017.
[4] Ангелов, A., А. Робертсон, Р. Мюррей-Смит и Ф. Фьоранелли. "Практическая Классификация Различных Движущихся Целей Используя Автомобильный Радар и Глубокие нейронные сети". IET Radar, Sonar & Navigation. Издание 12, Номер 10, 2017, стр 1082–1089.
[5] Parashar, K. N. Член конгресса Овенек, М. Рыкунов, Х. Сэхли и А. Боердукс. "Извлечение признаков Micro-Doppler Используя Сверточные Автоэнкодеры для Низкой Классификации Целей Задержки". На 2 017 Радарных Конференциях по IEEE (RadarConf), 1739–1744. Сиэтл: IEEE, 2017.
batchNormalizationLayer
| classify
| convolution2dLayer
| layerGraph
| trainNetwork
| trainingOptions