基于机器学习和深度学习的雷达目标分类

这个例子展示了如何用机器和深度学习方法对雷达回波进行分类。该方法采用小波散射特征提取和支持向量机相结合的方法。此外,还介绍了两种深度学习方法:挤压网转移学习和长短期记忆(LSTM)递归神经网络。注意,本例中使用的数据集不需要高级技术,但是描述了工作流,因为这些技术可以扩展到更复杂的问题。万博1manbetx

介绍

目标分类是现代雷达系统的一个重要功能。这个例子使用机器和深度学习来区分来自圆柱和圆锥的雷达回波。虽然本例使用了合成的I/Q样本,但是该工作流适用于实际的雷达返回。

RCS综合

下一节演示如何创建合成数据来训练学习算法。

下面的代码模拟缸筒用的1米的半径为10米的高度的RCS图案。雷达的工作频率为850兆赫。

C = 3E8;FC = 850e6;[cylrcs,AZ,EL] = rcscylinder(1,1,10,C,FC);helperTargetRCSPatternPlot(AZ,EL,cylrcs);

然后,该图形可被施加到反向散射雷达目标从不同方面的角度模拟回报。

cyltgt=相位后向散射目标('PropagationSpeed',C,...“OperatingFrequency”,FC,'方位机库',AZ,'ElevationAngles',艾尔,'RCSPattern',cylrcs);

下图显示了如何模拟圆柱体随时间的100次返回。假设圆柱体向下运动时,会引起瞄准孔周围的小振动,因此,从一个样本到下一个样本的方位角会发生变化。

rng默认;N = 100;阿兹= 2 * randn (1, N);el = 2 * randn (1, N);cylrtn = cyltgt ((1, N), [az; el]);情节(mag2db (abs (cylrtn)));xlabel(“时间指数”)ylabel (“目标回报(dB)”);标题('气缸目标回油');

同样可以产生的圆锥形的回报。为了创建训练集,重复进行5个任意选择的汽缸半径上述过程。此外,对于每个半径,10的运动轨迹可通过改变以下10随机产生的视轴周围正弦曲线的入射角模拟。有701样品中的每个运动轨迹,所以有701-通过-50样品。重复该过程用于气缸的目标,这导致训练数据的701-通过-100基质与气缸50和50个锥形轮廓。在测试组,我们使用25缸和25条圆锥曲线创建一个701-通过-50训练集。因为计算时间长,训练数据预计算及以下加载。

加载('RCSClassificationReturnsTraining');加载('RCSClassificationReturnsTest');

作为一个实例,下图显示了从各形状运动简档之一的返回。该图显示的值随着时间的推移对事件的方位角和目标回报率都如何变化。

子批次(2,2,1)绘图(圆柱体Aspectangle(1,:))ylim([-90 90])网格标题(“缸方向角度与时间”);xlabel(“时间指数”);ylabel('角度(度)');次要情节(2,2,3)情节(RCSReturns.Cylinder_1);ylim (50 [-50]);格标题(“缸返回”);xlabel(“时间指数”);ylabel(“目标回报(dB)”);副区(2,2,2)情节(coneAspectAngle(1,:));ylim([ -  90 90]);格;标题('圆锥角度与时间');xlabel(“时间指数”);ylabel('角度(度)');副区(2,2,4);情节(RCSReturns.Cone_1);ylim (50 [-50]);格;标题('锥形返回');xlabel(“时间指数”);ylabel(“目标回报(dB)”);

小波散射

在小波散射特征提取器,数据是通过一系列的小波变换,非线性,和平均化的时间系列生产低方差表示传播。小波时散射产量信号表示不敏感的输入信号的变化,而不会牺牲类辨性。

关键参数来指定一个小波时散射分解是不随时间变化的比例,小波变换的次数,和每倍频程的子波在每个小波滤波器组的数量。在许多应用中,两个过滤银行的级联足以取得良好的业绩。在这个例子中,我们构建使用默认的滤波器组小波时间散射分解:每倍频程8个小波在第一滤波器组和第二滤波器组每倍频程1个小波。不变性规模被设置为701个的样品,数据的长度。

