Main Content

augmentedImageDatastore

变换批量以增强图像数据

说明

一个增强图像数据存储可变换为多个批量的训练、验证、测试和预测数据,并可选择性地进行预处理,如调整大小、旋转和翻转。调整图像大小,使其与深度学习网络的输入大小兼容。使用随机化预处理操作增强训练图像数据,以帮助防止网络过拟合和记忆训练图像的具体细节。

要使用增强的图像训练网络,请为 trainnet 函数提供 augmentedImageDatastore。有关详细信息,请参阅预处理图像以进行深度学习

  • 当您使用增强的图像数据存储作为训练图像的数据源时,数据存储会随机扰动每轮的训练数据,因此每轮使用的数据集略有不同。每轮的训练图像的实际数量不变。经过变换的图像不会存储在内存中。

  • imageInputLayer 使用增强的图像的均值而不是原始数据集的均值来归一化图像。对于增强的第一轮训练,将计算一次此均值。所有其他轮训练都使用相同的均值,因此平均图像在训练期间不会更改。

  • 使用增强的图像数据存储对要用于深度学习的图像进行高效预处理,包括调整图像大小。不要使用 ImageDatastore 对象的 ReadFcn 选项。ImageDatastore 允许使用预取功能批量读取 JPG 或 PNG 图像文件。如果您将 ReadFcn 选项设置为自定义函数,则 ImageDatastore 不会预取,并且通常会明显变慢。

默认情况下,augmentedImageDatastore 仅调整图像大小以适应输出大小。您可以使用 imageDataAugmenter 配置其他图像变换的选项。

创建对象

描述

auimds = augmentedImageDatastore(outputSize,imds) 使用图像数据存储 imds 中的图像创建一个用于分类问题的增强图像数据存储,并设置 OutputSize 属性。

auimds = augmentedImageDatastore(outputSize,X,Y) 创建一个用于分类问题和回归问题的增强图像数据存储。数组 X 包含预测变量,数组 Y 包含分类标签或数值响应。

auimds = augmentedImageDatastore(outputSize,X) 创建一个增强图像数据存储,用于预测数组 X 中图像数据的响应。

auimds = augmentedImageDatastore(outputSize,tbl) 创建一个用于分类问题和回归问题的增强图像数据存储。表 tbl 包含预测变量和响应。

auimds = augmentedImageDatastore(outputSize,tbl,responseNames) 创建一个用于分类问题和回归问题的增强图像数据存储。表 tbl 包含预测变量和响应。responseNames 参量指定 tbl 中的响应变量。

auimds = augmentedImageDatastore(___,Name,Value) 通过使用名称-值对组设置 ColorPreprocessingDataAugmentationOutputSizeModeDispatchInBackground 属性,来创建一个增强图像数据存储。您可以指定多个名称-值对组。用引号将每个属性名称引起来。

例如,augmentedImageDatastore([28,28],myTable,'OutputSizeMode','centercrop') 会创建一个从中心裁剪图像的增强图像数据存储。

示例

输入参量

全部展开

图像数据存储,指定为 ImageDatastore 对象。

图像,指定为四维数值数组。前三个维度是高度、宽度和通道,最后一个维度是各个图像的索引。

数据类型: single | double | uint8 | int8 | uint16 | int16 | uint32 | int32

分类或回归的响应,指定为以下项之一:

  • 对于分类问题,Y 是包含图像标签的分类向量。

  • 对于回归问题,Y 可以是:

    • n×r 数值矩阵。n 是观测值数目,r 是响应的数目。

    • h×w×c×n 数值数组。h×w×c 是单个响应的大小,n 是观测值数目。

响应不能包含 NaN

数据类型: categorical | double

输入数据,指定为表。tbl 必须在第一列中包含作为绝对或相对图像路径或图像的预测变量。响应的类型和位置取决于具体问题:

  • 对于分类问题,响应必须为包含图像标签的分类变量。如果在对 augmentedImageDatastore 的调用中没有指定响应变量的名称,则响应必须在第二列中。如果响应在 tbl 的不同列中,则必须使用 responseNames 参量指定响应变量名称。

  • 对于回归问题,响应必须为第一列之后的一列或多列中的数值。响应可以是多列中的标量,也可以是单列中的数值向量或包含数值三维数组的元胞数组。如果您没有指定响应变量的名称,augmentedImageDatastore 将接受 tbl 的其余列作为响应变量。您可以使用 responseNames 参量指定响应变量名称。

