Этот пример показывает, как классифицировать радар, возвращает выделение признаков использования, сопровождаемое классификатором машины вектора поддержки (SVM).
Во втором фрагменте примера рабочий процесс глубокого обучения для того же набора данных проиллюстрирован с помощью сверточной нейронной сети и рекуррентной нейронной сети Долгой краткосрочной памяти (LSTM). Обратите внимание на то, что набор данных, используемый в этом примере, не требует усовершенствованных методов, но рабочий процесс описан, потому что он может использоваться для наборов более комплексных данных.
Этот пример требует:
Phased Array System Toolbox
Wavelet Toolbox
Statistics and Machine Learning Toolbox
Deep Learning Toolbox
Целевая классификация является важной функцией в современных радиолокационных системах. Из-за недавнего успеха использования методов машинного обучения для классификации существует большой интерес к применению подобных методов, чтобы классифицировать радар, возвращается. Этот пример запускается с рабочего процесса, где методы SVM используются, чтобы классифицировать радарное эхо от цилиндра и конуса. Несмотря на то, что этот пример использует синтезируемые выборки 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(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 заданы:
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, описаны. Этот рабочий процесс может быть применен к наборам более комплексных данных. Из-за характеристик сигнала мы выбрали, непрерывный вейвлет преобразовывают как наше идеальное представление частоты времени.