主要内容

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

此示例显示如何使用机器和深度学习方法对雷达返回进行分类。机器学习方法使用小波散射特征提取与支撑矢量机器耦合。万博1manbetx另外,说明了两个深度学习方法:使用挤压仪和长短期记忆(LSTM)复发神经网络进行转移学习。请注意,此示例中使用的数据集不需要高级技术,但是描述了工作流程,因为可以扩展到更复杂的问题。

介绍

目标分类是现代雷达系统的一项重要功能。本例使用机器和深度学习对圆柱体和圆锥体的雷达回波进行分类。虽然本示例使用了合成的I/Q样本,但该工作流适用于真实的雷达返回。

RCS合成

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

下面的代码模拟半径为1米,高度为10米的圆柱体的RCS模式。雷达的工作频率是850兆赫兹。

C = 3E8;FC = 850E6;[Cyrrcs,AZ,EL] = RCScylmerd(1,1,10,C,Fc);Helpertargetrcspatternplot(AZ,EL,Cylrcs);

该模式可以应用于后向散射雷达目标,以模拟从不同方面的角度返回。

cyctgt = phased.backscatterradartarget(“PropagationSpeed”c...“OperatingFrequency”,fc,“AzimuthAngles”阿兹,'升级',el,“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”);

作为一个例子,下一个图显示了从每个形状的一个运动配置文件的返回。图中显示了入射方位角和目标返回值随时间的变化情况。

subplot(2,2,1) plot(cylinderAspectAngle(1,:)) ylim([-90 90]) grid标题('圆柱形角度与时间');Xlabel(“时间指数”);ylabel (的视线角(度));次要情节(2,2,3)情节(RCSReturns.Cylinder_1);ylim (50 [-50]);网格标题(“缸返回”);Xlabel(“时间指数”);ylabel ('目标返回(DB)');子图(2,2,2)绘图(ConeaseCtangle(1,:));ylim([ -  90 90]);网格;标题('锥形角度与时间');Xlabel(“时间指数”);ylabel (的视线角(度));子图(2,2,4);绘图(rcsreturns.cone_1);ylim (50 [-50]);网格;标题(“锥返回”);Xlabel(“时间指数”);ylabel ('目标返回(DB)');

小波散射

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

在小波时间散射网络中指定的关键参数是时间不变的比例,小波变换的数量,以及每个小波滤波器组中的每个八度音程的数量。在许多应用中,两个过滤器组的级联足以实现良好的性能。在该示例中,我们构建一个小波时间散射网络,其中两个滤波器组:在第二滤波器组中的第一个滤波器组中的每个倍频度的4个小波,在第二滤波器组中每个八度音程。不变性刻度设置为701个样本,数据的长度。

sn = waveletScattering (“SignalLength”, 701,“InvarianceScale”, 701,'质量性司机',[4 2]);

然后,我们得到训练集和测试集的散射变换。

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

对于此示例,使用沿着每个路径截取的散射系数的平均值。

训练训练=挤压(平均值(菌株,2))';testfeatures =挤压(平均(截至2))';

为培训和学习创建标签

TrainLabels = repelem(分类({'圆筒'“锥”}),[50 50])';testlabels = Repelem(分类({'圆筒'“锥”}),[25 25])';

模型训练

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

模板= templateSVM (“KernelFunction”多项式的...“PolynomialOrder”2,...“KernelScale”'汽车'...“BoxConstraint”, 1...'标准化',真正的);classificationSVM = fitcecoc (...训练疗法,...TrainLabels,...'学习者'模板,...“编码”“onevsone”...'classnames'分类({'圆筒'“锥”}));partitionedmodel = crossval(分类vm,“KFold”5);[验证预期,验证算法] = kfoldpredict(partitionedmodel);ValidationAccuracy =(1  -  Kfoldloss(PartitionedModel,“LossFun”“ClassifError”)) * 100
validationAccuracy = 100

目标分类

使用训练过的支持向量机,对测试集得到的散射特征进行分类。

predlabels = predict(分类,testfeatures);准确性= SUM(predlabels == testlabels)/ numel(testlabels)* 100
精度= 100.

绘制混淆矩阵。

数字('单位''标准化''位置',[0.2 0.2 0.5 0.5]);ccdcnn = confusionchart(testlabels,predlabels);ccdcnn.title =“混乱图”;ccdcnn.columnsummary ='列 - 归一化';ccDCNN。RowSummary ='行标准化'

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

CNN的迁移学习

SqueezeNet是一种深度卷积神经网络(CNN),用于ImageNet大规模视觉识别挑战(ILSVRC)中训练的1000类图像。在本例中,我们重用了预先训练过的SqueezeNet,将雷达返回归为以下两类之一。

负载SqueezeNet。

snet =挤压;

Screezenet由68层组成。与所有DCNN一样,Screezenet级联卷积运营商,然后是非线性和汇集,或平均。Squeezenet预计大小227-by-227-3的图像输入,您可以使用以下代码查看。

Sneter.Layers(1)
ans =具有属性的ImageInputLayer:名称:'Data'输入:[227 227 3] HyperParameters DataAugmentation:'无'归一化:'Zerocenter'标准化Dimension:'Auto'均值:[1×1×3单身]

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

