主要内容

基于深度学习的多光谱图像语义分割

此示例显示如何使用U-Net使用七个通道执行多光谱图像的语义分割。

语义分割包括用类标记图像中的每个像素。语义分割的一个应用是跟踪森林砍伐,即森林覆盖随时间的变化。环境机构跟踪森林砍伐,以评估和量化一个地区的环境和生态健康。

基于深度学习的语义分割可以从高分辨率航天照片产生精确测量植被覆盖物。一个挑战是区分具有类似视觉特征的类,例如尝试将绿色像素分类为草,灌木或树。为了提高分类准确性,一些数据集包含多光谱图像,其提供关于每个像素的附加信息。例如,Hamlin Beach State Park数据集补充了具有三个近红外通道的彩色图像,可提供更清晰的类别分离。

这个例子展示了如何使用基于深度学习的语义分割技术从一组多光谱图像中计算一个区域的植被覆盖百分比。

下载数据

此示例使用高分辨率的多光谱数据集以培训网络[1]。图像集是使用无人机在纽约州哈姆林海滩州立公园上空拍摄的。数据包含带标签的训练、验证和测试集,以及18个对象类标签。数据文件大小约为3.0 GB。

下载使用该数据集的Mat文件版本downloadHamlinBeachMSIDatahelper函数。这个函数作为支持文件附加到示例中。金宝app

imageDir = tempdir;url =“http://www.cis.rit.edu/ ~ rmk6217 / rit18_data.mat”;downloadhamlinbeachmsidata(URL,imagedir);

检查训练数据

将数据加载到工作区中。

负载(fullfile (imageDir“rit18_data”'rit18_data.mat'));

检查数据的结构。

train_dataval_data测试数据
名称大小字节类属性test_data 7x12446x7654 1333663576 uint16 train_data 7x9393x5642 7x9393x5642 741934284 uint16 val_data 7x8833x6918 855493716 uint16

多光谱图像数据被布置为NumChannels.-经过-宽度-经过-高度数组。而在MATLAB®中,多通道图像排列为宽度-经过-高度-经过-NumChannels.数组。要重塑数据,以便通道位于第三维度,使用辅助功能,SwitchChannelstothirdPlane..这个函数作为支持文件附加到示例中。金宝app

train_data = switchchannelstothirdplane(train_data);val_data = switchChannelstClirdplane(val_data);test_data = switchChannelstClirdplane(test_data);

确认数据具有正确的结构。

train_dataval_data测试数据
名称大小字节类属性test_data 12446x76546 uint16 train_data 9393x5642x7 741934284 uint16 val_data 8833x6918x7 855493716 uint16

RGB颜色通道是第3、2和1个图像通道。以蒙太奇的形式显示训练、验证和测试图像的颜色组件。要使图像在屏幕上显得更亮,可以使用histeq函数。

