exponenta event banner

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

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

Введение

Классификация целей является важной функцией в современных радиолокационных системах. В этом примере используется машинное и глубокое обучение для классификации радиолокационных эхо-сигналов от цилиндра и конуса. Хотя в этом примере используются синтезированные 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 default;
N = 100;
az = 2*randn(1,N);                  
el = 2*randn(1,N);
cylrtn = cyltgt(ones(1,N),[az;el]);  


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

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

load('RCSClassificationReturnsTraining');
load('RCSClassificationReturnsTest');

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

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

Вейвлет-рассеяние

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

Ключевыми параметрами для задания в сети вейвлет-временного рассеяния являются масштаб инварианта времени, количество вейвлет-преобразований и количество вейвлетов на октаву в каждом из блоков вейвлет-фильтров. Во многих применениях каскад из двух блоков фильтров достаточен для достижения хорошей производительности. В этом примере мы построим сеть вейвлет-временного рассеяния с двумя блоками фильтров: 4 вейвлета на октаву в первом блоке фильтров и 2 вейвлета на октаву во втором блоке фильтров. Шкала инвариантности устанавливается равной 701 выборке, длине данных.

sn = waveletScattering('SignalLength',701,'InvarianceScale',701,'QualityFactors',[4 2]);

Далее мы получаем преобразования рассеяния как обучающего, так и тестового наборов.

sTrain = sn.featureMatrix(RCSReturns{:,:},'transform','log');
sTest = sn.featureMatrix(RCSReturnsTest{:,:},'transform','log');

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

TrainFeatures = squeeze(mean(sTrain,2))';
TestFeatures = squeeze(mean(sTest,2))';

Создание меток для обучения и обучения

TrainLabels = repelem(categorical({'Cylinder','Cone'}),[50 50])';
TestLabels = repelem(categorical({'Cylinder','Cone'}),[25 25])';

Обучение модели

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

template = templateSVM('KernelFunction', 'polynomial', ...
    'PolynomialOrder', 2, ...
    'KernelScale', 'auto', ...
    'BoxConstraint', 1, ...
    'Standardize', true);
classificationSVM = fitcecoc(...
    TrainFeatures, ...
    TrainLabels, ...
    'Learners', template, ...
    'Coding', 'onevsone', ...
    'ClassNames', categorical({'Cylinder','Cone'}));
partitionedModel = crossval(classificationSVM, 'KFold', 5);
[validationPredictions, validationScores] = kfoldPredict(partitionedModel);
validationAccuracy = (1 - kfoldLoss(partitionedModel, 'LossFun', 'ClassifError'))*100
validationAccuracy = 100

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

Используя обученный SVM, классифицируйте характеристики рассеяния, полученные из тестового набора.

predLabels = predict(classificationSVM,TestFeatures);
accuracy = sum(predLabels == TestLabels )/numel(TestLabels)*100
accuracy = 100

Постройте график матрицы путаницы.

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

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

Трансфер обучения с помощью CNN

SqueeExNet - это глубокая сверточная нейронная сеть (CNN), обученная изображениям в 1000 классах, как используется в Вызове масштабного визуального распознавания ImageNet (ILSVRC). В этом примере мы повторно используем предварительно обученный SqueeEcNet для классификации радарных возвращений, принадлежащих одному из двух классов.

Загрузить SqueeEnet.

snet = squeezenet;

SqueeeNet состоит из 68 слоев. Как и все DCNN, SqueeENet каскадирует сверточные операторы, за которыми следуют нелинейности и объединение или усреднение. SqueeENet ожидает ввод изображения размером 227-на-227-на-3, которое можно увидеть со следующим кодом.

snet.Layers(1)
ans = 
  ImageInputLayer with properties:

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

   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: [1×1×3 single]

Кроме того, SqueEENet настроен на распознавание 1000 различных классов, которые можно увидеть с помощью следующего кода.

snet.Layers(68)
ans = 
  ClassificationOutputLayer with properties:

            Name: 'ClassificationLayer_predictions'
         Classes: [1000×1 categorical]
    ClassWeights: 'none'
      OutputSize: 1000

   Hyperparameters
    LossFunction: 'crossentropyex'

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

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

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

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 в качестве идеального СКР для использования. После получения CWT для каждого возврата цели мы делаем изображения из CWT каждого возвращения радара. Размер этих изображений изменяется таким образом, чтобы они были совместимы с входным слоем SqueeeNet, и мы используем SqueeNet для классификации полученных изображений.

Подготовка изображения

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

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 управление доступом к файлам из папок для обучения SqueeEcNet. Создание хранилищ данных как для учебных, так и для тестовых данных.

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

Чтобы использовать SqueeEcNet с этой проблемой двоичной классификации, нам нужно изменить пару слоев. Во-первых, мы меняем последний обучаемый слой в SqueeEcNet (уровень 64), чтобы иметь такое же количество сверток 1 на 1, как наше новое количество классов, 2.

lgraphSqueeze = layerGraph(snet);
convLayer = lgraphSqueeze.Layers(64);
numClasses = numel(categories(trainingData.Labels));
newLearnableLayer = convolution2dLayer(1,numClasses, ...
        'Name','binaryconv', ...
        'WeightLearnRateFactor',10, ...
        'BiasLearnRateFactor',10);
lgraphSqueeze = replaceLayer(lgraphSqueeze,convLayer.Name,newLearnableLayer);
classLayer = lgraphSqueeze.Layers(end);
newClassLayer = classificationLayer('Name','binary');
lgraphSqueeze = replaceLayer(lgraphSqueeze,classLayer.Name,newClassLayer);

Наконец, задайте параметры повторного обучения SqueeeNet. Установите начальную скорость обучения на 1e-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 использует ЦП, и обучение должно занять около пяти минут. Время обучения действительно варьируется в зависимости от ряда факторов. В этом случае обучение происходит на процессоре путем установки ExecutionEnvironment параметр для cpu.

CWTnet = trainNetwork(trainingData,lgraphSqueeze,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:06 |       60.00% |       2.6639 |      1.0000e-04 |
|       5 |          50 |       00:01:08 |      100.00% |       0.0001 |      1.0000e-04 |
|      10 |         100 |       00:02:11 |      100.00% |       0.0002 |      1.0000e-04 |
|      15 |         150 |       00:03:12 |      100.00% |   2.2264e-05 |      1.0000e-04 |
|========================================================================================|

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

predictedLabels = classify(CWTnet,testData,'ExecutionEnvironment','cpu');
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

Заключение

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

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