SF = waveletScattering(“SignalLength”,701,'InvarianceScale',701页);

接下来,我们得到了训练集和测试集的散射变换。

应变= sf.featureMatrix (RCSReturns {:,:},'转变'“日志”);圣= sf.featureMatrix (RCSReturnsTest {:,:},'转变'“日志”);

对于本例,使用沿每个路径的散射系数的平均值。

TrainFeatures=挤压(平均(应变,2))';TestFeatures=挤压(平均(sTest,2))';

为培训和学习创建标签

TrainLabels=重复(分类({“气缸”'圆锥体'}),[50 50])';测试标签=重复(分类({“气缸”'圆锥体'}),[25 25])';

模型训练

适合与二次内万博1manbetx核向散射特征的支持向量机模型,将获得的交叉验证的精度。

模板= templateSVM(“KernelFunction”“多项式”...'PolynomialOrder',2岁,...'KernelScale''自动'...'BoxConstraint',1,...“标准化”,真正的);classificationSVM = fitcecoc(...TrainFeatures,...TrainLabels,...“学习者”,模板,...'编码''onevsone'...“类名”,分类的({“气缸”'圆锥体'}));partitionedModel=crossval(分类vm,'KFold'5);[validation, validationScores] = kfoldPredict(partitionedModel);validationAccuracy = (1 - kfoldLoss(partitionedModel,'LossFun''ClassifError'类))*100个
validationAccuracy=100

目标分类

利用训练的SVM,特征分类从测试组中获得的散射。

predLabels =预测(classificationSVM,TestFeatures);精度=总和(predLabels == TestLabels)/ numel(TestLabels)* 100
精度=100

绘制混淆矩阵。

数字(“单位”“规范化”“位置”,[0.2 0.2 0.5 0.5]);ccDCNN=confusionchart(测试标签,预标签);ccDCNN.Title='混乱图表';ccDCNN。ColumnSummary =“列归一化”;ccDCNN.RowSummary =“row-normalized”;

对于更复杂的数据集,深学习工作流程可以提高性能。

迁移学习与CNN

SqueezeNet是训练中1000班的图像深卷积神经网络(CNN)作为ImageNet大型视觉识别挑战(ILSVRC)使用。在这个例子中,我们重用预先训练SqueezeNet属于两个类别中的一个分类的雷达回波。

加载SqueezeNet。

