主要内容

SAR图像中的自动目标识别

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

深度学习工具箱提供了一个框架,用于设计和实现带有算法、预训练模型和应用程序的深度神经网络。

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

基于神经网络的算法在从自然场景检测到医学成像的各个领域都取得了显著的成就。与标准的检测算法相比,它们已经有了巨大的改进。受这些进步的启发,研究人员努力将基于深度学习的解决方案应用于SAR成像领域。万博 尤文图斯在本例中,将该解决方案应用于目标检测与识别问题。本文采用的R-CNN网络不仅解决了检测与识别的集成问题,而且提供了一种有效的、高效的性能解决方案,适用于大场景SAR图像。

这个例子演示了如何:

  • 下载数据集和预训练的模型

  • 加载和分析图像数据

  • 定义网络架构

  • 指定培训选项

  • 培训网络

  • 评估网络

为了说明这一工作流程,该示例使用了空军研究实验室发布的移动和静止目标采集与识别(MSTAR)杂波数据集。数据集可供下载在这里.或者,该示例还包括用于展示工作流的数据子集。目标是开发一个可以检测和识别目标的模型。

下载数据集

这个例子使用了MSTAR杂波数据集的一个子集,它包含300个训练杂波图像和50个测试杂波图像,具有五个不同的目标。数据是使用x波段传感器在聚光灯模式下收集的,分辨率为1英尺。数据包含农村和城市类型的杂波。使用的目标类型是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/万博1manbetxsupportfiles/radar/data/MSTAR_ClutterDataset.tar.gz”);helperDownloadMSTARClutterData (outputFolder dataURL);

根据您的互联网连接,下载过程可能需要一些时间。该代码暂停MATLAB®执行,直到下载过程完成。或者,使用web浏览器将数据集下载到本地磁盘并提取文件。使用这种方法时,将示例中的变量更改为下载文件的位置。

下载预训练网络

从这里的链接下载预训练的网络helperDownloadPretrainedSARDetectorNetHelper函数,在本例的末尾定义。预训练模型允许您运行整个示例,而不必等待训练完成。为了训练网络,设置doTrain变量来真正的

