这个例子展示了如何用机器和深度学习方法对雷达返回进行分类。机器学习方法使用小波散射特征提取和支持向量机。万博1manbetx此外,本文还介绍了两种深度学习方法:使用SqueezeNet的迁移学习和长短期记忆(LSTM)递归神经网络。注意,本示例中使用的数据集不需要高级技术,但描述了工作流,因为这些技术可以扩展到更复杂的问题。
目标分类是现代雷达系统中的一个重要功能。此示例使用机器和深度学习来分类来自圆筒和锥体的雷达回波。虽然此示例使用合成的I / Q示例,但工作流程适用于真正的雷达返回。
下一节显示如何创建综合数据以培训学习算法。
下面的代码模拟半径为1米,高度为10米的圆柱体的RCS模式。雷达的工作频率是850兆赫兹。
c = 3 e8;fc = 850 e6;[cylrcs, az, el] = rcscylinder (1,1 10 c, fc);helperTargetRCSPatternPlot (az, el, cylrcs);
然后可以将图案应用于反向散射雷达目标以模拟来自不同方面角度的返回。
cyltgt =分阶段。BackscatterRadarTarget (“PropagationSpeed”,C,...'运行频率'足球俱乐部,“AzimuthAngles”阿兹,“ElevationAngles”埃尔,“RCSPattern”, cylrcs);
下面的图表显示了如何模拟随时间的100次圆柱返回。假设圆柱体在进行运动时,在瞄准镜周围引起微小振动,因此,从一个样品到下一个样品的角度发生变化。
rng.默认的;n = 100;AZ = 2 * RANDN(1,N);el = 2 * randn(1,n);Cylrtn = Cyltgt(1,N),[AZ; EL]);绘图(Mag2db(ABS(CylRTN)));包含('时间指数')ylabel(“目标回报(dB)”);标题('圆柱的目标返回');
同样可以产生圆锥的返回。为了创建训练集,对任意选择的5个圆柱体半径重复上述过程。此外,对于每个半径,通过改变入射角,跟随10条随机生成的正弦波曲线,模拟10条运动轨迹。每个运动轮廓中有701个样本,所以有701 × 50个样本。对圆柱体目标重复这一过程,得到一个701 × 100矩阵的训练数据,包含50个圆柱体和50个锥体轮廓。在测试集中,我们使用25个圆柱体和25个锥体轮廓来创建701 × 50的训练集。由于计算时间长,将训练数据预先计算并加载如下。
加载(“RCSClassificationReturnsTraining”);加载('rcsclassificationreturnstest');
作为示例,下一个图表显示了来自每个形状的一个运动轮廓的返回。该图显示了如何随时间改变的入射方位角和目标返回。
subplot(2,2,1) plot(cylinderAspectAngle(1,:)) ylim([-90 90]) grid在标题(“柱面角度与时间”);包含('时间指数');ylabel (的视线角(度));子图(2,2,3)绘图(RCSRETURNS.cylinder_1);ylim (50 [-50]);网格在标题('气缸返回');包含('时间指数');ylabel (“目标回报(dB)”);次要情节(2 2 2)情节(coneAspectAngle (1:));ylim(90年[-90]);网格在;标题(“圆锥角度与时间”);包含('时间指数');ylabel (的视线角(度));次要情节(2、2、4);情节(RCSReturns.Cone_1);ylim (50 [-50]);网格在;标题(“锥返回”);包含('时间指数');ylabel (“目标回报(dB)”);
在小波散射特征提取器中,数据通过一系列小波变换、非线性和平均来产生时间序列的低方差表示。小波时间散射产生的信号表示对输入信号的移位不敏感,而不牺牲类的可辨别性。
在小波时间散射网络中需要指定的关键参数是时不变的尺度、小波变换的次数以及每个小波滤波器组中每倍频程的小波数。在许多应用中,两个滤波器组的级联就足以实现良好的性能。在这个例子中,我们构造了一个带有两个滤波器组的小波时间散射网络:第一个滤波器组每八度有4个小波,第二个滤波器组每八度有2个小波。不变性尺度设置为701个样本,即数据的长度。
Sn =小波示踪剂('signallength', 701,“InvarianceScale”, 701,“QualityFactors”(4 - 2));
然后,我们得到训练集和测试集的散射变换。
应变= sn.featureMatrix (RCSReturns {:,:},“转换”,“日志”);圣= sn.featureMatrix (RCSReturnsTest {:,:},“转换”,“日志”);
对于这个例子,使用沿每条路径的散射系数的平均值。
TrainFeatures =挤压(平均(压力,2))的;TestFeatures =挤压(平均(圣,2))的;
为培训和学习创建标签
TrainLabels = repelem(分类({“气缸”,“锥”}),[50 50])”;TestLabels = repelem(分类({“气缸”,“锥”}),[25] 25日)';
适合带有二次万博1manbetx内核的支持向量机模型,散射特征,并获得交叉验证精度。
template = templatesvm('骨箱','多项式',...“PolynomialOrder”2,...“KernelScale”,“汽车”,...“BoxConstraint”, 1...“标准化”, 真的);Classificationsvm = fitcecoc(...TrainFeatures,...TrainLabels,...“学习者”, 模板,...'编码','OneVsone',...“类名”分类({“气缸”,“锥”}));partitionedModel = crossval (classificationSVM,“KFold”5);[validationPredictions, validationScores] = kfoldPredict(partitionedModel);validationAccuracy = (1 - kfoldLoss(partitionedModel,“LossFun”,“ClassifError”)) * 100
validationAccuracy = 100
使用训练过的支持向量机,对测试集得到的散射特征进行分类。
predLabels =预测(classificationSVM TestFeatures);精度= sum(predLabels == TestLabels) /numel(TestLabels)*100
精度= 100
绘制混淆矩阵。
图(“单位”,“归一化”,“位置”,[0.2 0.2 0.5 0.5]);ccDCNN = confusionchart (TestLabels predLabels);ccdcnn.title =“混乱图”;ccDCNN。ColumnSummary =“column-normalized”;ccdcnn.rowsummary =“row-normalized”;
对于更复杂的数据集,深度学习工作流可能会提高性能。
Squeezenet是一个深度卷积神经网络(CNN),用于在ImageNet大规模视觉识别挑战(ILSVRC)中使用的1,000类中的图像。在此示例中,我们重复使用预先训练的挤压Zenet来对属于两个类之一的雷达返回进行分类。
负载挤压胶。
snet = squeezenet;
SqueezeNet由68层组成。像所有的dcnn一样,SqueezeNet将卷积算子级联,然后是非线性和池化或平均。SqueezeNet需要一个尺寸为227 × 227 × 3的图像输入,您可以通过下面的代码看到。
snet.Layers (1)
ans = ImageInputLayer with properties: Name: 'data' InputSize: [227 227 3] Hyperparameters DataAugmentation: 'none' NormalizationDimension: 'auto' Mean: [1×1×3 single]
此外,将SqueezeNet配置为识别1000个不同的类,您可以通过下面的代码看到。
sneter.Layers(68)
ans = ClassificationOutputLayer with properties: Name: 'ClassificationLayer_predictions' Classes: [1000×1 categorical] ClassWeights: 'none' OutputSize: 1000 Hyperparameters LossFunction: 'crossentropyex'
在接下来的部分中,我们将修改SqueezeNet的选择层,以便将其应用到我们的分类问题中。
Screezenet旨在区分图像的差异并对结果进行分类。因此,为了使用挤压仪来分类雷达返回,我们必须将1-D雷达返回时间序列转换为图像。这样做的常见方法是使用时频表示(TFR)。信号的时频表示存在许多选择,并且哪一个最合适地取决于信号特性。为了确定哪个TFR可能适合此问题,随机选择和绘制来自每个类的几个雷达返回。
rng.默认的;Idxcylinder = randperm(50,2);Idxcone = Randperm(50,2)+50;
显然,先前所示的雷达返回的特征在于,通过如前所述的大瞬态减小的变化变化减慢变化。小波变换非常适合于稀疏地表示这些信号。小波缩小以使瞬态现象定位,具有高时间分辨率和拉伸以捕获缓慢变化的信号结构。获得并绘制其中一个气缸返回的连续小波变换。
类(RCSReturns {: idxCylinder (1)},'voicesperoctave', 8)
CWT同时捕捉慢变化(低频)波动和瞬态现象。对比圆柱返回的CWT与圆锥目标返回的CWT。
类(RCSReturns {: idxCone (2)},'voicesperoctave'8);
由于瞬态在确定目标返回是否来自圆柱体或锥体目标时具有明显的重要性,我们选择CWT作为理想的TFR。在获得每个目标回波的CWT后,我们将每个雷达回波的CWT进行成像。这些图像被调整大小以与SqueezeNet的输入层兼容,我们利用SqueezeNet对结果图像进行分类。
辅助功能,helpergenWaveletTFImg
,获取每个雷达返回的CWT,重新设计CWT以与SqueezeNet兼容,并将CWT写入jpeg文件。运行helpergenWaveletTFImg
,选择一个parentDir
你有写的权限。这个示例使用tempdir
,但您可以在您拥有写入权限的计算机上使用任何文件夹。辅助功能创建培训
和测试
设置文件夹parentDir
以及创造油缸
和锥
两者下的子文件夹培训
和测试
.这些文件夹中填充了jpeg图像,用作SqueezeNet的输入。
parentDir = tempdir;helpergenWaveletTFImg (parentDir RCSReturns RCSReturnsTest)
生成时频表示……创建圆柱体时频表示…创建圆锥时间频率表示完成…创建圆柱体时频表示完成…创建圆锥时间频率表示完成…完成
现在使用ImageageAtastore.
管理文件夹中的文件访问,以培训SqueezeNet。为培训和测试数据创建数据存储。
trainingData = imageDatastore (fullfile (parentDir“培训”),'upplyubfolders',真的,...'labelsource',“foldernames”);testData = imageDatastore (fullfile (parentDir“测试”),'upplyubfolders',真的,...'labelsource',“foldernames”);
为了使用SqueezeNet解决这个二进制分类问题,我们需要修改几个层。首先,我们改变了SqueezeNet中最后一个可学习层(层64),使其具有与我们的新类数量2相同的1乘1卷积数量。
lgraphSqueeze = layerGraph (snet);convLayer = lgraphSqueeze.Layers (64);numClasses =元素个数(类别(trainingData.Labels));numClasses newLearnableLayer = convolution2dLayer (1,...“名字”,“binaryconv”,...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraphSqueeze = replaceLayer (lgraphSqueeze convLayer.Name newLearnableLayer);classLayer = lgraphSqueeze.Layers(结束);newClassLayer = classificationLayer (“名字”,“二元”);lgraphSqueeze = replaceLayer (lgraphSqueeze classLayer.Name newClassLayer);
最后,设置对SqueezeNet进行再培训的选项。设置初始学习率为1e-4,最大周期数为15,minibatch大小为10。使用带动量的随机梯度下降。
ilr = 1e-4;mxepochs = 15;mbsize = 10;opts = trainingOptions(“个”,“InitialLearnRate”劳工关系,...'maxepochs'mxEpochs,“MiniBatchSize”mbSize,...“阴谋”,“训练进步”,“ExecutionEnvironment”,“cpu”);
培训网络。如果你有一个兼容的GPU,trainNetwork
自动使用GPU和训练应该在1分钟内完成。如果你没有兼容的GPU,trainNetwork
使用CPU和训练应该花费大约5分钟。训练时间会因一些因素而有所不同。在这种情况下,训练在cpu上进行,通过设置ExecutionEnvironment
参数中央处理器
.
CWTnet = trainNetwork (trainingData lgraphSqueeze,选择);
初始化输入数据规范化。
|========================================================================================||时代|迭代|经过时间的时间迷你批量|迷你批量|基础学习||| | (hh:mm:ss) | Accuracy | Loss | Rate | |========================================================================================|
| 1 | 1 | 00: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 =分类(CWTnet testData,“ExecutionEnvironment”,“cpu”);精度= sum(predictedLabels == testData.Labels)/50*100
精度= 100
绘制混淆图,以及精确度和回忆度。在这种情况下,100%的测试样本分类正确。
图(“单位”,“归一化”,“位置”,[0.2 0.2 0.5 0.5]);ccdcnn = confusionchart(testdata.labels,predightlabels);ccdcnn.title =“混乱图”;ccDCNN。ColumnSummary =“column-normalized”;ccdcnn.rowsummary =“row-normalized”;
在本例的最后一节中,将描述一个LSTM工作流。首先定义LSTM层:
LSTMlayers = [...sequenceInputlayer(1)BilstMlayer(100,“OutputMode”,“最后一次”)全连接列(2)SoftMaxLayer分类层];选项=培训选项(“亚当”,...'maxepochs',30,...“MiniBatchSize”, 150,...“InitialLearnRate”, 0.01,...'gradientthreshold', 1...'plots',“训练进步”,...“详细”,错误的,“ExecutionEnvironment”,“cpu”);trainLabels = repelem(分类({“气缸”,'锥体'}),[50 50]);trainlabels = trainlabels(:);traindata = num2cell(表2Array(RCSReturns)',2);testdata = num2cell(表2Array(rcsreturnstest)',2);testlabels = Repelem(分类({“气缸”,'锥体'}),[25 25]);testlabels = testlabels(:);RNNNET = Trainnetwork(TrainData,TrainLabels,Lstmlayers,选项);
并给出了该系统的精度。
predictedLabels =分类(RNNnet testData,“ExecutionEnvironment”,“cpu”);精度= sum(predictedLabels == testLabels)/50*100
精度= 100
这个例子展示了一个使用机器和深度学习技术进行雷达目标分类的工作流程。虽然本示例使用合成数据进行训练和测试,但它可以很容易地扩展以适应真实的雷达返回。由于信号的特点,小波技术被用于机器学习和CNN方法。
使用此数据集,我们也获得了通过仅将原始数据送入LSTM来实现类似的准确性。在更复杂的数据集中,原始数据对于模型可能太可变,以便从原始数据学习鲁棒特征,并且您可能必须在使用LSTM之前诉诸特征提取。