主要内容

SAR图像中的自动目标识别

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

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

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

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

这个例子演示了如何:

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

  • 加载并分析图像数据

  • 定义网络体系结构

  • 指定培训选项

  • 训练网络

  • 评估网络

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

下载数据集

这个例子使用了MSTAR杂波数据集的一个子集,其中包含300个训练杂波图像和50个测试杂波图像,具有5个不同的目标。数据是用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/supportfiles/radar/data/MSTAR_ClutterDataset.tar.gz”);helperDownloadMSTARClutterData (outputFolder dataURL);

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

下载预训练网络

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

预训练neturl = (“https://ssd.mathworks.com/supportfiles/radar/data/TrainedSARDetectorNet.tar.gz”);doTrain =如果~ doTrain helperDownloadPretrainedSARDetectorNet (outputFolder pretrainedNetURL);结束

加载数据集

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

负载(“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);标题(“带边框和标签的训练图像样本”)

定义网络架构

为五个目标(SLICY, BTR_60, BRDM_2, ZSU_23_4, T62)创建R-CNN对象检测器。

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,或不想使用一个训练,设置ExecutionEnvironmentcpu。为确保使用GPU进行训练,请设置ExecutionEnvironmentgpu

%设置培训选项options = 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(outputFolder,“TrainedSARDetectorNet.mat”);负载(preTrainedMATFile);结束

在测试图像上评估检测器

要从定性上了解检测器的功能,可以从测试集中选取一个随机图像,并将其运行到检测器中。预计检测器将返回它认为检测到的目标所在的边界框集合,以及表示每次检测的置信度的分数。

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

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

scoreThreshold =0.8%显示检测结果outputImage = testImage;Idx = 1:长度(score) bbox = bboxes(Idx,:);thisScore = score(idx);如果thisScore > scoreThreshold注释= sprintf('%s:(置信度= %0.2f)'、标签(idx),...轮(thisScore, 2));outputImage = insertObjectAnnotation(outputImage,“矩形”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] =检测(检测器,I,“MiniBatchSize”16);%收集结果结果。Boxes{i} = bboxes;结果。Scores{i} = Scores;结果。标签{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(结果,期望结果,阈值);绘制精确回忆曲线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目标时显得最为吃力。然而,它仍然能够达到AP 0.7的课程。

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)“填充”,“相同”maxPooling2dLayer(2,“步”2) convolution2dLayer(3256年,“填充”,“相同”) reluLayer(卷积2dlayer)“填充”,“相同”maxPooling2dLayer(2,“步”2) convolution2dLayer(6,512) reluLayer dropoutLayer(0.5)%退出层fullyConnectedLayer (512)完全连接层。reluLayer fulllyconnectedlayer (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)下载预先训练的网络。preTrainedMATFile = fullfile(outputFolder,“TrainedSARDetectorNet.mat”);preTrainedZipFile = fullfile(outputFolder,“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

Baidu
map