pixelLabelImageDatastore

数据存储的语义分割网络

描述

使用pixelLabelImageDatastore创建一个数据存储使用深度学习训练语义分割网络。

创建

描述

例子

pximds= pixelLabelImageDatastore(gTruth)返回的数据存储基于输入训练语义分割网络真实状况的对象或数组真实状况对象。使用输出pixelLabelImageDatastore与深学习工具箱™功能对象trainNetwork训练卷积神经网络进行语义分割。

pximds= pixelLabelImageDatastore(洛桑国际管理发展学院,pxds)返回基于输入图像数据存储和像素标签数据存储对象的数据存储。洛桑国际管理发展学院是一个ImageDatastore对象,表示网络的训练输入。pxdsPixelLabelDatastore对象,它表示所要求的网络输出。

pximds= pixelLabelImageDatastore(___,名称,值)另外,使用名称-值对设置DispatchInBackgroundOutputSizeMode属性。对于2-d的数据,你也可以使用名称 - 值对指定ColorPreprocessing,DataAugmentationOutputSize增加属性。您可以指定多个名称-值对。将每个属性名称用引号括起来。

例如,pixelLabelImageDatastore(gTruth, 'PatchesPerImage',40)创建在随机地生成从每个地面实况物体40级的补丁的像素标签图像数据存储区gTruth

输入参数

展开全部

地面真实数据,指定为a真实状况对象或作为阵列真实状况对象。每一个真实状况对象包含有关数据源的标签定义列表,以及一组地面实况标签的所有标记标签的信息。

图像采集,指定为ImageDatastore对象。

像素标记图像的集合,指定为aPixelLabelDatastore对象。对象中包含的每个图像的像素标记图像洛桑国际管理发展学院输入对象。

属性

展开全部

此属性是只读的。

图像文件名作为源对地面实况图像,指定为字符向量或特征向量的单元阵列。

此属性是只读的。

像素标签数据的文件名作为源对地面实况标签图像,指定为字符或多个字符的单元阵列。

此属性是只读的。

类名,指定为字符向量的单元阵列。

2-d的数据,指定为颜色通道预处理“没有”,'gray2rgb', 要么'rgb2gray'。当你需要由数据源创建必须是唯一的色彩或灰度的图像数据,但训练集包括使用该属性。假设你需要培养一个期望的彩色图像的网络,但你的一些训练图像是灰度图像。组ColorPreprocessing'gray2rgb'复制输入图像集的灰度图像的颜色通道。使用'gray2rgb'选项创建-通过-N3输出图像。

ColorPreprocessing属性不支持3-D数据。万博1manbetx为了执行颜色通道预处理3-d的数据,使用转变函数。

预处理应用于输入图像,指定为imageDataAugmenter对象或“没有”。当DataAugmentation“没有”,对输入图像不进行预处理。训练数据可以在训练过程中实时扩充。

DataAugmentation属性不支持3-D数据。万博1manbetx要预处理3-D数据,请使用转变函数。

在培训、预测、分类过程中的调度观察,具体为要么真正。要使用后台调度,您必须拥有并行计算工具箱™。如果DispatchInBackground真正你必须并行计算工具箱,然后pixelLabelImageDatastore异步读取补丁,增加噪音,并排队补丁对。

即在每个批次返回意见的数量。默认值是等于READSIZE图像数据存储洛桑国际管理发展学院。你可以改变的价值MiniBatchSize只有在创建了数据存储之后。用于训练、预测或分类的MiniBatchSize属性被设置为在所定义的小批量大小trainingOptions

此属性是只读的。

总数在去噪图像数据存储意见。观测值的数量是一个训练历元的长度。

此属性是只读的。

输出图像,指定为两个正整数的向量的大小。第一元素指定的行中的输出图像的数量,并且所述第二元素指定的列数。当您指定OutputSize,图像大小可根据需要进行调整。默认情况下,此属性为空,这意味着不调整图像。

OutputSize属性不支持3-D数据。万博1manbetx设置3-d数据的输出大小,使用转变函数。

