为深度学习工作流程增强图像
这个例子展示了如何执行常见的随机图像增强,如几何变换、裁剪和添加噪声。
图像处理工具箱功能使您能够实现常见的图像增强样式。这个例子演示了五种常见的转换类型:
接下来的示例将展示如何进行对数据存储中的图像数据应用增强使用多种类型转换的组合。
你可以使用增强训练数据来训练网络。有关使用增强图像训练网络的示例,请参见准备图像到图像回归的数据存储.
读取并显示示例图像。为了比较不同类型图像增强的效果,每个变换都使用相同的输入图像。
imOriginal = imresize(imread(“kobi.png”), 0.25);imshow (imOriginal)
随机图像扭曲变换
的randomAffine2d
(图像处理工具箱)函数从旋转、平移、缩放(调整大小)、反射和剪切的组合中创建一个随机的2-D仿射转换。您可以指定要包含哪些转换以及转换参数的范围。如果将范围指定为2元素数值向量,则randomAffine2d
从指定区间内的均匀概率分布中选择参数的值。要对参数值的范围进行更多控制,可以使用函数句柄指定范围。
控制所创建的扭曲图像的空间边界和分辨率imwarp
(图像处理工具箱)通过使用affineOutputView
(图像处理工具箱)函数。
旋转
创建一个随机旋转转换,将输入图像旋转一个从范围[- 45,45]中随机选择的角度。
tform = randomAffine2d(旋转=[-45 45]);outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView);imshow (imAugmented)
翻译
创建一个转换转换,将输入图像水平和垂直移动从范围[- 50,50]像素中随机选择的距离。
tform = randomAffine2d(XTranslation=[-50 50],YTranslation=[-50 50]);outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView);imshow (imAugmented)
规模
创建一个缩放转换,使用从范围[1.2,1.5]中随机选择的缩放因子来调整输入图像的大小。这种转换在水平和垂直方向上以相同的因素调整图像的大小。
tform = randomAffine2d(Scale=[1.2,1.5]);outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView);imshow (imAugmented)
反射
创建一个反射变换,在每个维度上以50%的概率翻转输入图像。
tform = randomAffine2d(XReflection=true,YReflection=true);outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView);imshow (imAugmented)
剪切
创建一个水平剪切变换,剪切角度从范围[- 30,30]中随机选择。
tform = randomAffine2d(XShear=[-30 30]);outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView);imshow (imAugmented)
使用自定义选择函数控制转换参数的范围
在前面的变换中,变换参数的范围由两元数值向量指定。若要更好地控制转换参数的范围,请指定函数句柄而不是数字向量。函数句柄不接受输入参数,并为每个参数生成有效值。
例如,这段代码从一个离散的90度旋转角度集合中选择一个旋转角度。
角度= 0:90:270;tform = randomAffine2d(旋转=@()角度(randi(4)));outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView);imshow (imAugmented)
控制填充值
当使用几何变换扭曲图像时,输出图像中的像素可以映射到输入图像边界之外的位置。这样的话,imwarp
为输出图像中的像素赋一个填充值。默认情况下,imwarp
选择黑色作为填充值。属性可以更改填充值“FillValues”
名称-值参数。
创建一个随机旋转转换,然后应用该转换并指定一个灰色填充值。
tform = randomAffine2d(旋转=[-45 45]);outputView = affineOutputView(size(imOriginal),tform);imAugmented = imwarp(imOriginal,tform,OutputView= OutputView,...FillValues=[128 128 128]);imshow (imAugmented)
种植的转换
要创建所需大小的输出图像,请使用randomWindow2d
(图像处理工具箱)而且centerCropWindow2d
(图像处理工具箱)功能。请谨慎选择包含图像中所需内容的窗口。
将裁剪区域的所需大小指定为形式为[的2元素向量高度,宽度]。
targetSize = [200,100];
从图像的中心将图像裁剪为目标大小。
win = centerCropWindow2d(size(imOriginal),targetSize);imCenterCrop = imcrop(imOriginal,win);imshow (imCenterCrop)
从图像中的随机位置将图像裁剪为目标大小。
win = randomWindow2d(size(imOriginal),targetSize);imRandomCrop = imcrop(imOriginal,win);imshow (imRandomCrop)
颜色转换
控件可以随机调整彩色图像的色相、饱和度、亮度和对比度jitterColorHSV
(图像处理工具箱)函数。您可以指定包含哪些颜色转换以及转换参数的范围。
您可以使用基本的数学运算随机调整灰度图像的亮度和对比度。
色调抖动
Hue指定颜色的深浅,或颜色在色轮上的位置。当色相从0到1变化时,颜色从红色到黄色、绿色、青色、蓝色、紫色、品红,然后回到红色。色相抖动改变图像中颜色的明显阴影。
通过从范围[0.05,0.15]中随机选择一个小的正偏移量来调整输入图像的色调。曾经是红色的颜色现在变成了橙色或黄色,曾经是橙色的颜色变成了黄色或绿色,等等。
imjitter = jitterColorHSV(imOriginal,Hue=[0.05 0.15]);蒙太奇({imOriginal, imJittered})
饱和抖动
饱和度是颜色的纯度。由于饱和度从0到1不等,色调从灰色(表示所有颜色的混合)到单一的纯色不等。饱和度抖动改变了颜色的暗沉或鲜艳程度。
通过从范围[-0.4,-0.1]中随机选择一个偏移量来调整输入图像的饱和度。当饱和度降低时,输出图像中的颜色显得更加柔和。
imjitter = jitterColorHSV(imOriginal,饱和度=[-0.4 -0.1]);蒙太奇({imOriginal, imJittered})
亮度抖动
亮度是色调的量。当亮度从0到1变化时,颜色从黑到白。亮度抖动改变输入图像的暗度和明度。
通过从范围[-0.3,-0.1]中随机选择一个偏移量调整输入图像的亮度。当亮度降低时,图像看起来更暗。
imjitter = jitterColorHSV(imOriginal,亮度=[-0.3 -0.1]);蒙太奇({imOriginal, imJittered})
对比抖动
对比度抖动随机调整输入图像中最暗和最亮区域之间的差异。
通过从范围[1.2,1.4]中随机选择一个比例因子调整输入图像的对比度。对比度增加,这样阴影变得更暗,高光变得更亮。
imjitter = jitterColorHSV(imOriginal,对比度=[1.2 1.4]);蒙太奇({imOriginal, imJittered})
灰度图像的亮度和对比度抖动
通过使用基本的数学运算,可以将随机化的亮度和对比度抖动应用于灰度图像。
将样本图像转换为灰度。在范围[0.8,1]中指定一个随机的对比度比例因子,在范围[-0.15,0.15]中指定一个随机的亮度偏移。将图像乘以对比度比例因子,然后添加亮度偏移。
imGray = rgb2gray(im2double(imOriginal));对比因子= 1-0.2*rand;brightnessOffset = 0.3*(rand-0.5);imJittered = imGray。*对比度因子+ brightnessOffset;imjitter = im2uint8(imjitter);蒙太奇({imGray, imJittered})
随机Color-to-Grayscale
一种颜色增强随机地从RGB图像中删除颜色信息,同时保留网络预期的通道数量。这段代码显示了一个“随机灰度”转换,其中RGB图像以80%的概率随机转换为三通道输出图像,其中R == G == B。
概率= 0.8;如果rand <= desiredProbability imjitter = repmat(rgb2gray(imOriginal),[1 1 3]);结束imshow (imJittered)
其他图像处理操作
使用变换
函数将图像处理工具箱函数的任何组合应用于输入图像。添加噪声和模糊是深度学习应用中常用的两种图像处理操作。
合成噪声
若要将合成噪声应用于输入图像,请使用imnoise
(图像处理工具箱)函数。您可以指定使用哪种噪声模型,例如高斯噪声、泊松噪声、盐和胡椒噪声以及乘法噪声。您还可以指定噪声的强度。
imSaltAndPepperNoise = imnoise(imOriginal,“盐和胡椒”, 0.1);imGaussianNoise = imnoise(imOriginal,“高斯”);蒙太奇({imSaltAndPepperNoise, imGaussianNoise})
合成模糊
若要将随机高斯模糊应用于图像,请使用imgaussfilt
(图像处理工具箱)函数。你可以指定平滑的数量。
Sigma = 1+5*rand;imblur = imgaussfilt(imOriginal,sigma);imshow (imBlurred)
对数据存储中的图像数据应用增强
在实际的深度学习问题中,图像增强管道通常结合多个操作。数据存储是读取和增加图像集合的一种方便方法。
本节示例展示如何定义数据增强管道,在训练图像分类和图像回归问题的上下文中增强数据存储。
首先,创建一个imageDatastore
其中包含未处理的图像。本例中的图像数据存储包含带标签的数字图像。
digitDatasetPath = fullfile(matlabroot,“工具箱”,“nnet”,...“nndemos”,“nndatasets”,“DigitDataset”);imds = imageDatastore(digitDatasetPath,...IncludeSubfolders = true, LabelSource =“foldernames”);洛桑国际管理发展学院。ReadSize = 6;
图像分类
在图像分类中,分类器应该知道图像的随机修改版本仍然代表相同的图像类。为了增加用于图像分类的数据,在保持相应分类标签不变的情况下增加输入图像就足够了。
使用随机高斯模糊、椒盐噪声和随机缩放和旋转来增强原始图像数据存储中的图像。这些操作在helper函数中定义classificationAugmentationPipeline
在这个例子的最后。方法对训练数据应用数据增强变换
函数。
dsTrain = transform(imds,@classificationAugmentationPipeline,...IncludeInfo = true);
可视化一个来自增强管道的输出示例。
dataPreview =预览(dsTrain);蒙太奇(dataPreview(: 1)标题(用于图像分类的增强图像)
形象回归
用于图像到图像回归的图像增强更为复杂,因为必须对输入图像和响应图像应用相同的几何变换。方法将输入图像和响应图像对关联起来结合
函数。变换每对图像中的一个或两个图像变换
函数。
合并映像数据存储的两个相同副本洛桑国际管理发展学院
.当从组合的数据存储中读取数据时,图像数据以两列单元格数组的形式返回,其中第一列表示网络输入图像,第二列包含网络响应。
dsCombined = combine(imds,imds);montage(preview(dsCombined)',Size=[6 2])增强前的组合输入和响应对)
用一系列图像处理操作增强每对训练图像:
将输入和响应图像调整为32 × 32像素。
只在输入图像中添加盐和胡椒噪声。
创建具有随机缩放和旋转的转换。
对输入和响应图像应用相同的变换。
这些操作在helper函数中定义imageRegressionAugmentationPipeline
在这个例子的最后。方法对训练数据应用数据增强变换
函数。
dsTrain = transform(dsCombined,@imageRegressionAugmentationPipeline);montage(preview(dsTrain)',Size=[6 2])“增强后的组合输入和响应对”)
有关包含训练和评估图像到图像回归网络的完整示例,请参见准备图像到图像回归的数据存储.
金宝app支持功能
的classificationAugmentationPipeline
辅助函数用于增强图像分类。dataIn
而且dataOut
是两元单元格数组,其中第一个元素是网络输入图像,第二个元素是分类标签。
函数[dataOut,info] = classificationAugmentationPipeline(dataIn,info) dataOut = cell([size(dataIn,1),2]);为idx = 1:size(dataIn,1) temp = dataIn{idx};添加随机高斯模糊Temp = imgaussfilt(Temp,1.5*rand);添加盐和胡椒的噪音Temp = imnoise(Temp,“盐和胡椒”);添加随机旋转和缩放tform = randomAffine2d(Scale=[0.95,1.05],Rotation=[-30 30]);outputView = affineOutputView(大小(temp),tform);temp = imwarp(temp,tform,OutputView= OutputView);trainNetwork期望的第二列是期望的响应,%在这种情况下的分类标签dataOut(idx,:) = {temp,info.Label(idx)};结束结束
的imageRegressionAugmentationPipeline
辅助函数为图像到图像的回归增强图像。dataIn
而且dataOut
是两元单元阵列,其中第一个元素是网络输入图像,第二个元素是网络响应图像。
函数dataOut = imageRegressionAugmentationPipeline(dataIn) dataOut = cell([size(dataIn,1),2]);为idx = 1:size(dataIn,1)将图像大小调整为32x32像素,并转换为数据类型单一inputImage = im2single(imresize(dataIn{idx,1},[32 32]));targetImage = im2single(imresize(dataIn{idx,2},[32 32]));添加盐和胡椒的噪音inputImage = imnoise(inputImage“盐和胡椒”);添加随机旋转和缩放tform = randomAffine2d(Scale=[0.9,1.1],Rotation=[-30 30]);outputView = affineOutputView(size(inputImage),tform);使用imwarp和相同的tform和outputView来增强两个图像%同样的inputImage = imwarp(inputImage,tform,OutputView= OutputView);targetImage = imwarp(targetImage,tform,OutputView= OutputView);dataOut(idx,:) = {inputImage,targetImage};结束结束