主要内容

在SAR图像自动目标识别(ATR)

这个例子展示了如何训练提出卷积神经网络(R-CNN)目标识别大型场景合成孔径雷达(SAR)图像中使用深度学习工具箱™和并行计算工具箱™。

深度学习工具箱提供了一个框架的设计和实现深神经网络算法,pretrained模型和应用。

并行计算工具箱可以解决计算和数据密集型问题使用多核处理器gpu和计算机集群。它使您能够使用gpu直接从MATLAB®和加速深层学习算法所需的计算能力。

基于神经网络的算法都取得了巨大成就在不同地区从自然场景检测医学成像。他们表现出巨大的进步在标准检测算法。受这些进步,研究人员将努力深度学习的基础解决方案适用于SAR成像领域。金宝搏官方网站在这个例子中,解决方案已经应用于解决问题的目标检测和识别。R-CNN网络使用这里不仅解决了集成检测和识别问题,还提供了一个有效和高效的性能解决方案,尺度大场景的SAR图像。

这个案例展示了如何:

  • 下载数据集和pretrained模型

  • 加载和分析图像数据

  • 定义网络体系结构

  • 指定培训选项

  • 培训网络

  • 评估网络

为了说明这个工作流,示例使用移动和静止目标获取与识别(MSTAR)杂波数据集出版的美国空军研究实验室。数据集是可供下载在这里。另外,这个例子还包括数据的一个子集用于展示工作流。我们的目标是开发一个模型,可以检测和识别目标。

下载数据集

这个示例使用MSTAR杂乱的数据集的一个子集,包含300培训和测试杂乱与五种不同的目标图像。收集到的数据是使用一个x波段传感器在聚光灯下用英尺分辨率模式。数据包含农村和城市类型的杂波。类型的目标使用BTR-60(装甲汽车),BRDM-2(战斗车),ZSU-23/4(坦克),T62(坦克),和SLICY(多个简单的几何形状的静态目标)。捕获的图像在一个萧条15度角。PNG图像中的杂波数据存储格式和数据存储在相应的地面真理groundTruthMSTARClutterDataset.mat文件。该文件包含五类,二维边界框信息SLICY, BTR-60, BRDM-2 ZSU-23/4, T62训练和测试数据。数据集的大小是1.6 GB。

下载数据集使用helperDownloadMSTARClutterDatahelper函数,定义在这个例子。