snet.Layers (68)
ANS =具有属性的分类OutputLayer:名称:'classificationLayer_predictions'类:[1000×1分类]类别重量:'无'输出尺寸:1000封立的upperameters lockfunction:'crossentropyex'

在接下来的部分中,我们将修改SqueezeNet的选择层,以便将其应用到我们的分类问题中。

连续小波变换

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

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

很明显,前面显示的雷达回波的特征是变慢的变化,被前面描述的大的瞬态下降打断。小波变换非常适合于稀疏地表示这些信号。小波收缩,以局部瞬态现象与高时间分辨率和拉伸,以捕获缓慢变化的信号结构。获得并绘制其中一个圆柱体的连续小波变换。

CWT(RCSRETURNS {:,IDXcylinder(1)},“VoicesPerOctave”8)

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

类(RCSReturns {: idxCone (2)},“VoicesPerOctave”,8);

由于瞬态在确定目标返回是否来自圆柱体或锥体目标时具有明显的重要性,我们选择CWT作为理想的TFR。在获得每个目标回波的CWT后,我们将每个雷达回波的CWT进行成像。这些图像被调整大小以与SqueezeNet的输入层兼容,我们利用SqueezeNet对结果图像进行分类。

图像准备

辅助功能,helpergenWaveletTFImg,获取每个雷达返回的CWT,将CWT重新装回与Screezenet兼容的CWT,并将CWT作为JPEG文件写入。跑步helpergenWaveletTFImg, 选择一个parentdir.你有写入权限的地方。这个例子用途tempdir,但您可以使用计算机上您拥有写权限的任何文件夹。helper函数创建培训测试设置文件夹下parentdir.以及创造圆筒子文件夹下都培训测试。这些文件夹用JPEG图像填充为挤压Zenet的输入。

parentDir = tempdir;helpergenWaveletTFImg (parentDir RCSReturns RCSReturnsTest)
生成时间频率表示......请等待创建气缸时间频率表示...完成锥形时间频率表示......完成圆柱时间频率表示...完成创建锥形时间频率表示......完成

现在使用imageDataStore管理文件夹中的文件访问,以培训SqueezeNet。为培训和测试数据创建数据存储。

trainingData = imageDatastore (fullfile (parentDir“培训”),“IncludeSubfolders”, 真的,...“LabelSource”“foldernames”);testdata = imagedataStore(fullfile(parentdir,“测试”),“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

为了使用SqueezeNet解决这个二进制分类问题,我们需要修改几个层。首先,我们改变了SqueezeNet中最后一个可学习层(层64),使其具有与我们的新类数量2相同的1乘1卷积数量。

Lgraphsqueeze = LayerGraph(SNET);convlayer = lgraphsqueeze.layers(64);numclasses = numel(类别(trainingdata.labels));newlearnablelayer =卷积2dlayer(1,numcrasses,...'名称''binaryconv'...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);lgraphSqueeze = replaceLayer (lgraphSqueeze convLayer.Name newLearnableLayer);classLayer = lgraphSqueeze.Layers(结束);newClassLayer = classificationLayer ('名称'“二元”);lgraphsqueeze = replaceElayer(Lgraphsqueze,ClassLayer.Name,NewClassLayer);

最后,设置对SqueezeNet进行再培训的选项。设置初始学习率为1e-4,最大周期数为15,minibatch大小为10。使用带动量的随机梯度下降。

劳工关系= 1的军医;mxEpochs = 15;mbSize = 10;选择= trainingOptions (“个”'italllearnrate',ilr,...“MaxEpochs”,mxepochs,“MiniBatchSize”mbSize,...'plots'“训练进步”'executionenvironment'“cpu”);

训练网络。如果您有兼容的GPU,Trainnetwork.自动使用GPU和培训应在不到一分钟内完成。如果您没有兼容GPU,Trainnetwork.使用CPU和训练应该花费大约5分钟。训练时间会因一些因素而有所不同。在这种情况下,训练在cpu上进行,通过设置execultenvironment.参数cpu

CWTNET = Trainnetwork(TrainingData,Lgraphsqueze,OPTS);
初始化输入数据归一化。
| ========================================================================================|时代|迭代|经过时间的时间迷你批量|迷你批量|基础学习||| | (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(预测标签== 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 ='行标准化'

LSTM

在本例的最后一节中,将描述一个LSTM工作流。首先定义LSTM层:

lstmlayers = [...sequenceInputLayer (1) bilstmLayer (100“OutputMode”'最后的') fulllyconnectedlayer (2) softmaxLayer classificationLayer];选择= trainingOptions (“亚当”...“MaxEpochs”30岁的...“MiniBatchSize”, 150,...'italllearnrate', 0.01,...“GradientThreshold”, 1...“阴谋”“训练进步”...“详细”假的,'executionenvironment'“cpu”);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选项);

还绘制了该系统的准确性。

predigedlabels = classify(rnnnet,testdata,'executionenvironment'“cpu”);精度= sum(predictedLabels == testLabels)/50*100
精度= 100.

结论

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

使用这个数据集,我们也获得了类似的精度,只需将原始数据输入LSTM。在更复杂的数据集中,原始数据可能在本质上太不稳定,以至于模型无法从原始数据中学习到可靠的特征,因此在使用LSTM之前,您可能不得不求助于特征提取。