В этом примере показано, как классифицировать результаты работы радаров с помощью как машинного, так и глубокого обучения. Подход машинного обучения использует извлечение признака вейвлет-рассеяния в сочетании с машиной опорных векторов. Кроме того, проиллюстрированы два подхода к глубокому обучению: обучение передаче с использованием SqueeEcNet и рекуррентная нейронная сеть долговременной памяти (LSTM). Следует отметить, что набор данных, используемый в этом примере, не требует расширенных методов, но рабочий процесс описан, поскольку эти методы могут быть расширены до более сложных проблем.
Классификация целей является важной функцией в современных радиолокационных системах. В этом примере используется машинное и глубокое обучение для классификации радиолокационных эхо-сигналов от цилиндра и конуса. Хотя в этом примере используются синтезированные I/Q выборки, рабочий процесс применим к реальным радарным возвращениям.
В следующем разделе показано, как создавать синтезированные данные для обучения алгоритмам обучения.
Следующий код имитирует рисунок 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';

Для более сложных наборов данных процесс глубокого обучения может повысить производительность.
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:
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.