SNET = squeezenet;snet.Layers
ANS = 68x1层阵列层:1 '数据' 图像输入227x227x3图像与 'zerocenter' 正常化2 'CONV1' 卷积64个3x3x3的卷积与步幅[2 2]和填充[0 0 0 0] 3 'relu_conv1' RELU RELU 4'POOL1' 最大池3x3的最大蓄留与步幅[2 2]和填充[0 0 0 0]的5 'FIRE2-squeeze1x1' 卷积16个1x1x64卷积步幅[1 1]和填充[0 0 0 0] 6“fire2-relu_squeeze1x1' RELU RELU 7 'FIRE2-expand1x1' 卷积64个1x1x16卷积步幅[1 1]和填充[0 0 0 0] 8 'FIRE2-relu_expand1x1' RELU RELU 9 'FIRE2-expand3x3' 卷积64个3x3x16卷积与步幅[1的2个输入12 'FIRE3-squeeze1x1' 1]和填充[1 1 1 1] 10 'FIRE2-relu_expand3x3' RELU RELU 11 'FIRE2-的concat' 深度级联深度级联卷积16个1x1x128卷积步幅[1 1]和填充[0 0 0 0] 13 'FIRE3-relu_squeeze1x1' RELU RELU 14 'FIRE3-expand1x1' 卷积64个1x1x16卷积步幅[1 1]和填充[0 0 0 0] 15“FIRE3-RELu_expand1x1' RELU RELU 16 'FIRE3-expand3x3' 卷积64个3x3x16卷积步幅[1 1]和填充[1 1 1 1] 17 'FIRE3-relu_expand3x3' RELU RELU 18 'FIRE3-的concat' 深度的2个输入19级联深度级联'pool3' 最大池3x3的最大蓄留与步幅[2 2]和填充[0 1 0 1] 20 'FIRE4-squeeze1x1' 卷积32个1x1x128卷积步幅[1 1]和填充[0 0 0 0] 21“fire4-relu_squeeze1x1' RELU RELU 22 'FIRE4-expand1x1' 卷积128个1x1x32卷积步幅[1 1]和填充[0 0 0 0] 23 'FIRE4-relu_expand1x1' RELU RELU 24 'FIRE4-expand3x3' 卷积128个3x3x32卷积与步幅[1的2个输入27 'FIRE5-squeeze1x1' 1]和填充[1 1 1 1] 25 'FIRE4-relu_expand3x3' RELU RELU 26 'FIRE4-的concat' 深度级联深度级联卷积32个1x1x256卷积步幅[1 1]和填充[0 0 0 0] 28 'FIRE5-relu_squeeze1x1' RELU RELU 29 'FIRE5-expand1x1' 卷积128个1x1x32卷积步幅[1 1]和填充[00 0 0] 30 'FIRE5-relu_expand1x1' RELU RELU 31 'FIRE5-expand3x3' 卷积128个3x3x32卷积步幅[1 1]和填充[1 1 1 1] 32 'FIRE5-relu_expand3x3' RELU RELU 33 'FIRE5-的concat'的2个输入深度级联深度级联34 'pool5' 最大池3x3的最大蓄留与步幅[2 2]和填充[0 1 0 1] 35 'FIRE6-squeeze1x1' 卷积48个1x1x256卷积步幅[1 1]和填充[0 0 0 0] 36 'fire6-relu_squeeze1x1' ReLU ReLU 37 'fire6-expand1x1' Convolution 192 1x1x48 convolutions with stride [1 1] and padding [0 0 0 0] 38 'fire6-relu_expand1x1' ReLU ReLU 39 'fire6-expand3x3' Convolution 192 3x3x48 convolutions with stride [1 1] and padding [1 1 1 1] 40 'fire6-relu_expand3x3' ReLU ReLU 41 'fire6-concat' Depth concatenation Depth concatenation of 2 inputs 42 'fire7-squeeze1x1' Convolution 48 1x1x384 convolutions with stride [1 1] and padding [0 0 0 0] 43 'fire7-relu_squeeze1x1' ReLU ReLU 44 'fire7-expand1x1' Convolution 192 1x1x48 convolutions with stride [1 1] and padding [0 0 0 0] 45 'fire7-relu_expand1x1' ReLU ReLU 46 'fire7-expand3x3' Convolution 192 3x3x48 convolutions with stride [1 1] and padding [1 1 1 1] 47 'fire7-relu_expand3x3' ReLU ReLU 48 'fire7-concat' Depth concatenation Depth concatenation of 2 inputs 49 'fire8-squeeze1x1' Convolution 64 1x1x384 convolutions with stride [1 1] and padding [0 0 0 0] 50 'fire8-relu_squeeze1x1' ReLU ReLU 51 'fire8-expand1x1' Convolution 256 1x1x64 convolutions with stride [1 1] and padding [0 0 0 0] 52 'fire8-relu_expand1x1' ReLU ReLU 53 'fire8-expand3x3' Convolution 256 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 54 'fire8-relu_expand3x3' ReLU ReLU 55 'fire8-concat' Depth concatenation Depth concatenation of 2 inputs 56 'fire9-squeeze1x1' Convolution 64 1x1x512 convolutions with stride [1 1] and padding [0 0 0 0] 57 'fire9-relu_squeeze1x1' ReLU ReLU 58 'fire9-expand1x1' Convolution 256 1x1x64 convolutions with stride [1 1] and padding [0 0 0 0] 59 'fire9-relu_expand1x1' ReLU ReLU 60 'fire9-expand3x3' Convolution 256 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1] 61 'fire9-relu_expand3x3' ReLU ReLU 62 'fire9-concat' Depth concatenation Depth concatenation of 2 inputs 63 'drop9' Dropout 50% dropout 64 'conv10' Convolution 1000 1x1x512 convolutions with stride [1 1] and padding [0 0 0 0] 65 'relu_conv10' ReLU ReLU 66 'pool10' Global Average Pooling Global average pooling 67 'prob' Softmax softmax 68 'ClassificationLayer_predictions' Classification Output crossentropyex with 'tench' and 999 other classes