pretrainedNetURL = (“https://ssd.mathworks.com/万博1manbetxsupportfiles/radar/data/TrainedSARDetectorNet.tar.gz”);doTrain =如果~ doTrain helperDownloadPretrainedSARDetectorNet (outputFolder pretrainedNetURL);结束

加载数据集

加载ground truth数据(训练集和测试集)。这些图像生成的方式是将目标芯片放置在背景杂波图像的随机位置。杂波图像是由下载的原始数据构建的。生成的目标将被用作地面真相目标来训练和测试网络。

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

ground truth数据存储在一个六列表中,其中第一列包含图像文件路径,第二至第六列包含不同的目标包围框。

显示数据集的前几行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:end}),[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。

objectClasses = {“SLICY”“BTR_60”“BRDM_2”“ZSU_23_4”“T62”};

该网络必须能够对五个目标和一个背景类进行分类,以便使用trainRCNNObjectDetector功能可在深度学习工具箱™。1在下面的代码中添加,以包括后台类。

numClassesPlusBackground = numel(objectClasses) + 1;

网络的最后一个完全连接层定义了它可以分类的类的数量。设置最终的全连接层有一个输出大小等于numClassesPlusBackground

定义输入大小inputSize = [128,128,1];定义网络layers = createNetwork(inputSize,numClassesPlusBackground);

现在,这些网络层可以用来训练一个基于R-CNN的五类对象检测器。

列车提速R-CNN

使用trainingOptions(深度学习工具箱)指定网络培训选项。trainingOptions默认使用GPU(如果有的话)(需要并行计算工具箱™和CUDA®支持的GPU,具有3.0或更高的计算能力)。否则,它使用CPU。属性指定执行环境ExecutionEnvironment的名称-值参数trainingOptions.若要自动检测是否有可用的GPU,请设置ExecutionEnvironment汽车.如果您没有GPU,或者不想使用GPU进行训练,请设置ExecutionEnvironmentcpu.为确保使用图形处理器进行训练,请设置ExecutionEnvironmentgpu

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

使用trainRCNNObjectDetector训练R-CNN对象检测器如果doTrain是真的。否则,加载预训练的网络。如果是训练,调整NegativeOverlapRange而且PositiveOverlapRange确保训练样本与地面真相紧密重叠。

如果doTrain训练一个R-CNN对象检测器。这需要几分钟检测器= trainRCNNObjectDetector(trainingData, layers, options,“PositiveOverlapRange”(0.5 - 1),“NegativeOverlapRange”, [0.1 0.5]);其他的装入先前训练过的检测器preTrainedMATFile = fullfile(输出文件夹,“TrainedSARDetectorNet.mat”);负载(preTrainedMATFile);结束

在测试图像上评估检测器

为了对检测器的功能有一个定性的概念,从测试集中随机挑选一张图像,并让它通过检测器。检测器将返回它认为检测到的目标所在的边界框集合,以及表示每次检测可信度的分数。

读取测试图像imgIdx = randi(高度(testData));testImage = imread(testData.imageFilename(imgIdx));在测试图像中检测SAR目标[bboxes,score,label] = detect(检测器,testImage,“MiniBatchSize”16);

要理解所获得的结果,请将结果与测试图像叠加。一个关键参数是检测阈值,即探测器检测到目标的分数高于该分数。阈值越高,假阳性越少;然而,这也会导致更多的假阴性。

scoreThreshold =0.8%显示检测结果outputImage = testImage;Idx = 1:长度(分数)bbox = bboxes(Idx,:);thisScore = score(idx);如果这个评分>评分阈值注释= sprintf('%s:(置信度= %0.2f)'、标签(idx),...轮(thisScore, 2));outputImage = insertObjectAnnotation(“矩形”bbox,...注释,“TextBoxOpacity”, 0.9,“字形大小”45岁的“线宽”2);结束结束F =数字;f.位置(3:4)= [860,740];imshow (outputImage)标题(“测试图像上的预测框和标签”

评估模型

通过按顺序查看图像,您可以了解检测器的性能。要使用整个测试集执行更严格的分析,请通过检测器运行测试集。

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

测试集中所有图像的可能检测及其包围框可用于计算每个类的检测器的平均精度(AP)。AP是探测器在不同召回级别上的精度的平均值,因此让我们定义精度和召回。

  • 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的检测器则擅长避免错误检测。准确率和召回率呈反比关系。

绘制每个类的精度和召回率之间的关系。每条曲线的平均值为AP。为0.5的检测阈值绘制曲线。

详情请参见evaluateDetectionPrecision(计算机视觉工具箱)

从测试数据中提取期望的包围框位置expectedResults = testData(:, 2:end);阈值= 0.5;使用平均精度度量来评估目标探测器[ap, recall, precision] = evaluateDetectionPrecision(results, expectedResults,threshold);绘制精度召回曲线F =数字;Ax = gca;f.位置(3:4)= [860,740];包含(“回忆”) ylabel (“精度”网格);持有;传奇(“位置”“东南”);标题(“不同类别0.5阈值的精密度与召回率曲线”);I = 1:长度(ap)绘制精度/召回率曲线情节(ax,回忆{我},精密{我},“DisplayName的”,[“类的平均精度”trainingData.Properties.VariableNames {i + 1}' is 'num2str(圆(美联社(我),3))))结束

大多数课程的AP都超过0.9。其中,经过训练的模型在检测SLICY目标方面似乎最困难。然而,它仍然能够达到0.7的AP类。

Helper函数

这个函数createNetwork以图像大小作为输入inputSize以及类的数量numClassesPlusBackground.该函数返回一个CNN。

函数layers = createNetwork(inputSize,numClassesPlusBackground) layers = [imageInputLayer(inputSize)输入层32岁的convolution2dLayer (3“填充”“相同”%卷积层reluLayer% Relu层32岁的convolution2dLayer (3“填充”“相同”) batchNormalizationLayer批处理归一化层reluLayer maxPooling2dLayer (2“步”, 2)最大池化层convolution2dLayer (64,“填充”“相同”) reluLayer卷积2dlayer (3,64,“填充”“相同”maxPooling2dLayer(2,“步”2) convolution2dLayer(3128年,“填充”“相同”) reluLayer卷积2dlayer (3,128,“填充”“相同”maxPooling2dLayer(2,“步”2) convolution2dLayer(3256年,“填充”“相同”) reluLayer卷积2dlayer (3256,“填充”“相同”maxPooling2dLayer(2,“步”,2)卷积2dlayer (6,512) reluLayer dropoutLayer(0.5)%退出层fullyConnectedLayer (512)%全连接层。reluLayer fullyConnectedLayer(numClassesPlusBackground) softmaxLayerSoftmax层classificationLayer分类层];结束函数helperDownloadMSTARClutterData (outputFolder DataURL)从给定的URL下载数据集到输出文件夹。radarDataTarFile = fullfile(输出文件夹,“MSTAR_ClutterDataset.tar.gz”);如果~存在(radarDataTarFile“文件”) disp (“正在下载MSTAR杂波数据(1.6 GB)…”);websave (radarDataTarFile DataURL);解压(radarDataTarFile outputFolder);结束结束函数helperDownloadPretrainedSARDetectorNet (outputFolder pretrainedNetURL)下载预训练的网络。preTrainedMATFile = fullfile(输出文件夹,“TrainedSARDetectorNet.mat”);preTrainedZipFile = fullfile(输出文件夹,“TrainedSARDetectorNet.tar.gz”);如果~存在(preTrainedMATFile“文件”如果~存在(preTrainedZipFile“文件”) disp (“下载预训练的检测器(29.4 MB)…”);websave (preTrainedZipFile pretrainedNetURL);结束解压(preTrainedZipFile outputFolder);结束结束

总结

这个例子展示了如何训练R-CNN用于SAR图像中的目标识别。预训练网络的准确率达到了0.9以上。

参考文献

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