响应不能包含 NaN 值。如果预测变量数据中有 NaN,它们将通过训练传播,但在大多数情况下训练将无法收敛。

数据类型: table

输入表中响应变量的名称,指定为以下项之一:

  • 对于具有单个响应的分类或回归任务,responseNames 必须为包含输入表中响应变量的字符向量或字符串标量。

    对于具有多个响应的回归任务,responseNames 必须为包含输入表中响应变量的字符串数组或字符向量元胞数组。

数据类型: char | cell | string

属性

全部展开

对输入的灰度或 RGB 图像执行的预处理颜色操作,指定为 'none''gray2rgb''rgb2gray'。当图像数据存储同时包含灰度图像和 RGB 图像时,请使用 ColorPreprocessing 确保所有输出图像都具有 imageInputLayer 要求的通道数。

当输入图像已具有所需数量的颜色通道时,则不执行颜色预处理操作。例如,如果指定值 'gray2rgb' 并且输入图像已有三个通道,则不会进行颜色预处理。

注意

augmentedImageDatastore 对象使用 rgb2gray 函数将 RGB 图像转换为灰度图像。如果图像有与红色、绿色和蓝色通道不对应的三个通道(例如 L*a*b* 颜色空间中的图像),则使用 ColorPreprocessing 可能会得到较差的结果。

如果输入图像不包含 1 或 3 个通道,例如多光谱或高光谱图像,则不执行颜色预处理操作。在这种情况下,所有输入图像必须具有相同数量的通道。

数据类型: char | string

应用于输入图像的预处理,指定为 imageDataAugmenter 对象或 'none'。当 DataAugmentation'none' 时,不对输入图像应用预处理。

在训练、预测或分类期间在后台调度观测值,指定为 falsetrue。要使用后台调度,您必须有 Parallel Computing Toolbox™。

增强图像数据存储仅在与 trainnet 函数以及推断函数(如 predictminibatchpredict)结合使用时才会执行后台调度。当您直接调用数据存储的 read 函数时,不会发生后台调度。

每个批量中返回的观测值数目。仅在创建数据存储后,才能更改 MiniBatchSize 的值。

指定小批量大小的训练和预测函数(例如 trainingOptionsminibatchpredicttestnet)不设置 MiniBatchSize 属性。为了获得最优性能,请对数据存储使用与训练和预测函数相同的小批量大小。

此 属性 为只读。

增强图像数据存储中的观测值总数。观测值数目是一轮训练的长度。

输出图像的大小,指定为由两个正整数组成的向量。第一个元素指定输出图像中的行数,第二个元素指定列数。

注意

如果通过将图像输出大小指定为三元素向量来创建 augmentedImageDatastore,则数据存储将忽略第三个元素。数据存储会改用 ColorPreprocessing 的值来确定输出图像的维度。例如,如果将 OutputSize 指定为 [28 28 1],但将 ColorPreprocessing 设置为 'gray2rgb',则输出图像的大小为 28×28×3。

用于调整输出图像大小的方法,指定为以下项之一。

  • 'resize' - 使用双线性插值缩放图像以适应输出大小。

    注意

    augmentedImageDatastore 使用具有抗锯齿功能的 imresize 的双线性插值方法。双线性插值能够实现快速图像处理,同时避免最近邻点插值等导致的失真。而 imresize 默认使用带抗锯齿功能的双三次插值生成高质量的经过大小调整的图像,代价是处理时间较长。

  • 'centercrop' - 从训练图像的中心进行裁剪。裁剪大小与输出大小相同。

  • 'randcrop' - 从训练图像中进行随机裁剪。随机裁剪的大小与输出大小相同。

数据类型: char | string

对象函数