你看挤压网由68层组成。与所有DCNN一样,挤压网级联卷积算子,然后是非线性和池化,或平均化。SqueezeNet需要大小为227 x 227 x 3的图像输入,您可以通过下面的代码看到它。

snet.Layers (1)
ans=ImageInputLayer,属性为:Name:“data”InputSize:[227 227 227 3]超参数DataAugmentation:“none”规范化:“zerocenter”规范化维度:“auto”平均值:[1×1×3 single]

此外,squezenet被配置为识别1000个不同的类,您可以通过下面的代码看到这些类。

snet.Layers(68)
ANS = ClassificationOutputLayer与属性:名称: 'ClassificationLayer_predictions' 类:[1000×1分类] OutputSize:1000超参数LossFunction: 'crossentropyex'

在随后的部分,我们将修改SqueezeNet的选择图层,以便将它应用到我们的分类问题。

连续小波变换

SqueezeNet被设计用来区分图像中的差异并对结果进行分类。因此,为了利用SqueezeNet对雷达回波进行分类,必须将一维雷达回波时间序列转换成图像。一种常见的方法是使用时间-频率表示(TFR)。对于信号的时频表示有许多选择,哪一个是最合适的取决于信号的特性。为了确定哪个TFR可能适合这个问题,随机选择并绘制一些雷达返回从每个类。

rng默认;idxCylinder = randperm(50,2);idxCone = randperm(50,2)50;

很明显,前面所示的雷达回波的特征是变化变慢,并随前面所述的大的瞬态衰减而间断。小波变换最适合稀疏地表示这些信号。小波通过收缩来定位具有高时间分辨率的瞬态现象,并通过拉伸来捕获缓慢变化的信号结构。得到并绘制其中一个圆柱体的连续小波变换。

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

CWT同时捕捉慢变(低频)波动和瞬态现象。将气缸回油的CWT与锥形目标的CWT进行对比。

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

由于瞬变在确定是否从圆柱体或圆锥体靶目标返回始发表面的重要性,我们选择CWT作为理想的TFR使用。获得CWT为每个目标退货后,我们从每个雷达回波的CWT使图像。这些图像调整到与SqueezeNet的输入层兼容,我们利用SqueezeNet所得到的图像进行分类。

形象准备

辅助功能,帮助小波变换,获取每个雷达返回的CWT,将CWT重塑为与挤压网兼容,并将CWT作为jpeg文件写入。奔跑帮助小波变换, 选择一个父目录在这里你有写权限。本例使用坦普迪尔,但是你可以使用你的机器,你有写权限的任何文件夹。助手函数创建培训测试下集文件夹父目录以及创造圆柱锥体下两个子文件夹培训测试。这些文件夹填充被用作输入,以SqueezeNet JPEG图像。

parentDir=tempdir;helpergenwavelttfimg(parentDir、RCSReturns、RCSReturnsTest)
生成时频表示...请稍候创建缸时频表示...完成创建锥时频表示...完成创建缸时频表示...完成创建锥时频表示做...

现在使用imageDataStore管理文件夹中的文件访问以训练压缩网络。为训练和测试数据创建数据存储。

