Пешеход и классификация велосипедистов Используя глубокое обучение

В этом примере показано, как классифицировать пешеходов и велосипедистов на основе их micro-Doppler характеристик с помощью нейронной сети для глубокого обучения и частотно-временного анализа.

Перемещения различных частей объекта, помещенного перед радаром, производят micro-Doppler подписи, которые могут использоваться, чтобы идентифицировать объект. Этот пример использует сверточную нейронную сеть (CNN), чтобы идентифицировать пешеходов и велосипедистов на основе их подписей.

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

Синтетическая генерация данных симуляцией

Данные, используемые, чтобы обучить сеть, сгенерированы с помощью backscatterPedestrian и backscatterBicyclist от Phased Array System Toolbox™. Эти функции симулируют радарное обратное рассеяние сигналов, отраженных от пешеходов и велосипедистов, соответственно.

Функция помощника helperBackScatterSignals генерирует конкретное количество пешехода, велосипедиста, и автомобильный радар возвращается. Поскольку цель примера состоит в том, чтобы классифицировать пешеходов и велосипедистов, этот пример рассматривает автомобильные подписи как источники шума только. Чтобы понять проблему классификации решить, исследуйте одну реализацию micro-Doppler подписи от пешехода, велосипедиста и автомобиля. (Для каждой реализации сигналы возврата имеют размерности Nfast-Nslow, где Nfast количество быстро-разовых выборок и Nslow количество медленно-разовых выборок. Смотрите Радарный Куб Данных для получения дополнительной информации.)

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 активация. Для руководства проектирования сети смотрите Советы Глубокого обучения и Приемы (Deep Learning Toolbox).

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 с помощью данных, которые содержат автомобильный шум.

Переобучите 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.