图蒙太奇(......{histeq (train_data (:,: [3 2 1])),......histeq (val_data (:,:, (3 2 1))),......histeq(测试数据(:,:,[3 2 1])),......'毗邻'10,“背景色”“白色”) 标题(“训练图像(左)、验证图像(中)和测试图像(右)的RGB组件”

以蒙太奇的形式显示训练数据的最后三个直方图均衡化通道。这些通道对应于近红外波段,并根据它们的热信号突出图像的不同组成部分。例如,靠近第二个通道图像中心的树比其他两个通道中的树显示更多的细节。

图蒙太奇(......{histeq (train_data (:: 4)),......组合时间(train_data(:,:,5)),......histeq (train_data (:: 6))},......'毗邻'10,“背景色”“白色”) 标题('训练图像的红外通道1(左)、2(中)和3(右)'

通道7是指示有效分段区域的掩模。显示培训,验证和测试图像的掩码。

图蒙太奇(......{train_data(:,:,7),......val_data(:,:7),......test_data (:: 7)},......'毗邻'10,“背景色”“白色”) 标题('训练图像(左),验证图像(中心)和测试图像(右)'掩模'

标记的图像包含分割的地面真实数据,每个像素分配给18个类中的一个。使用相应的ID获取类列表。

disp(类)
0类/图像边框1.道路标记2.树3.建筑物4.车辆(汽车,卡车或公共汽车)5。人6.救生员椅7.野餐桌8.黑色木板9.白色木板10。橙色着陆垫11.水浮标12.岩石13.其他植被14.草15.沙子16.水(湖)17.水(池塘)18.沥青(停车场/走道)

创建类名称的矢量。

ClassNames = [“路标”“树”“建筑”“汽车”“人”......“救生员”“野餐桌”“BlackwoodPanel”......“WhiteWoodPanel”“OrangeLandingPad”“浮标”“摇滚”......“LowleVelseGetation”“grass_lawn”“sand_beach”......“water_lake”“water_pond”“沥青”];

覆盖直方图均衡的RGB训练图像上的标签。将彩色栏添加到图像上。

cmap=jet(numel(类名));B=labeloverlay(histeq(列车数据(:,:,4:6)),列车标签,“透明度”,0.8,'colormap',CMAP);数字imshow(b)标题('训练标签')n = numel(classnames);蜱= 1 /(n * 2):1 / n:1;彩色杆('ticklabels',cellstr(classnames),'蜱'蜱虫,'ticklength',0,“TickLabelInterpreter”“没有”);Colormap(CMAP)

将培训数据保存为垫文件和培训标签作为PNG文件。

保存(“train_data.mat”'train_data');IMWRITE(TRAIN_LABELS,“train_labels.png”);

创建用于训练的随机补丁提取数据存储

使用随机修补程序提取数据存储来将培训数据送到网络。此数据存储区从图像数据存储和像素标签数据存储中提取多个对应的随机补丁,该数据存储包含地面真实图像和像素标签数据。修补是一种常用的技术,可以防止用于大图像的内存并有效地增加可用培训数据的量。

从存储训练图像开始“train_data.mat”在一个imageageAtastore..因为垫文件格式是非标准图像格式,所以必须使用MAT文件读取器来启用读取图像数据。您可以使用助手垫文件阅读器,matReader,从训练数据中提取前六个通道,省略包含掩码的最后一个通道。这个函数作为支持文件附加到示例中。金宝app

imd = imageDatastore (“train_data.mat”“文件扩展名”'。垫'“ReadFcn”,@matReader);

创建一个PixellabeldAtastore.存储包含18个标记区域的标签修补程序。

Pixellabelids = 1:18;pxds = pixellabeldataStore(“train_labels.png”,classnames,pixellabelids);

创建一个RandompatchExtractionDatastore.从图像数据存储和像素标签数据存储。每个迷你批处理包含16个尺寸256×256像素的16个斑块。在每次迭代时提取千项批次。

pxds dsTrain = randomPatchExtractionDatastore (imd, [256256],'patchesperimage',16000);

随机补丁提取数据存储Dstrain.在每次迭代时向网络提供迷你批次数据。预览数据存储区以探索数据。

InputBatch =预览(DStrain);DISP(InputBatch)
InputImage ResponsePixellabelimage _____________________ {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类} {256×256×6 uint16} {256×256分类}

创建U-Net网络层

本例使用U-Net网络的一种变体。在U-Net中,最初的卷积层序列被最大池化层点缀,依次降低了输入图像的分辨率。这些层之后是一系列交错上采样算子的卷积层,依次提高了输入图像的分辨率[2]网络的名称来源于这样一个事实,即网络可以画成一个对称的形状,如字母U。

本例修改了U-Net,使其在卷积中使用零填充,以便卷积的输入和输出具有相同的大小。使用辅助函数,createunet.,创建一个带有一些预选的超参数的U-Net。这个函数作为支持文件附加到示例中。金宝app

InputTilesize = [256,256,6];lgraph = creemenet(inputTileSize);DISP(LAPH.LAYERS)
带层的58×1层阵列:1“ImageInputLayer”图像输入256×256×6图像,带“零中心”规格化2“编码器节-1-Conv-1”卷积64 3×3×6卷积,带跨距[1 1]和填充[1 1 1 1 1]3“编码器节-1-ReLU-1”ReLU-4“编码器节-1-Conv-2”卷积64 3×3×64卷积,带跨距[1]和padding[1 1 1 1]5'Encoder-Section-1-ReLU-2'ReLU-ReLU-6'Encoder-Section-1-MaxPool'Max Pooling 2×2 Max Pooling with stride[2]和padding[0 0 0 0 0]7'Encoder-Section-2-Conv-1'卷积128 3×3×64卷积with stride[1]和padding[1 1 1 1 1 1 1]8'Encoder-Section-2-ReLU-1'ReLU-ReLU-9'Encoder-Section-2-Conv-2'卷积128 3×3×128卷积带跨步[11]和填充[11]10'Encoder-Section-2-ReLU-2'ReLU-11'Encoder-Section-2-MaxPool'最大池2×2最大池带跨步[22]和填充[0 0]12'编码器-Section-3-Conv-1'卷积256 3×3×128卷积带跨步[11]和填充[11]13'编码器-Section-3-ReLU-1'ReLU-ReLU-14'编码器-Section-3-Conv-2'卷积256 3×3×256卷积带跨步[11]和填充[1]15'编码器-Section-3-ReLU-2'ReLU-ReLU-16'编码器-Section-3-MaxPool'最大池2×2最大池带跨步[2]和填充[0 0 0]17'编码器-Section-4-Conv-1'卷积512 3×3×256卷积带跨步[1]和填充[1 1 1 1 1]18'编码器-Section-4-ReLU-1'ReLU-ReLU-19'编码器-Section-4-Conv-2'卷积512 3×3×512带跨步[11]和填充[11]20'编码器-Section-4-ReLU-2'ReLU-21'编码器-Section-4-辍学50%辍学22'编码器-Section-4-MaxPool'最大池2×2最大池带跨步[22]和填充[0]23“Mid-Conv-1”卷积1024 3×3×512卷积带跨步[11]和填充[11]24“Mid-ReLU-1”ReLU-25“Mid-Conv-2”卷积1024 3×3×1024卷积带跨步[11]和填充[1]26“Mid-ReLU-2”ReLU-ReLU 27“Mid-DropOut”DropOut 50%DropOut 28“Decoder-Section-1-UpConv”转置卷积512 2×2×1024转置卷积,带跨步[2]和裁剪[0]29“Decoder-Section-1-UpReLU”ReLU-ReLU 30“Decoder-Section-1-DepthConcatenation”深度级联2个输入的深度级联31“Decoder-Section-1-Conv-1”卷积512 3×3×1024卷积,带跨距[1]和填充[1]32'Decoder-Section-1-ReLU-1'ReLU-ReLU-33'Decoder-Section-1-Conv-2'卷积512 3×3×512带跨步[11]和填充[11]34'Decoder-Section-1-ReLU-2'ReLU-35'Decoder-Section-2-UpConv'转置卷积256 2×2×512带跨步[2]和裁剪[0 0 0]36“Decoder-Section-2-UpReLU”ReLU-ReLU 37“Decoder-Section-2-DepthConcatenation”深度级联2个输入的深度级联38“Decoder-Section-2-Conv-1”卷积256 3×3×512卷积,带跨距[1]和填充[1]39“Decoder-Section-2-ReLU-1”ReLU-ReLU-40“Decoder-Section-2-Conv-2”卷积256 3×3×256带跨步[11]和填充[11]41“Decoder-Section-2-ReLU-2”ReLU-42“Decoder-Section-3-UpConv”转置卷积128 2×2×256带跨步[2]和裁剪[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 043“Decoder-Section-3-UpReLU”ReLU-ReLU 44“Decoder-Section-3-DepthConcatenation”深度级联2个输入的深度级联45“Decoder-Section-3-Conv-1”卷积128 3×3×256卷积,带跨距[1]和填充[1]46“Decoder-Section-3-ReLU-1”ReLU-ReLU-47“Decoder-Section-3-Conv-2”卷积128 3×3×128带跨步[11]和填充[11]48“Decoder-Section-3-ReLU-2”ReLU-49“Decoder-Section-4-UpConv”转置卷积64 2×2×128带跨步[22]和裁剪[0 0 0]50“Decoder-Section-4-UpReLU”ReLU-ReLU 51“Decoder-Section-4-DepthConcatenation”深度级联2个输入的深度级联52“Decoder-Section-4-Conv-1”卷积64 3×3×128卷积,带跨步[1]和填充[1]53“Decoder-Section-4-ReLU-1”ReLU-ReLU-54“Decoder-Section-4-Conv-2”卷积64 3×3×64带跨距[11]和填充[11]55“Decoder-Section-4-ReLU-2”ReLU-ReLU-56“Final ConvolutionLayer”卷积18 1×1×64带跨距[11]和填充[0 0]57'Softmax层'Softmax Softmax 58'分割层'像素分类层交叉熵损失

选择培训选项

训练网络使用随机梯度下降与动量(SGDM)优化。方法指定SGDM的超参数设置培训选项(深度学习工具箱)函数。

训练深层网络非常耗时。通过指定较高的学习率来加速训练。但是,这可能会导致网络的梯度爆炸或无法控制地增长,从而阻止网络成功训练。若要将梯度保持在有意义的范围内,请通过指定来启用梯度剪裁“梯度阈值”作为0.05,并指定'GradientThresholdMethod'使用渐变的L2范数。

initialLearningRate = 0.05;maxEpochs = 150;minibatchSize = 16;l2reg = 0.0001;选择= trainingOptions ('sgdm'......“初始学习率”,initiallearningrate,......“动力”,0.9,......'L2Regularization',l2reg,......'maxepochs',maxepochs,......'minibatchsize',小匹马,......'shownrateschedule''分段'......'洗牌''每个时代'......'GradientThresholdMethod'“l2norm”......“梯度阈值”,0.05,......“阴谋”'培训 - 进步'......'verbosefrequency', 20);

培训网络

默认情况下,示例下载使用该数据集的预磨损版本的U-Net版本downloadTrainedUnethelper函数。这个函数作为支持文件附加到示例中。金宝app预先训练过的网络使您能够运行整个示例,而不必等待训练完成。

要训练网络,请设置doTraining以下代码中的变量真的.使用培训模型列车网络(深度学习工具箱)函数。

在GPU上培训如果有一个可用的。使用GPU需要并行计算工具箱™和CUDA®的NVIDIA®GPU。有关更多信息,请参阅GPU通金宝app过发布支持(并行计算工具箱).NVIDIA Titan X的培训大约需要20个小时。

dotraining = false;如果DOTRAINT [NET,INFO] = TRAINNETWORK(DSTRAIN,LPRAGH,选项);modeldateTeme = string(DateTime('现在''格式'“yyyy-mm-dd-hh-mm-ss”));保存(strcat(“MultiSpectRaluet-”,modeldateTime,“-时代-”,num2str(maxepochs),“。垫”),“净”);其他的trouseunet_url ='//www.tatmou.com/金宝appsupportfiles/vision/data/multispectralunet.mat';DownloadTroundTordUre(trounduneT_URL,imagedir);负载(fullfile (imageDir“trainedUnet”“多谱线。mat”));结束

您现在可以使用U-Net来语义段分段多光谱图像。

预测测试数据的结果

要在培训的网络上执行前进传递,请使用辅助功能,semmentImage.,验证数据集。这个函数作为支持文件附加到示例中。金宝appsemmentImage.使用该图像修补程序执行分段semanticseg函数。

predictpatchsize = [1024 1024];segmentedImage = sementImage(val_data,net,predictpatchsize);

为了只提取分割的有效部分,将分割后的图像乘以验证数据的掩模通道。

segmentedImage = UINT8(Val_Data(:,:,7)〜= 0)。* segmentedImage;图imshow(segmentedimage,[])标题('分段图像'

语义分割的输出有噪声。执行图像后处理以去除噪声和杂散像素。使用Medfilt2.从分割中除去盐和胡椒噪声的功能。通过移除噪声可视化分段图像。

分段图像=medfilt2(分段图像[7,7]);imshow(片段图像,[]);头衔(“去除噪声的分割图像”

将分割后的图像叠加到直方图均衡化的RGB验证图像上。

b = labeloverlay(组织(val_data(:::[3 2 1])),segmentedImage,“透明度”,0.8,'colormap',CMAP);数字imshow(b)标题('标记验证图像')颜色栏('ticklabels',cellstr(classnames),'蜱'蜱虫,'ticklength',0,“TickLabelInterpreter”“没有”);Colormap(CMAP)

将分割图像和地面真相标签另存为PNG文件。这些将用于计算精度指标。

imwrite (segmentedImage“results.png”); imwrite(val_标签,'gtruth.png');

量化分割精度

创建一个PixellabeldAtastore.对于分割结果和地面真理标签。

pxdsresults = pixellabeldataStore(“results.png”,classnames,pixellabelids);pxdstruth = pixellabeldataStore('gtruth.png',classnames,pixellabelids);

通过使用使用的测量语义分割的全球精度evaluateSemanticSegmentation函数。

ssm=评估语义分段(pxdsResults,pxdsTruth,'度量标准'“global-accuracy”);
评估语义分割结果--------------------------------- *所选指标:全球准确性.*处理1个图像。*完成......完成。*数据集指标:GlobalAccuracy ______________0.90698

全局准确度评分表示刚刚超过90%的像素被正确分类。

计算植被覆盖范围

本示例的最终目标是计算多光谱图像中植被覆盖的范围。

找到标记植被的像素数。标签id 2(“Trees”)、13(“LowLevelVegetation”)和14(“Grass_Lawn”)是植被类。并通过对掩模图像感兴趣区域内像素的求和得到有效像素的总数。

vegetationClassIds = uint8([2、13、14]);vegetationPixels = ismember (segmentedImage (:), vegetationClassIds);validPixels = (segmentedImage ~ = 0);numVegetationPixels =总和(vegetationPixels (:));numValidPixels =总和(validPixels (:));

将植被像素数除以有效像素数,计算植被覆盖率百分比。

percivedvegetationcover =(numvegetationpixels / numvalidpixels)* 100;fprintf(“植被覆盖率为%3.2f%%”,百分比植物;
植被覆盖率为51.72%。

工具书类

[1] Kemker,R.,C. Salvaggio和C. Kanan。“语义细分的高分辨率多光谱数据集。”corr,abs / 1703.01918。2017年。

[2] Ronneberger,O.,P.Fischer和T.Brox。“U-Net:用于生物医学图像分割的卷积网络。”Cor,ABS / 1505.04597。2015年。

另请参阅

(深度学习工具箱)|(深度学习工具箱)|||||||

相关话题

外部网站