trainingData = imageDatastore(完整文件(parentDir,'培训'“IncludeSubfolders”,真的,...“LabelSource”'foldernames');TESTDATA = imageDatastore(完整文件(parentDir,'测试'“IncludeSubfolders”,真正,...“LabelSource”'foldernames');

为了使用SqueezeNet这种二元分类问题,我们需要修改几个层。首先,我们改变SqueezeNet最后可以学习层(64层),以具有相同数量的1×1的卷积作为我们新的一些类,2。

lgraphsqueze=layerGraph(snet);convLayer=lgraphsqueze.Layers(64);numClasses=numel(categories(trainingData.Labels));newLearnableLayer=confolution2dlayer(1,numClasses,...'名称'“binaryconv”...'WeightLearnRateFactor'10,...'BiasLearnRateFactor',10);lgraphsqueze=replaceLayer(lgraphsqueze,convLayer.Name,newLearnableLayer);classLayer=lgraphsqueze.Layers(end);newClassLayer=classificationLayer('名称''二进制');lgraphSqueeze = replaceLayer(lgraphSqueeze,classLayer.Name,newClassLayer);

最后,设置再培训SqueezeNet的选项。设置初始学习率1E-4,时代的最大数量设置为15,minibatch规模与气势10.使用随机梯度下降。

劳工关系= 1的军医;mxEpochs = 15;mbSize = 10;选择= trainingOptions ('SGDM''初始清除日期',伊尔,...'MaxEpochs',mx个时期,'小批量大小',MB大小,...“情节”“训练进度”'执行环境''中央处理器');

培训网络。如果你有一个兼容的GPU,列车网络自动利用GPU和培训在不到一分钟内应该完成。如果你没有一个兼容GPU,列车网络使用CPU,培训大约需要5分钟。训练时间确实因许多因素而异。在这种情况下,通过设置ExecutionEnvironment参数cpu

CWTnet = trainNetwork(trainingData,lgraphSqueeze,OPTS);
初始化输入数据规范化。
||损失率||========================================================================================|
| 1 | 1 | 00:00:00 | 60.00% | 2.6639 | 1.0000e-04 |
|5 |50 |00:00:42 |100.00%|0.0001 |1.0000e-04 |
|10 |100 |00:01:20 |100.00%|0.0002 |1.0000e-04 |
|15 | 150 | 00:01:58 | 100.00%| 2.2276e-05 | 1.0000e-04|
| ======================================================================================== |

使用训练的网络来预测保留检验设定的目标收益。

predictedLabels =分类(CWTnet,TESTDATA,'执行环境''中央处理器');精度=和(predictedLabels==testData.Labels)/50*100
精度=100

绘制出混淆图以及精确性和召回率。在这种情况下,100%的测试样本被正确分类。

数字(“单位”“规范化”“位置”[0.2 0.2 0.5 0.5]);ccDCNN = confusionchart(testData.Labels,predictedLabels);ccDCNN.Title ='混乱图表';ccDCNN。ColumnSummary =“列归一化”;ccDCNN.RowSummary =“row-normalized”;

LSTM

在这个例子中的最后部分,工作流LSTM描述。首先LSTM层被定义:

LSTMlayers = [...sequenceInputLayer(1)bilstmLayer(100,'输出模式''持续')fullyConnectedLayer(2)softmaxLayer classificationLayer];选项= trainingOptions(“亚当”...'MaxEpochs'30岁的...'小批量大小',150,...'初始清除日期',0.01%,...'GradientThreshold',1,...“阴谋”“训练进度”...“放牧”假的,'执行环境''中央处理器');trainLabels = repelem(分类({'圆筒'“锥”}),[50 50]);trainLabels = trainLabels(:);trainData = num2cell(table2array(RCSReturns)”,2);TESTDATA = num2cell(table2array(RCSReturnsTest)”,2);testLabels = repelem(分类({'圆筒'“锥”}),[25]25);testLabels = testLabels (:);RNNnet = trainNetwork (trainData trainLabels、LSTMlayers选项);

该系统的精度也绘制。

predictedLabels =分类(RNNnet,TESTDATA,'执行环境''中央处理器');精度=总和(predictedLabels == testLabels)/ 50 * 100
精度=100

结论

这个例子展示了一个使用机器和深度学习技术进行雷达目标分类的工作流程。虽然这个例子使用了合成数据来进行训练和测试,但是它可以很容易地扩展以适应真实的雷达返回。由于信号的特性,小波技术被用于机器学习和CNN方法。

使用这个数据集,我们还可以通过将原始数据输入LSTM来获得类似的精度。在更复杂的数据集中,原始数据可能有太多的固有变量,以至于模型无法从原始数据中学习健壮的特性,您可能不得不在使用LSTM之前进行特征提取。