方法,用于调整输出图像的大小,指定为以下选项之一。此属性仅在设置时应用OutputSize的值[]

  • “调整大小”-缩放图像,以适合输出大小。有关更多信息,请参见imresize

  • 'centercrop'-从训练图像的中心剪裁。作物的大小与产量大小相同。

  • 'randcrop'-从训练图像中随机裁剪。随机作物的大小与产量大小相同。

数据类型:烧焦|

对象的功能

结合 组合来自多个数据存储的数据
countEachLabel 计数像素或盒标签的发生
hasdata 确定数据是否可供读取
partitionByIndex 划分pixelLabelImageDatastore根据指数
预习 在数据存储中的数据子集
从数据存储中读取数据
readall 阅读数据存储的所有数据
readByIndex 读取由索引指定的数据pixelLabelImageDatastore
重启 复位数据存储到初始状态
洗牌 返回打乱的数据存储版本
转变 变换数据存储

例子

全部折叠

加载训练数据。

dataSetDir =完整文件(toolboxdir(“愿景”),'visiondata','triangleImages');IMAGEDIR =完整文件(dataSetDir,“trainingImages”);labelDir = fullfile (dataSetDir,'trainingLabels');

创建图像的图像数据存储。

imd = imageDatastore (imageDir);

创建一个pixelLabelDatastore对于地面实况像素的标签。

类名= [“三角形”,“背景”];labelIDs = [255 0];一会,pxds = pixelLabelDatastore (labelDir labelIDs);

可视化训练图像和地面实况像素的标签。

I =读(IMDS);C =读(pxds);I = imresize(I,5);L = imresize(UINT8(C {1}),5);imshowpair(I,L,“蒙太奇”)

创建语义分割网络。该网络使用基于采样和采样设计一个简单的语义分割网络。

numFilters = 64;filterSize = 3;numClasses = 2;layer = [imageInputLayer([32 32 1])]'填充',1)reluLayer()maxPooling2dLayer(2,“步”(2) convolution2dLayer filterSize numFilters,'填充',1)reluLayer()transposedConv2dLayer(4,numFilters,“步”,2,“裁剪”1);numClasses convolution2dLayer(1日);pixelClassificationLayer softmaxLayer () ())
层= 10×层阵列层:1 '' 图像输入32x32x1图像与 'zerocenter' 正常化2 '' 卷积64分3×3的卷积与步幅[1 1]和填充[1 1 1 1] 3 '' RELU RELU 4 '' 最大池2×2与步幅[2 2]和填充[0 0 0 0]的5 '最大池' 卷积64分3×3的卷积与步幅[1 1]和填充[1 1 1 1] 6 '' RELU RELU 7 '' 转置卷积644×4转置与步幅[2 2]和裁剪[1 1 1 1] 8 '卷积' 卷积2个1x1的卷积与步幅[1 1]和填充[0 0 0 0] 9 '' 使用SoftMax SOFTMAX 10 '' 像素分类层跨-entropy损失

设置培训选项。

OPTS = trainingOptions('SGDM',...“InitialLearnRate”,1E-3,...'MaxEpochs', 100,...'MiniBatchSize', 64);

创建一个包含训练数据中的像素标签图像数据存储。

trainingData = pixelLabelImageDatastore(IMDS,pxds);

培训网络。

净= trainNetwork(trainingData,层,OPTS);
在单CPU上进行训练。正在初始化输入数据规范化。| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | | |时代迭代时间| Mini-batch | Mini-batch |基地学习| | | | (hh: mm: ss) | | |损失精度率| | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | 1 | 1 |就是58.11% | | 1.3458 | 0.0010 | | 17 | 50 | 00:00:20 | 97.30% | 0.0924 | 0.0010 | | 100 | | 00:00:39 | 98.09% | 0.0575 | 0.0010 | | 150 | | 00:00:58 | 98.56% | 0.0424 |0.0010 | 67 | 200 | | 00:01:18 | 98.48% | 0.0435 | 0.0010 | 84 | 250 | | 00:01:37 | 98.66% | 0.0363 | 0.0010 | 100 | 300 | | 00:01:57 | 98.90% | 0.0310 | 0.0010 | | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |

