Радарная классификация целей Используя машинное обучение и глубокое обучение

Этот пример показывает, как классифицировать радар, возвращает выделение признаков использования, сопровождаемое классификатором машины вектора поддержки (SVM).

Во втором фрагменте примера рабочий процесс глубокого обучения для того же набора данных проиллюстрирован с помощью сверточной нейронной сети и рекуррентной нейронной сети Долгой краткосрочной памяти (LSTM). Обратите внимание на то, что набор данных, используемый в этом примере, не требует усовершенствованных методов, но рабочий процесс описан, потому что он может использоваться для наборов более комплексных данных.

Этот пример требует:

  • Phased Array System Toolbox

  • Wavelet Toolbox

  • Statistics and Machine Learning Toolbox

  • Deep Learning Toolbox

Введение

Целевая классификация является важной функцией в современных радиолокационных системах. Из-за недавнего успеха использования методов машинного обучения для классификации существует большой интерес к применению подобных методов, чтобы классифицировать радар, возвращается. Этот пример запускается с рабочего процесса, где методы SVM используются, чтобы классифицировать радарное эхо от цилиндра и конуса. Несмотря на то, что этот пример использует синтезируемые выборки I/Q, рабочий процесс применим к действительному радару, возвращается.

Синтез RCS

Следующий раздел показывает, как создать синтезируемые данные, чтобы обучить сеть.

Следующий код моделирует шаблон RCS цилиндра с радиусом 1 метра и высотой 10 метров. Рабочая частота радара составляет 850 МГц.

c = 3e8;
fc = 850e6;
[cylrcs,az,el] = rcscylinder(1,1,10,c,fc);
helperTargetRCSPatternPlot(az,el,cylrcs);

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

cyltgt = phased.BackscatterRadarTarget('PropagationSpeed',c,...
    'OperatingFrequency',fc,'AzimuthAngles',az,'ElevationAngles',el,'RCSPattern',cylrcs);

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

rng(2017);
N = 100;
az = 2*randn(1,N);                  % model vibration with +/- 2 degrees around boresight
el = 2*randn(1,N);
cylrtn = cyltgt(ones(1,N),[az;el]); % generate target echo

clf
plot(mag2db(abs(cylrtn)));
xlabel('Time Index')
ylabel('Target Return (dB)');
title('Target Return for Cylinder');

Возврат конуса может быть сгенерирован так же. Чтобы создать набор обучающих данных для классификатора SVM, вышеупомянутый процесс повторяется для 5 произвольно выбранных цилиндрических радиусов. Кроме того, для каждого радиуса, 10 профилей движения моделируются путем варьирования инцидентного угла после 10 случайным образом сгенерированных кривых синусоиды вокруг опорного направления. В каждом профиле движения существует 701 выборка, таким образом, существует 701x50 выборки для каждой формы всего. Из-за долгого времени вычисления данные тренировки предварительно вычислены и загружены ниже.

load('RCSClassificationReturnsTraining');

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

clf;
subplot(2,2,1); plot(cylinderAspectAngle(1,:)); ylim([-90 90]);
title('Cylinder Aspect Angle vs. Time'); xlabel('Time Index'); ylabel('Aspect Angle (degrees)');
subplot(2,2,3); plot(RCSReturns.Cylinder_1); ylim([-50 50]);
title('Cylinder Return'); xlabel('Time Index'); ylabel('Target Return (dB)');
subplot(2,2,2); plot(coneAspectAngle(1,:)); ylim([-90 90]);
title('Cone Aspect Angle vs. Time'); xlabel('Time Index'); ylabel('Aspect Angle (degrees)');
subplot(2,2,4); plot(RCSReturns.Cone_1); ylim([-50 50]);
title('Cone Return'); xlabel('Time Index'); ylabel('Target Return (dB)');

Выделение признаков

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

Существует множество способов извлечь функции этого типа набора данных. Чтобы получить правильную функцию, часто полезно смотреть на представление частоты времени данных, где частота из-за движения отличается через радарные импульсы. Подпись частоты времени сигнала может быть выведена любым преобразованием Фурье (спектрограмма), или вейвлет преобразовывает. А именно, этот пример использует пакетное представление вейвлета сигнала. Следующие графики показывают пакетные подписи вейвлета и для конуса и для цилиндра. Эти подписи обеспечивают некоторое понимание, которое алгоритмы изучения смогут отличить между двумя. А именно, существует разделение между содержимым частоты в зависимости от времени между этими двумя подписями.

