主要内容

增强像素标签的语义分割

这个例子展示了如何执行常见类型的图像和像素标签增强作为语义分割工作流程的一部分。

语义分割训练数据由数字矩阵表示的图像和类别矩阵表示的像素标签图像组成。扩充训练数据时,必须对图像和相关像素标签应用相同的转换。这个例子演示了三种常见的转换类型:

接下来的示例将展示如何进行将增强应用于数据存储中的语义分割训练数据使用多种类型转换的组合。

你可以使用增强训练数据来训练网络。有关如何训练语义分割网络的示例,请参见基于深度学习的语义分割(计算机视觉工具箱)

为了演示不同类型增强的效果,本例中的每个转换都使用相同的输入图像和像素标签图像。

读取一个示例图像。

filenameImage =“kobi.png”;I = imread(filenameImage);

读取像素标签图像。图像有两个类。

filenameLabels =“kobiPixelLabeled.png”;L = imread(filenameLabels);类= [“地板”“狗”];id = [1 2];

将像素标签图像转换为类别数据类型。

C = categorical(L,ids,classes);

控件在图像上显示标签labeloverlay函数。带有“地板”标签的像素有蓝色色调,带有“狗”标签的像素有青色色调。

B = labeloverlay(I,C);imshow (B)标题(“原始图像和像素标签”

图中包含一个轴对象。标题为Original Image和Pixel Labels的axes对象包含一个Image类型的对象。

调整图像和像素标签大小

控件可以调整数字图像和分类图像的大小imresize函数。将图像和像素标签图像调整为相同的大小,并在图像上显示标签。

targetSize = [300 300];resizei = imresize(I,targetSize);resizec = imresize(C,targetSize);

在调整大小的图像上显示调整大小的标签。

B = labeloverlay(resizedI,resizedC);imshow (B)标题(“调整图像大小和像素标签”

图中包含一个轴对象。标题为Resized Image和Pixel Labels的axes对象包含一个Image类型的对象。

裁剪图像和像素标签

裁剪是一个常见的预处理步骤,以使数据匹配网络的输入大小。属性指定裁剪窗口的大小和位置,以创建所需大小的输出图像randomWindow2d(图像处理工具箱)而且centerCropWindow2d(图像处理工具箱)功能。确保您选择的裁剪窗口包含图像中所需的内容。然后,使用将图像和像素标签图像裁剪到同一窗口imcrop

将裁剪区域的所需大小指定为形式为[的两元素向量高度宽度]。

targetSize = [300 300];

从图像的中心将图像裁剪为目标大小。

win = centerCropWindow2d(size(I),targetSize);cropedi = imcrop(I,win);cropedc = imcrop(C,win);

在裁剪的图像上显示裁剪的标签。

B = labeloverlay(croppedI,croppedC);imshow (B)标题(“中心裁剪图像和像素标签”

图中包含一个轴对象。标题为“中心裁剪图像和像素标签”的axis对象包含一个Image类型的对象。

从图像中的随机位置将图像裁剪为目标大小。

win = randomWindow2d(size(I),targetSize);cropedi = imcrop(I,win);cropedc = imcrop(C,win);

在裁剪的图像上显示裁剪的标签。

B = labeloverlay(croppedI,croppedC);imshow (B)标题(“随机裁剪图像和像素标签”

图中包含一个轴对象。标题为“随机裁剪图像和像素标签”的axes对象包含一个类型为Image的对象。

扭曲图像和像素标签

randomAffine2d(图像处理工具箱)函数从旋转、平移、缩放(调整大小)、反射和剪切的组合中创建一个随机的2-D仿射转换。使用将转换应用于图像和像素标签图像imwarp(图像处理工具箱).控件控制扭曲输出的空间边界和分辨率affineOutputView(图像处理工具箱)函数。

旋转输入图像和像素标签图像,从范围[-50,50]中随机选择一个角度。

tform = randomAffine2d(“旋转”, 50 [-50]);

为扭曲图像和像素标签图像创建一个输出视图。

rout = affineOutputView(size(I),tform);

使用imwarp旋转图像和像素标签图像。

rotatedI = imwarp(I,tform,“OutputView”,溃败);rotatedC = imwarp(C,tform,“OutputView”,溃败);

在旋转的图像上显示旋转的标签。

B = labeloverlay(rotateedi,rotatedC);imshow (B)标题(“旋转图像和像素标签”

图中包含一个轴对象。标题为“旋转图像和像素标签”的axis对象包含一个类型为Image的对象。

将增强应用于数据存储中的语义分割训练数据

数据存储是读取和增加图像集合的一种方便方法。创建一个存储图像和像素标签图像数据的数据存储,并使用一系列多重操作扩充数据。

创建包含图像和像素标签图像数据的数据存储

要增加样例数据存储的大小,请复制图像和像素标签图像的文件名。

numObservations = 4;trainImages = repelem({fileameimage},numObservations,1);trainLabels = repelem({filenameLabels},numObservations,1);

创建一个imageDatastore从训练图像文件。创建一个pixelLabelDatastore从训练像素标签文件。数据存储包含相同数据的多个副本。

imds = imageDatastore(trainImages);pxds = pixelLabelDatastore(trainLabels,classes,ids);

通过组合图像数据存储和像素标签数据存储来关联图像和像素标签对。

trainingData = combine(imds,pxds);

从组合数据存储中读取第一个图像及其关联的像素标签图像。

data = read(trainingData);I =数据{1};C =数据{2};

显示图像和像素标签数据。

B = labeloverlay(I,C);imshow (B)

图中包含一个轴对象。axis对象包含一个image类型的对象。

应用数据增强

方法对训练数据应用数据增强变换函数。这个例子对训练数据执行了两个独立的扩充。

第一个增强使图像的颜色抖动,然后对图像和像素标签图像对执行相同的随机缩放、水平反射和旋转。类中定义了这些操作jitterImageColorAndWarp本例末尾的Helper函数。

augmentedTrainingData = transform(trainingData,@jitterImageColorAndWarp);

读取所有增强数据。

data = readall(augmentedTrainingData);

显示增强图像和像素标签数据。

rgb = cell(numObservations,1);k = 1:numObservations I = data{k,1};C = data{k,2};rgb{k} = labeloverlay(I,C);结束蒙太奇(rgb)

图中包含一个轴对象。axis对象包含一个image类型的对象。

第二个增强中心将图像和像素标签图像裁剪为目标大小。类中定义了这些操作centerCropImageAndLabel本例末尾的Helper函数。

targetSize = [800 800];preprocessedTrainingData = transform(augmentedTrainingData,...@(数据)centerCropImageAndLabel(数据、targetSize));

读取所有预处理过的数据。

data = readall(预处理训练数据);

显示预处理图像和像素标签数据。

rgb = cell(numObservations,1);k = 1:numObservations I = data{k,1};C = data{k,2};rgb{k} = labeloverlay(I,C);结束蒙太奇(rgb)

图中包含一个轴对象。axis对象包含一个image类型的对象。

用于增强的辅助函数

jitterImageColorAndWarp辅助函数对图像数据应用随机颜色抖动,然后对图像和像素标签图像数据应用相同的仿射变换。变换由范围为[0.8 - 1.5]的比例因子、水平反射和范围为[- 30,30]度的旋转的随机组合组成。输入数据和输出是两元单元格数组,其中第一个元素是图像数据,第二个元素是像素标签图像数据。

函数输出= jitterImageColorAndWarp(数据)解包原始数据。I =数据{1};C =数据{2};%应用随机颜色抖动。I = jitterColorHSV(I,“亮度”, 0.3,“对比”, 0.4,“饱和”, 0.2);定义随机仿射变换。tform = randomAffine2d(“规模”(0.8 - 1.5),“XReflection”,真的,“旋转”[-30] 30日);rout = affineOutputView(size(I),tform);转换图像和包围框标签。augmentedImage = imwarp(I,tform,“OutputView”,溃败);augmentedLabel = imwarp(C,tform,“OutputView”,溃败);返回增强数据。out = {augmentedImage,augmentedLabel};结束

centerCropImageAndLabelHelper函数创建一个以图像为中心的裁剪窗口,然后使用裁剪窗口裁剪图像和像素标签图像。输入数据和输出是两元单元格数组,其中第一个元素是图像数据,第二个元素是像素标签图像数据。

函数out = centerCropImageAndLabel(data,targetSize) win = centerCropWindow2d(size(data{1}),targetSize);Out {1} = imcrop(数据{1},win);Out {2} = imcrop(数据{2},win);结束

另请参阅

(图像处理工具箱)|(图像处理工具箱)|(图像处理工具箱)

相关的例子

更多关于