读取并显示测试图像。

testImage = imread ('triangleTest.jpg');imshow(testImage)

段中的测试图像,并显示结果。

C = semanticseg(testImage,净);B = labeloverlay(testImage,C);imshow(B)

改善结果

网络无法对三角形进行分割,将每个像素都归为“背景”。训练进行得很顺利,训练准确率超过90%。然而,网络只学会了对背景类进行分类。要理解发生这种情况的原因,可以计算数据集中每个像素标签的出现次数。

TBL = countEachLabel(trainingData)
台=2×3表名称PixelCount ImagePixelCount ______________ __________ _______________ { '三角形'} 10326 2.048e + 05 { '背景'} 1.9447e + 05 2.048e + 05

大多数像素的标签是为背景。可怜的结果是由于该类不平衡。类不平衡偏置有利于统治阶级的学习过程。这就是为什么每个像素被归类为“背景”。要解决这个问题,可以使用类权重来平衡类。有计算类权重的几种方法。一种常见的方法是逆频率加权,其中类权重是类频率的倒数。这增加了重量给予不足的类。

totalNumberOfPixels =总和(tbl.PixelCount);频率=(资源。PixelCount / totalNumberOfPixels;classWeights = 1. /频率
classWeights =2×119.8334 1.0531

类的权重可以使用指定pixelClassificationLayer。更新最后一层使用pixelClassificationLayer用逆向类权重。

层(结束)= pixelClassificationLayer(“类”,tbl.Name,“ClassWeights”,classWeights);

再次列车网络。

净= trainNetwork(trainingData,层,OPTS);
在单CPU上进行训练。正在初始化输入数据规范化。| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | | |时代迭代时间| Mini-batch | Mini-batch |基地学习| | | | (hh: mm: ss) | | |损失精度率| | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | | 1 | 1 |就是72.27% | | 5.4135 | 0.0010 | | 17 | 50 | 00:00:19 | 94.84% | 0.1188 | 0.0010 | | 100 | | 00:00:38 | 96.53% | 0.0871 | 0.0010 | | 150 | | 00:00:55 | 97.29% | 0.0599 |0.0010 | 67 | 200 | | 00:01:14 | 97.46% | 0.0628 | 0.0010 | 84 | 250 | | 00:01:33 | 97.64% | 0.0586 | 0.0010 | 100 | 300 | | 00:01:51 | 97.99% | 0.0451 | 0.0010 | | = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |

尝试再次段的测试图像。

C = semanticseg(testImage,净);B = labeloverlay(testImage,C);imshow(B)

使用类权重来平衡类,分割效果较好。改进结果的其他步骤包括增加用于训练的epoch的数量,增加更多的训练数据,或修改网络。

配置像素标签图像数据存储,同时训练扩充数据。

负荷训练图像和像素标签。

dataSetDir =完整文件(toolboxdir(“愿景”),'visiondata','triangleImages');IMAGEDIR =完整文件(dataSetDir,“trainingImages”);labelDir = fullfile (dataSetDir,'trainingLabels');

创建imageDatastore反对举办训练图像。

imd = imageDatastore (imageDir);

定义类名称及其关联标签的ID。

类名= [“三角形”,“背景”];labelIDs = [255 0];

创建一个pixelLabelDatastore对象来保存地面实况像素标签训练图像。

pxds = pixelLabelDatastore(labelDir,类名,labelIDs);

创建imageDataAugmenter对象随机旋转和镜像图像数据。

增强因子= imageDataAugmenter('RandRotation',[ -  10 10],'RandXReflection',真正)
增强因子= imageDataAugmenter与属性:FillValue:0 RandXReflection:1 RandYReflection:0 RandRotation:[-10 10] RandScale:[1 1] RandXScale:[1 1] RandYScale:[1 1] RandXShear:[0 0] RandYShear:[00] RandXTranslation:[0 0] RandYTranslation:[0 0]

创建一个pixelLabelImageDatastore对象到网络增强数据训练。

pxds plimds = pixelLabelImageDatastore (imd,“DataAugmentation”增量)
plimds = pixelLabelImageDatastore with properties: Images: {200x1 cell} PixelLabelData: {200x1 cell}类名:{2x1 cell} DataAugmentation: [1x1 imageDataAugmenter] ColorPreprocessing: 'none' OutputSize: [] OutputSizeMode: 'resize' MiniBatchSize: 1 NumObservations: 200 DispatchInBackground: 0

列车采用扩张回旋语义分割网络。

语义网络分割图像中的每个像素进行分类,从而产生由类分割的图像。对于语义分割的应用包括道路分割为自主驾驶和癌细胞分割的医疗诊断。要了解更多信息,请参阅入门语义分割使用Deep学习

像DeepLab[1]这样的语义分割网络广泛使用了扩张性卷积(也被称为atrous convolutions),因为它们可以在不增加参数或计算量的情况下增加图层的接受域(输入区域)。

负荷训练数据

该示例使用32×32的三角形的图像出于说明的目的简单的数据集。该数据集包括伴随像素标签地面实况数据。加载使用训练数据imageDatastorepixelLabelDatastore

dataFolder =完整文件(toolboxdir(“愿景”),'visiondata','triangleImages');imageFolderTrain = fullfile (dataFolder,“trainingImages”);labelFolderTrain =完整文件(dataFolder,'trainingLabels');

创建imageDatastore的图像。

imdsTrain = imageDatastore(imageFolderTrain);

创建一个pixelLabelDatastore对于地面实况像素的标签。

类名= [“三角形”“背景”];标签= [255 0];pxdsTrain = pixelLabelDatastore(labelFolderTrain,类名,标签)
pxdsTrain = PixelLabelDatastore with properties: Files: {200x1 cell}类名:{2x1 cell} ReadSize: 1 ReadFcn: @readDatastoreImage alternatefilesystemroot: {}

创建语义分割网络

这个例子使用了一个简单的基于扩展卷积的语义分割网络。

创建训练数据的数据源,并得到了像素数为每个标签。

pximdsTrain = pixelLabelImageDatastore (imdsTrain pxdsTrain);台= countEachLabel (pximdsTrain)
台=2×3表名称PixelCount ImagePixelCount ______________ __________ _______________ { '三角形'} 10326 2.048e + 05 { '背景'} 1.9447e + 05 2.048e + 05

大多数像素标签用于背景。这种阶级不平衡使学习过程偏向于占统治地位的阶级。要解决这个问题,可以使用类权重来平衡类。您可以使用几种方法来计算类权重。一种常见的方法是逆频率加权,其中类权重是类频率的倒数。这个方法增加了给未表示的类的权重。使用逆频率加权计算类权重。

numberPixels =总和(tbl.PixelCount);频率=(资源。PixelCount / numberPixels;classWeights = 1 ./频率;

通过使用图像输入层与对应于输入图像的尺寸的输入大小创建像素分类的网络。接下来,指定卷积,批次归一化,和RELU层的三个块。对于每个卷积层,随着扩张因子和垫输入指定32 3×3的过滤器,以便它们的尺寸通过设置的输出相同的'填充'选项'相同'。到像素进行分类,包括卷积层用K1×1的卷积,K是类的数量,后跟一个SOFTMAX层和一个pixelClassificationLayer与反类权值。

inputSize = [32 32 1];filterSize = 3;numFilters = 32;numClasses = numel(类名);层= [imageInputLayer(inputSize)convolution2dLayer(filterSize,numFilters,'DilationFactor'1,'填充','相同') batchNormalizationLayer reluLayer convolution2dLayer(过滤器大小,numFilters,'DilationFactor',2,'填充','相同') batchNormalizationLayer reluLayer convolution2dLayer(过滤器大小,numFilters,'DilationFactor'4,'填充','相同')batchNormalizationLayer reluLayer convolution2dLayer(1,numClasses)softmaxLayer pixelClassificationLayer(“类”,类名,“ClassWeights”,classWeights)];

列车网络的

指定培训选项。

选项= trainingOptions('SGDM',...'MaxEpochs',100,...'MiniBatchSize', 64,...“InitialLearnRate”1 e - 3);

利用训练网络trainNetwork

净= trainNetwork(pximdsTrain,层,选项);
在单CPU上进行训练。正在初始化输入数据规范化。| ======================================================================================== ||大纪元|迭代|已用时间|小批量|小批量|基础教育| | | | (hh:mm:ss) | Accuracy | Loss | Rate | |========================================================================================| | 1 | 1 | 00:00:00 | 91.62% | 1.6825 | 0.0010 | | 17 | 50 | 00:00:19 | 88.56% | 0.2393 | 0.0010 | | 34 | 100 | 00:00:41 | 92.08% | 0.1672 | 0.0010 | | 50 | 150 | 00:01:01 | 93.17% | 0.1472 | 0.0010 | | 67 | 200 | 00:01:22 | 94.15% | 0.1313 | 0.0010 | | 84 | 250 | 00:01:42 | 94.47% | 0.1167 | 0.0010 | | 100 | 300 | 00:02:05 | 95.04% | 0.1100 | 0.0010 | |========================================================================================|

测试网络

加载测试数据。创建imageDatastore的图像。创建一个pixelLabelDatastore对于地面实况像素的标签。

imageFolderTest =完整文件(dataFolder,'testImages');imdsTest = imageDatastore (imageFolderTest);labelFolderTest = fullfile (dataFolder,“testLabels”);pxdsTest = pixelLabelDatastore(labelFolderTest,类名,标签);

使用测试数据和训练过的网络进行预测。

pxdsPred = semanticseg(imdsTest,网,'MiniBatchSize',32,“WriteLocation”,TEMPDIR);
运行语义分割网络------------------------------------- * 100倍加工的图像。

评估预测精度使用evaluateSemanticSegmentation

度量= evaluateSemanticSegmentation(pxdsPred,pxdsTest);
评估语义分割结果---------------------------------------- *选择指标:全球精度,类准确性,IOU,加权IOU,BF得分。*加工100张图像。*即将完成...完成。*数据集的指标:GlobalAccuracy MeanAccuracy MeanIoU WeightedIoU MeanBFScore ______________ ____________ _______ ___________ ___________ 0.95237 0.97352 0.72081 0.92889 0.46416

有关评估语义分割网络的更多信息,请参见evaluateSemanticSegmentation

段新形象

读取并显示测试图像triangleTest.jpg

imgTest = imread ('triangleTest.jpg');图imshow(imgTest)

段使用测试图像semanticseg并使用labeloverlay

C = semanticseg(imgTest,净);B = labeloverlay(imgTest,C);图imshow(B)

提示

  • pixelLabelDatastorepxdsimageDatastore洛桑国际管理发展学院以字典顺序存储位于文件夹中的文件。例如,如果您有12个文件命名'file1.jpg','file2.jpg',...,'file11.jpg''file12.jpg',然后将文件存储在顺序如下:

    'file1.jpg''file10.jpg''file11.jpg''file12.jpg''file2.jpg''file3.jpg'...“file9.jpg”
    存储在一个单元阵列中的文件相同的顺序被读出,因为它们被存储。

    如果文件的顺序pxds洛桑国际管理发展学院是不一样的,那么你可能会遇到不匹配时,您使用读取地面实况图像和相应的标签数据pixelLabelImageDatastore。如果出现这种情况,则重命名像素标签文件,使其具有正确的顺序。例如,重命名'file1.jpg',...,“file9.jpg”'file01.jpg'、……“file09.jpg”

  • 从a中提取语义分割数据真实状况目的是通过将所生成的贴标签机视频,可以使用pixelLabelTrainingData函数。

介绍了R2018a