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

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

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

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

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

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

Функция помощника helperBackScatterSignals генерирует заданное количество пешеходов, велосипедистов и автомобильных радиолокационных возвратов. Поскольку целью примера является классификация пешеходов и велосипедистов, этот пример рассматривает сигнатуры автомобилей только как источники шума. Чтобы получить представление о проблеме классификации, чтобы решить, исследуйте одну реализацию микродопплеровской подписи от пешехода, велосипедиста и автомобиля. (Для каждой реализации обратные сигналы имеют размерности Nfastоколо-Nslow, где Nfast количество быстрых выборок и Nslow количество медленных выборок. Для получения дополнительной информации см. 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 с помощью данных, которые содержат шум автомобиля.

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

См. также

| | | | |

Похожие темы