combine合并来自多个数据存储的数据
hasdata确定是否有数据可读取
numpartitions数据存储分区数
partition划分数据存储
partitionByIndexPartition augmentedImageDatastore according to indices
preview预览数据存储中的数据子集
readRead data from augmentedImageDatastore
readall读取数据存储中的所有数据
readByIndexRead data specified by index from augmentedImageDatastore
reset将数据存储重置为初始状态
shuffleShuffle data in augmentedImageDatastore
subset创建数据存储或 FileSet 的子集
transform变换数据存储
isPartitionable确定数据存储是否可分区
isShuffleable确定数据存储是否可乱序

示例

全部折叠

使用增强的图像数据训练一个卷积神经网络。数据增强有助于防止网络过拟合和记忆训练图像的具体细节。

加载由手写数字的合成图像组成的样本数据。XTrain 是一个 28×28×1×5000 数组,其中:

  • 28 是图像的高度和宽度。

  • 1 是通道数。

  • 5000 是由手写数字组成的合成图像的数目。

labelsTrain 是包含每个观测值的标签的分类向量。

load DigitsDataTrain

留出 1000 个图像用于网络验证。

idx = randperm(size(XTrain,4),1000);
XValidation = XTrain(:,:,:,idx);
XTrain(:,:,:,idx) = [];
TValidation = labelsTrain(idx);
labelsTrain(idx) = [];

创建一个 imageDataAugmenter 对象,它指定图像增强的预处理选项,如调整大小、旋转、平移和翻转。水平和垂直随机平移图像的最多三个像素,旋转图像角度最多 20 度。

imageAugmenter = imageDataAugmenter( ...
    'RandRotation',[-20,20], ...
    'RandXTranslation',[-3 3], ...
    'RandYTranslation',[-3 3])
imageAugmenter = 
  imageDataAugmenter with properties:

           FillValue: 0
     RandXReflection: 0
     RandYReflection: 0
        RandRotation: [-20 20]
           RandScale: [1 1]
          RandXScale: [1 1]
          RandYScale: [1 1]
          RandXShear: [0 0]
          RandYShear: [0 0]
    RandXTranslation: [-3 3]
    RandYTranslation: [-3 3]

创建一个用于网络训练的 augmentedImageDatastore 对象,并指定图像输出大小。在训练期间,数据存储执行图像增强并调整图像大小。数据存储会增强图像,但不会将任何图像保存到内存中。trainnet 会更新网络参数,然后丢弃增强的图像。

imageSize = [28 28 1];
augimds = augmentedImageDatastore(imageSize,XTrain,labelsTrain,'DataAugmentation',imageAugmenter);

指定卷积神经网络架构。

layers = [
    imageInputLayer(imageSize)
    
    convolution2dLayer(3,8,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,16,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    maxPooling2dLayer(2,'Stride',2)
    
    convolution2dLayer(3,32,'Padding','same')
    batchNormalizationLayer
    reluLayer   
    
    fullyConnectedLayer(10)
    softmaxLayer];

指定训练选项。在选项中进行选择需要经验分析。要通过运行试验探索不同训练选项配置,您可以使用Experiment Manager

opts = trainingOptions('sgdm', ...
    'MaxEpochs',15, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Metrics','accuracy', ...
    'Verbose',false, ...
    'ValidationData',{XValidation,TValidation});

使用 trainnet 函数训练神经网络。对于分类,使用交叉熵损失。默认情况下,trainnet 函数使用 GPU(如果有)。在 GPU 上进行训练需要 Parallel Computing Toolbox™ 许可证和受支持的 GPU 设备。有关受支持设备的信息,请参阅GPU 计算要求 (Parallel Computing Toolbox)。否则,trainnet 函数使用 CPU。要指定执行环境,请使用 ExecutionEnvironment 训练选项。

net = trainnet(augimds,layers,"crossentropy",opts);

提示

  • 通过使用 imtile 函数,您可以在同一图窗中可视化许多变换后的图像。例如,以下代码显示来自名为 auimds 的增强图像数据存储的一个小批量的变换图像。

    minibatch = read(auimds);
    imshow(imtile(minibatch.input))
  • 默认情况下,调整大小是对图像执行的唯一图像预处理操作。通过将 DataAugmentation 名称-值对组参量与 imageDataAugmenter 对象结合使用,启用其他预处理操作。每次从增强图像数据存储中读取图像时,预处理操作的不同随机组合都会应用于每个图像。

版本历史记录

在 R2018a 中推出