outputFolder = pwd;dataURL = (“https://ssd.mathworks.com/金宝appsupportfiles/radar/data/MSTAR_ClutterDataset.tar.gz”);helperDownloadMSTARClutterData (outputFolder dataURL);

根据您的网络连接,下载过程可能需要一些时间。MATLAB®代码中止执行,直到下载过程完成。另外,数据下载到本地磁盘使用您的web浏览器并提取文件。当使用这种方法,改变< outputFolder >变量示例中下载的文件的位置。

下载Pretrained网络

从链接下载pretrained网络使用helperDownloadPretrainedSARDetectorNethelper函数,定义在这个例子。pretrained模型允许您运行整个示例,而不必等待培训完成。训练网络,设置doTrain变量来真正的

pretrainedNetURL = (“https://ssd.mathworks.com/金宝appsupportfiles/radar/data/TrainedSARDetectorNet.tar.gz”);doTrain =;如果~ doTrain helperDownloadPretrainedSARDetectorNet (outputFolder pretrainedNetURL);结束

加载数据集

加载地面实况数据(训练集和测试集)。这些图像以这样一种方式,它生成目标芯片的地方背景杂波图像随机位置。杂乱的图像是由下载的原始数据。生成的目标将被用作地面真理目标训练和测试网络。

负载(“groundTruthMSTARClutterDataset.mat”,“trainingData”,“testData”);

地面实况数据存储在一个表中,第一列包含图像文件的路径和第二到第六列包含不同的目标边界框。

%显示数据集的前几行trainingData (1:4,:)
ans =4×6表imageFilename SLICY BTR_60 BRDM_2 ZSU_23_4 T62 ______________________________ _____________ _____________ _____________ ___________________ ___________________。”/ TrainingImages / Img0001。png”{[285 468 28 28]} {[135 331 65 65]} {[597 739 65 65]} {【810 1107 80 80】} {[1228 1089 87 87]}”。/ TrainingImages / Img0002。png”{[595 1585 28 28]} {[880 162 65 65]} {[308 1683 65 65]} {【1275 1098 80 80】} {[1274 1099 87 87]}”。/ TrainingImages / Img0003。png”{[200 1140 28 28]} {[961 1055 65 65]} {[306 1256 65 65]} {【661 1412 80 80】} {[699 886 87 87]}”。/ TrainingImages / Img0004。png”{[623 186 28 28]} {[536 946 65 65]} {[131 245 65 65]} {【1030 1266 80 80】} {[151 924 87 87]}

显示的一个训练图像和盒子标签将数据可视化。

img = imread (trainingData.imageFilename (1));bbox =重塑(cell2mat (trainingData {1, 2:}), [4,5]) ';标签= {“SLICY”,“BTR_60”,“BRDM_2”,“ZSU_23_4”,“T62”};annotatedImage = insertObjectAnnotation (img,“矩形”bbox,标签,“TextBoxOpacity”,0.9,“字形大小”,50);图imshow (annotatedImage);标题(训练样本图像边界框和标签的)

定义网络体系结构

为五个目标:创建一个R-CNN对象探测器SLICY, BTR_60, BRDM_2, ZSU_23_4 T62。

对象类= {“SLICY”,“BTR_60”,“BRDM_2”,“ZSU_23_4”,“T62”};

网络必须能够分类五个目标和背景类以被训练使用trainRCNNObjectDetector在深度学习工具箱™函数可用。1添加下面的代码,包括背景类。

numClassesPlusBackground =元素个数(对象类)+ 1;

最后完全连接网络层定义了类的数量,它可以进行分类。组最后一个完全连接层大小等于输出numClassesPlusBackground

%定义输入大小inputSize =[1] 128128年;%定义网络层= createNetwork (inputSize numClassesPlusBackground);

现在,这些网络层可以用来训练基于R-CNN five-class对象探测器。

火车快R-CNN

使用trainingOptions(深度学习工具箱)指定网络培训选项。trainingOptions在默认情况下使用GPU如果一个是可用的(需要并行计算工具箱™和CUDA®启用GPU计算能力3.0或更高版本)。否则,它使用一个CPU。您还可以指定使用的执行环境ExecutionEnvironment名称-值参数trainingOptions。自动检测如果你有空GPU,集ExecutionEnvironment汽车。如果你没有一个GPU,或不希望使用一个用于培训,集ExecutionEnvironmentcpu。为了确保培训使用GPU,集ExecutionEnvironmentgpu

%设置培训选项选择= trainingOptions (“个”,“MiniBatchSize”,128,“InitialLearnRate”1 e - 3,“LearnRateSchedule”,“分段”,“LearnRateDropFactor”,0.1,“LearnRateDropPeriod”,100,“MaxEpochs”10“详细”,真的,“CheckpointPath”tempdir,“ExecutionEnvironment”,“汽车”);

使用trainRCNNObjectDetector训练R-CNN对象探测器doTrain是真的。否则,加载pretrained网络。如果训练,调整NegativeOverlapRangePositiveOverlapRange为了保证训练样本与地面紧密重叠的真理。

如果doTrain%火车R-CNN对象探测器。这将需要几分钟时间探测器= trainRCNNObjectDetector (trainingData层,选择,“PositiveOverlapRange”(0.5 - 1),“NegativeOverlapRange”[0.1 - 0.5]);其他的%之前加载一个训练有素的探测器preTrainedMATFile = fullfile (outputFolder,“TrainedSARDetectorNet.mat”);负载(preTrainedMATFile);结束

评估测试图像探测器

得到定性的探测器的功能,从测试中选择一个随机图像通过检测器设置并运行它。探测器预计将返回一组边界框认为检测到目标,随着分数表明信心在每个检测。

%阅读测试图像imgIdx =兰迪(高度(testData));testImage = imread (testData.imageFilename (imgIdx));%检测SAR目标在测试图像[bboxes,分数,标签]=检测(testImage探测器,“MiniBatchSize”16);

了解成果,叠加结果与测试图像。一个关键的参数是检测阈值,得分高于探测器探测到的目标。更高的阈值将导致更少的假阳性;然而,它也更假阴性结果。

scoreThreshold =0.8;%显示检测结果outputImage = testImage;idx = 1:长度(分数)bbox = bboxes (idx:);thisScore =分数(idx);如果thisScore > scoreThreshold注释= sprintf (' % s:(信心= % 0.2 f) '、标签(idx),轮(thisScore, 2));outputImage = insertObjectAnnotation (outputImage,“矩形”bbox,注释,“TextBoxOpacity”,0.9,“字形大小”45岁的“线宽”2);结束结束f =图;f.Position (3:4) = [860740];imshow (outputImage)标题(“测试图像预测盒和标签”)

评估模型

通过查看图片顺序,你可以理解检测器的性能。执行更严格的分析使用整个测试集,通过探测器运行测试集。

%创建一个表来保存边界框,分数和标签由探测器输出numImages =身高(testData);结果=表(“大小”numImages [3],“VariableTypes”,{“细胞”,“细胞”,“细胞”},“VariableNames”,{“盒子”,“分数”,“标签”});%每个图像上运行探测器的测试集和收集结果i = 1: numImages imgFilename = testData.imageFilename {};%读取图像I = imread (imgFilename);%运行探测器(bboxes、分数、标签)=检测(探测器,我,“MiniBatchSize”16);%收集结果结果。盒子我{}= bboxes;结果。分数{我}=分数;结果。标签{我}=标签;结束

可能的检测及其边界框中所有图像测试集可以用来计算探测器的平均精度为每个类。(美联社)美联社平均探测器的精度在不同级别的回忆,让我们定义精度和召回。

  • P r e c 年代 o n = t p t p + f p

  • R e c 一个 l l = t p t p + f n

在哪里

  • t p ——真正的阳性数(探测器预计目标时存在)

  • f p 假阳性的数量(探测器预计目标时不存在)

  • f n ——数量的假阴性(探测器未能探测到目标时存在)

探测器的精度1被认为是擅长发现目标存在,而一个检测器召回1善于避免错误的检测。精度和召回成反比关系。

情节精度和召回为每个类之间的关系。每个曲线的平均值是美联社。情节曲线检测阈值的值为0.5。

更多细节,请参阅evaluateDetectionPrecision(计算机视觉工具箱)

%从测试数据中提取预期边界框的位置expectedResults = testData(:, 2:结束);阈值= 0.5;%评估对象探测器使用平均精度指标[据美联社、召回、精密]= evaluateDetectionPrecision(结果,expectedResults,阈值);%情节精密召回曲线f =图;甘氨胆酸ax =;f.Position (3:4) = [860740];包含(“回忆”)ylabel (“精度”网格);持有;传奇(“位置”,“东南”);标题(0.5阈值的精度和召回曲线为不同类型的);i = 1:长度(美联社)%情节精度/召回曲线情节(ax,回忆{我},精密{我},“DisplayName的”,(的平均精度为类的trainingData.Properties.VariableNames {i + 1}“是”num2str(圆(美联社(我),3))))结束

美联社的类是超过0.9。这些,训练模型似乎斗争SLICY最在探测目标。然而,它仍能达到0.7类的AP。

Helper函数

这个函数createNetwork需要作为输入图像的大小inputSize和数量的类numClassesPlusBackground。函数返回一个CNN。

函数层= createNetwork (inputSize numClassesPlusBackground)层= [imageInputLayer (inputSize)%的输入层32岁的convolution2dLayer (3“填充”,“相同”)%卷积层reluLayer% Relu层32岁的convolution2dLayer (3“填充”,“相同”)batchNormalizationLayer%批归一化层reluLayer maxPooling2dLayer (2“步”,2)%马克斯池层convolution2dLayer (64,“填充”,“相同”)reluLayer convolution2dLayer (64,“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (2“步”2)convolution2dLayer(3128年,“填充”,“相同”)reluLayer convolution2dLayer (3128“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (2“步”2)convolution2dLayer(3256年,“填充”,“相同”)reluLayer convolution2dLayer (3256“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (2“步”2)convolution2dLayer (6512) reluLayer dropoutLayer (0.5)%的辍学生层fullyConnectedLayer (512)%完全连接层。reluLayer fullyConnectedLayer softmaxLayer (numClassesPlusBackground)% Softmax层classificationLayer%分类层];结束函数helperDownloadMSTARClutterData (outputFolder DataURL)%从给定的URL下载数据集的输出文件夹。radarDataTarFile = fullfile (outputFolder,“MSTAR_ClutterDataset.tar.gz”);如果~存在(radarDataTarFile“文件”)disp (下载MSTAR杂乱的数据(1.6 GB)……”);websave (radarDataTarFile DataURL);解压(radarDataTarFile outputFolder);结束结束函数helperDownloadPretrainedSARDetectorNet (outputFolder pretrainedNetURL)% pretrained网络下载。preTrainedMATFile = fullfile (outputFolder,“TrainedSARDetectorNet.mat”);preTrainedZipFile = fullfile (outputFolder,“TrainedSARDetectorNet.tar.gz”);如果~存在(preTrainedMATFile“文件”)如果~存在(preTrainedZipFile“文件”)disp (“下载pretrained检测器(29.4 MB)…”);websave (preTrainedZipFile pretrainedNetURL);结束解压(preTrainedZipFile outputFolder);结束结束

总结

这个例子展示了如何训练一个R-CNN SAR图像目标识别。pretrained网络获得超过0.9的准确性。

引用

[1]MSTAR概述https://www.sdms.afrl.af.mil/index.php?collection=mstar