增强像素标签的语义分割
这个例子展示了如何执行常用的图像和像素标签增强,作为语义分割工作流程的一部分。
语义分割训练数据由数字矩阵表示的图像和类别矩阵表示的像素标签图像组成。在扩充训练数据时,必须对图像和相关像素标签应用相同的转换。这个例子演示了三种常见类型的转换:
然后,该示例展示了如何做到这一点将增强应用于数据存储中的语义分割训练数据使用多种类型转换的组合。
您可以使用增强训练数据来训练网络。有关如何训练语义分割网络的示例,请参见基于深度学习的语义分割(计算机视觉工具箱).
为了演示不同类型增强的效果,本例中的每个转换都使用相同的输入图像和像素标签图像。
阅读示例图像。
filenameImage =“kobi.png”;I = imread (filenameImage);
读取像素标签图像。该图像有两个类。
filenameLabels =“kobiPixelLabeled.png”;L = imread (filenameLabels);类= [“地板”,“狗”];Ids = [1 2];
将像素标签图像转换为分类数据类型。
C =分类(L、id、类);
方法在图像上方显示标签labeloverlay
函数。带有“地板”标签的像素有蓝色调,带有“狗”标签的像素有青色调。
B = labeloverlay (C);imshow (B)标题(“原始图像和像素标签”)
调整图像和像素标签的大小
方法可以调整数字图像和分类图像的大小imresize
函数。将图像和像素标签图像调整为相同的大小,并在图像上显示标签。
targetSize = [300 300];resizedI = imresize(我targetSize);resizedC = imresize (C, targetSize);
在调整后的图像上显示调整后的标签。
B = labeloverlay (resizedI resizedC);imshow (B)标题(“调整图像和像素标签”)
裁剪图像和像素标签
裁剪是一个常见的预处理步骤,使数据匹配网络的输入大小。控件来指定裁剪窗口的大小和位置,以创建所需大小的输出图像randomWindow2d
(图像处理工具箱)而且centerCropWindow2d
(图像处理工具箱)功能。确保您选择的裁剪窗口包含图像中所需的内容。然后,将图像和像素标签图像裁剪到同一窗口imcrop
.
指定裁剪区域的所需大小为形式为[的双元素向量高度,宽度]。
targetSize = [300 300];
从图像的中心裁剪图像到目标大小。
赢得= centerCropWindow2d(大小(I), targetSize);croppedI = imcrop(我,赢);croppedC = imcrop (C,赢得);
在裁剪后的图像上显示裁剪后的标签。
B = labeloverlay (croppedI croppedC);imshow (B)标题(“中心裁剪图像和像素标签”)
从图像中的随机位置将图像裁剪到目标大小。
赢得= randomWindow2d(大小(I), targetSize);croppedI = imcrop(我,赢);croppedC = imcrop (C,赢得);
在裁剪后的图像上显示裁剪后的标签。
B = labeloverlay (croppedI croppedC);imshow (B)标题(“随机裁剪图像和像素标签”)
扭曲图像和像素标签
的randomAffine2d
(图像处理工具箱)函数通过旋转、平移、缩放(调整大小)、反射和剪切的组合创建随机二维仿射变换。将变换应用于图像和像素标签图像imwarp
(图像处理工具箱).控件控制扭曲输出的空间边界和分辨率affineOutputView
(图像处理工具箱)函数。
将输入图像和像素标签图像按[-50,50]度范围内随机选择的角度旋转。
tform = randomAffine2d (“旋转”, 50 [-50]);
为扭曲图像和像素标签图像创建一个输出视图。
溃败= affineOutputView(大小(I), tform);
使用imwarp
旋转图像和像素标签图像。
rotatedI = imwarp (tform,我“OutputView”,溃败);rotatedC = imwarp (C tform“OutputView”,溃败);
在旋转的图像上显示旋转的标签。
B = labeloverlay (rotatedI rotatedC);imshow (B)标题(“旋转图像和像素标签”)
增强技术在数据存储中训练数据语义分割中的应用
数据存储是读取和增加图像集合的一种方便方法。创建存储图像和像素标签图像数据的数据存储,并通过一系列多重操作对数据进行扩充。
创建包含图像和像素标签图像数据的数据存储
若要增加示例数据存储的大小,请复制图像和像素标签图像的文件名。
numObservations = 4;trainImages = repelem ({filenameImage} numObservations 1);trainLabels = repelem ({filenameLabels} numObservations 1);
创建一个imageDatastore
从训练图像文件。创建一个pixelLabelDatastore
从训练像素标签文件。数据存储包含相同数据的多个副本。
imd = imageDatastore (trainImages);pxds = pixelLabelDatastore (trainLabels、类id);
通过组合图像数据存储和像素标签数据存储来关联图像和像素标签对。
pxds trainingData =结合(imd);
从组合数据存储中读取第一个图像及其关联的像素标签图像。
data =阅读(trainingData);我={1}数据;C =数据{2};
显示图像和像素标签数据。
B = labeloverlay (C);imshow (B)
应用数据增加
方法对训练数据应用数据增强变换
函数。这个示例对训练数据执行两个单独的扩充。
第一种增强使图像的颜色抖动,然后对图像和像素标签图像对执行相同的随机缩放、水平反射和旋转。中定义了这些操作jitterImageColorAndWarp
Helper函数。
augmentedTrainingData =变换(trainingData @jitterImageColorAndWarp);
读取所有增强数据。
data = readall (augmentedTrainingData);
显示增强图像和像素标签数据。
rgb =细胞(numObservations, 1);为k = 1:numObservations I = data{k,1};C =数据{k, 2};rgb {k} = labeloverlay(我,C);结束蒙太奇(rgb)
第二个增强中心将图像和像素标签图像裁剪为目标大小。中定义了这些操作centerCropImageAndLabel
Helper函数。
targetSize = [800 800];preprocessedTrainingData =变换(augmentedTrainingData,...@(数据)centerCropImageAndLabel(数据、targetSize));
读取所有预处理数据。
data = readall (preprocessedTrainingData);
显示预处理图像和像素标签数据。
rgb =细胞(numObservations, 1);为k = 1:numObservations I = data{k,1};C =数据{k, 2};rgb {k} = labeloverlay(我,C);结束蒙太奇(rgb)
用于扩充的辅助函数
的jitterImageColorAndWarp
辅助函数对图像数据进行随机颜色抖动,然后对图像和像素标签图像数据进行相同的仿射变换。变换由范围[0.8 - 1.5]的比例因子缩放的随机组合、水平反射和范围[- 30,30]度的旋转组成。输入数据
和输出出
为两元素单元格数组,其中第一个元素是图像数据,第二个元素是像素标签图像数据。
函数= jitterImageColorAndWarp(数据)解包原始数据。我={1}数据;C =数据{2};应用随机颜色抖动。我= jitterColorHSV (,“亮度”, 0.3,“对比”, 0.4,“饱和”, 0.2);定义随机仿射变换。tform = randomAffine2d (“规模”(0.8 - 1.5),“XReflection”,真的,“旋转”[-30] 30日);溃败= affineOutputView(大小(I), tform);转换图像和边框标签。augmentedImage = imwarp (tform,我“OutputView”,溃败);augmentedLabel = imwarp (C tform“OutputView”,溃败);返回增强数据。= {augmentedImage, augmentedLabel};结束
的centerCropImageAndLabel
Helper函数以图像为中心创建一个裁剪窗口,然后使用裁剪窗口裁剪图像和像素标签图像。输入数据
和输出出
为两元素单元格数组,其中第一个元素是图像数据,第二个元素是像素标签图像数据。
函数out = centerCropImageAndLabel(data,targetSize) win = centerCropWindow2d(size(data{1}),targetSize);{1} = imcrop(数据{1},赢得);{2} = imcrop(数据{2},赢得);结束
另请参阅
randomAffine2d
(图像处理工具箱)|centerCropWindow2d
(图像处理工具箱)|randomWindow2d
(图像处理工具箱)
相关的例子
更多关于
- 面向领域特定深度学习应用的预处理数据
- 开始使用深度学习进行语义分割(计算机视觉工具箱)