levels = 3;
[wpt,~,F] = modwpt(RCSReturns{:,1},'fk6',levels,'TimeAlign',true);
clf;
contour(1:size(wpt,2),F,abs(wpt).^2); grid on;
xlabel('Time Index'); ylabel('Cycles per sample'); title('Wavelet Packet for Cylinder Return');

[wpt,~,F,E,RE] = modwpt(RCSReturns{:,51},'fk6',levels,'TimeAlign',true);
clf;
contour(1:size(wpt,2),F,abs(wpt).^2); grid on;
xlabel('Time Index'); ylabel('Cycles per sample'); title('Wavelet Packet for Cone Return');

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

T = array2table([F E RE*100],'VariableNames',{'CenterFrequency','Energy','PercentEnergy'});
disp(T)
    CenterFrequency      Energy      PercentEnergy
    _______________    __________    _____________

        0.03125        1.9626e+05         42.77   
        0.09375             82923        18.071   
        0.15625             65162          14.2   
        0.21875             46401        10.112   
        0.28125             37044        8.0728   
        0.34375             20725        4.5166   
        0.40625              8952        1.9509   
        0.46875            1405.4       0.30626   

Таблица показывает частоты центра поддиапазона в циклах/выборке, энергию в тех поддиапазонах и процент полной энергии в каждом поддиапазоне. Обратите внимание на то, что MODWPT сохраняет энергию сигнала, которая является важным свойством, которого очень трудно достигнуть с обычной полосовой фильтрацией. А именно, у вас есть разложение сигнала в поддиапазоны, которое подражает ортогональному преобразованию. В проблемах классификации сигнала, где существует разделение частоты между классами, это свойство значительно улучшает способность классификатора точно отличить классы.

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

trainingData = varfun(@(x)helperWPTFeatureExtraction(x,'fk6',levels),RCSReturns);
trainingData = array2table(table2array(trainingData)');
% 50 cylinders followed by 50 cones
shapeTypes = categorical({'Cylinder';'Cones'});
trainingData.Type = shapeTypes([zeros(50,1); ones(50,1)]+1);

Образцовое обучение

Приложение Classification Learner может использоваться, чтобы обучить классификатор. Однажды данные тренировки загружается, это может помочь применить различные алгоритмы изучения против набора данных и сообщить точность классификации. Следующее изображение является снимком состояния приложения.

На основе результата этот пример использует метод SVM и затем генерирует соответствующий учебный алгоритм, helperTrainClassifier, из приложения. Вывод учебного алгоритма является сконфигурированным классификатором, trainedClassifier, готовым выполнять классификацию.

[trainedClassifier, validationAccuracy] = helperTrainClassifier(trainingData);

Целевая классификация

Если модель готова, сеть может обработать полученный целевой возврат и выполнить классификацию с помощью метода predictFcn. Следующий раздел примера создает набор тестовых данных с помощью подхода, подобного созданию данных тренировки. Эти данные передаются через выведенный классификатор, чтобы видеть, может ли это правильно классифицировать две формы. Тестовые данные содержат 25 цилиндров, возвращается, и 25 конусов возвращаются. Эти цилиндры и конусы состоят из 5 размеров для каждой формы и 5 профилей движения для каждого размера. Процесс генерации совпадает с данными тренировки, но с определенными значениями немного отличаются из-за случайности значений размера и инцидентных угловых значений. Общее количество выборок для каждой формы 701x25.

load('RCSClassificationReturnsTest');

testData = varfun(@(x)helperWPTFeatureExtraction(x,'fk6',levels),RCSReturnsTest);
testData = array2table(table2array(testData)');
testResponses = shapeTypes([zeros(25,1); ones(25,1)]+1); % 25 cylinders followed by 25 cones

testPredictions = trainedClassifier.predictFcn(testData);
cmat = confusionmat(testResponses, testPredictions)
cmat =

    16     9
     0    25

Из матрицы беспорядка это может быть вычислено, что общая точность составляет приблизительно 82%.

classacc = sum(diag(cmat))/sum(cmat(:))
classacc =

    0.8200

Возможно улучшать производительность классификатора путем увеличения качества и количества данных тренировки. Кроме того, процесс выделения признаков может быть улучшен, чтобы далее отличить характеристики каждой цели в рамках алгоритма классификации. Обратите внимание на то, что различные функции могут иметь различные оптимальные алгоритмы классификации.

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

clear all;
close all;
load RCSClassificationReturnsTraining;
load RCSClassificationReturnsTest;

Передайте изучение

AlexNet является глубоким CNN, разработанным Алексом Крижевским и используемым в Крупном масштабе ImageNet визуальной проблеме распознавания (ILSVRC). Соответственно, AlexNet был обучен распознать изображения в 1 000 классов. В этом примере мы снова используем предварительно обученный AlexNet, чтобы классифицировать радар, возвращает принадлежность одному из двух классов. Чтобы использовать AlexNet, необходимо установить Модель Deep Learning Toolbox™ для пакета Сетевой поддержки AlexNet. Сделать это использование Add-On Explorer MATLAB™. Если вы успешно установили AlexNet, можно выполнить следующий код, чтобы загрузить сеть и отобразить сетевые слои.

anet = alexnet;
anet.Layers
ans = 

  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

Вы видите, что AlexNet состоит из 25 слоев. Как весь DCNNs, AlexNet располагает каскадом сверточные операторы, сопровождаемые нелинейностью и объединением или усреднением. AlexNet ожидает вход изображений размера 227 227 3, который вы видите со следующим кодом.

anet.Layers(1)
ans = 

  ImageInputLayer with properties:

                Name: 'data'
           InputSize: [227 227 3]

   Hyperparameters
    DataAugmentation: 'none'
       Normalization: 'zerocenter'
        AverageImage: [227×227×3 single]

Кроме того, AlexNet сконфигурирован к распознанным 1 000 различных классов, которые вы видите со следующим кодом.

anet.Layers(23)
ans = 

  FullyConnectedLayer with properties:

          Name: 'fc8'

   Hyperparameters
     InputSize: 4096
    OutputSize: 1000

   Learnable Parameters
       Weights: [1000×4096 single]
          Bias: [1000×1 single]

Use properties method to see a list of all properties.

В порядке использовать AlexNet на нашей бинарной проблеме классификации, мы должны измениться полностью связанный и слои классификации.

layers = anet.Layers;
layers(23) = fullyConnectedLayer(2);
layers(25) = classificationLayer;

Непрерывный вейвлет преобразовывает

AlexNet разработан, чтобы отличить различия в изображениях и классифицировать результаты. Поэтому в порядке использовать AlexNet, чтобы классифицировать радар возвращается, мы должны преобразовать 1D радар, возвращают временные ряды в изображение. Распространенный способ сделать это должно использовать представление частоты времени (TFR). Существует много вариантов для представления частоты времени сигнала и какой является самым соответствующим, зависит от характеристик сигнала. Чтобы определить, какой TFR может подходить для этой проблемы, случайным образом выберите и постройте некоторых, радар возвращается из каждого класса.

  rng default;
  idxCylinder = randperm(50,2);
  idxCone = randperm(50,2)+50;

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

cwt(RCSReturns{:,idxCylinder(1)},'VoicesPerOctave',8)

CWT одновременно получает и медленно переменный (низкая частота) колебания и переходные процессы. Контрастируйте CWT цилиндра возвращаются с одним из конической цели.

cwt(RCSReturns{:,idxCone(2)},'VoicesPerOctave',8);

Из-за очевидной важности переходных процессов в определении, происходит ли целевой возврат из цилиндра или конической цели, мы выбираем CWT как идеальный TFR, чтобы использовать. После получения CWT для каждого целевого возврата мы заставляем изображения из CWT каждого радара возвратиться. Эти изображения изменены, чтобы быть совместимыми с входным слоем AlexNet, и мы усиливаем AlexNet, чтобы классифицировать получившиеся изображения.

Отобразите подготовку

Функция помощника, helpergenWaveletTFImg, получает CWT для каждого радара, возвращаются, изменяет CWT, чтобы быть совместимым с AlexNet и пишет CWT как jpeg файл. Чтобы запустить helpergenWaveletTFImg, выберите parentDir, где у вас есть разрешение записи. Этот пример использует tempdir, но можно использовать любую папку на машине, где у вас есть разрешение записи. Функция помощника создает Training и папки набора Test под parentDir, а также подпапки Cylinder и Cone создания и под Training и под Test. Эти папки заполняются с изображениями jpeg, которые будут использоваться в качестве входных параметров к AlexNet.

parentDir = tempdir;
helpergenWaveletTFImg(parentDir,RCSReturns,RCSReturnsTest)
Generating Time-Frequency Representations...Please Wait
   Creating Cylinder Time-Frequency Representations ... Done
   Creating Cone Time-Frequency Representations ... Done
   Creating Cylinder Time-Frequency Representations ... Done
   Creating Cone Time-Frequency Representations ... Done

Теперь используйте imageDataStore, чтобы управлять доступом к файлу от папок в порядке обучить AlexNet. Создайте хранилища данных и для обучения и для тестовых данных.

trainingData= imageDatastore(fullfile(parentDir,'Training'), 'IncludeSubfolders', true,...
    'LabelSource', 'foldernames');
testData = imageDatastore(fullfile(parentDir,'Test'),'IncludeSubfolders',true,...
    'LabelSource','foldernames');

Установите опции для переквалификации AlexNet. Установите начальную букву, изучают уровень 10^ (-4), определите максимальный номер эпох к 15 и мини-пакетного размера к 10. Используйте стохастический спуск градиента с импульсом.

ilr = 1e-4;
mxEpochs = 15;
mbSize =10;
opts = trainingOptions('sgdm', 'InitialLearnRate', ilr, ...
    'MaxEpochs',mxEpochs , 'MiniBatchSize',mbSize, ...
    'Plots', 'training-progress','ExecutionEnvironment','cpu');

Обучите сеть. Если у вас есть совместимый графический процессор, trainNetwork автоматически использует графический процессор, и обучение должно завершиться меньше чем через одну минуту. Если у вас нет совместимого графического процессора, trainNetwork использует центральный процессор, и обучение должно занять приблизительно пять минут. Учебные времена действительно отличаются на основе многих факторов. В этом случае обучение происходит на CPU путем установки параметра ExecutionEnvironment на cpu.

CWTnet = trainNetwork(trainingData,layers,opts);
Initializing input data normalization.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:02 |       50.00% |       1.9349 |      1.0000e-04 |
|       5 |          50 |       00:00:39 |      100.00% |   1.9074e-07 |      1.0000e-04 |
|      10 |         100 |       00:01:15 |      100.00% |   5.0068e-07 |      1.0000e-04 |
|      15 |         150 |       00:01:50 |      100.00% |   7.1526e-08 |      1.0000e-04 |
|========================================================================================|

Используйте обучивший сеть, чтобы предсказать, что цель возвращается в протянутом наборе тестов.

predictedLabels = classify(CWTnet,testData);
accuracy = sum(predictedLabels == testData.Labels)/50*100
accuracy =

   100

Постройте график беспорядка наряду с точностью и отзывом. В этом случае 100% тестовых выборок классифицируются правильно.

figure('Units','normalized','Position',[0.2 0.2 0.5 0.5]);
ccDCNN = confusionchart(testData.Labels,predictedLabels);
ccDCNN.Title = 'Confusion Chart';
ccDCNN.ColumnSummary = 'column-normalized';
ccDCNN.RowSummary = 'row-normalized';

LSTM

В итоговом разделе этого примера описан рабочий процесс LSTM. Сначала слои LSTM заданы:

LSTMlayers = [ ...
    sequenceInputLayer(1)
    bilstmLayer(100,'OutputMode','last')
    fullyConnectedLayer(2)
    softmaxLayer
    classificationLayer
    ];
options = trainingOptions('adam', ...
    'MaxEpochs',30, ...
    'MiniBatchSize', 150, ...
    'InitialLearnRate', 0.01, ...
    'GradientThreshold', 1, ...
    'plots','training-progress', ...
    'Verbose',false,'ExecutionEnvironment','cpu');
trainLabels = repelem(categorical({'cylinder','cone'}),[50 50]);
trainLabels = trainLabels(:);
trainData = num2cell(table2array(RCSReturns)',2);
testData = num2cell(table2array(RCSReturnsTest)',2);
testLabels = repelem(categorical({'cylinder','cone'}),[25 25]);
testLabels = testLabels(:);
RNNnet = trainNetwork(trainData,trainLabels,LSTMlayers,options);

Точность для этой системы также построена.

predictedLabels = classify(RNNnet,testData,'ExecutionEnvironment','cpu');
accuracy = sum(predictedLabels == testLabels)/50*100
accuracy =

   100

Заключение

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

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