主要内容

创建和探索图像分类的数据存储

本示例展示如何创建、读取和增强用于训练深度学习网络的图像数据存储。特别地,这个示例展示了如何创建ImageDatastore对象从图像集合中读取并提取数据存储的属性,然后创建augmentedImageDatastore训练时使用。

创建镜像数据存储

使用一个imageDatastore对象来管理无法完全装入内存的大量图像集合。大量的图像集合在深度学习应用程序中很常见,通常涉及对数千个标记图像进行训练。这些图像通常存储在一个文件夹中,每个类的子文件夹包含图像。

下载数据集

本示例使用示例Food Images数据集,其中包含9个类别的978张食物照片,大小约为77 MB。下载ExampleFoodImageDataset.zip文件从MathWorks网站,然后解压缩文件。

zipFile = matlab.internal.examples.download万博1manbetxSupportFile(“nnet”“数据/ ExampleFoodImageDataset.zip”);filepath = fileparts(zipFile);dataFolder = fullfile(文件路径,“ExampleFoodImageDataset”);解压缩(zipFile dataFolder);

这个数据集中的图像被划分为每个类的子文件夹。

从路径中的图像及其子文件夹创建图像数据存储。使用文件夹名称作为标签名称。

foodImds = imageDatastore(数据文件夹,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

数据存储属性

提取数据存储的属性。

求观测值的总数。该数据集有978个观测值,分为9类。

numObs = length(foodImds.Labels)
numObs = 978

找出每个类的观察数。您可以看到,这个数据集在每个类中包含的观测值数量并不相等。

numObsPerClass = countEachLabel(foodImds)
numObsPerClass =9×2表标签计数_____________ _____凯撒沙拉26卡普里塞沙拉15法国薯条181希腊沙拉24汉堡238热狗31披萨299生鱼片40寿司124

您还可以使用直方图来可视化类标签的分布。

直方图(foodImds.Labels)组(gca,“TickLabelInterpreter”“没有”

探索数据存储

通过从数据存储中查看随机选择的图像来检查数据是否符合预期。

numObsToShow = 8;idx = randperm(numObs,numObsToShow);imshow (imtile (foodImds.Files (idx),“GridSize”(2 - 4),“ThumbnailSize”100年[100]))

您还可以查看属于特定类的图像。

类=“披萨”;idxClass = find(foodImds. find)标签== class);idx = randsample(idxClass,numObsToShow);imshow (imtile (foodImds.Files (idx),“GridSize”(2 - 4),“ThumbnailSize”100年[100]));

若要更详细地查看数据存储或文件夹中的各个映像,请使用图片浏览器(图像处理工具箱)应用程序。

图像增强

增强使您能够训练网络,使其对图像数据的扭曲不变性。例如,您可以向输入图像添加随机旋转,以便网络对旋转的存在是不变的。一个augmentedImageDatastore对象提供了一种方便的方法,将有限的增强集应用到2-D图像,用于分类问题。

定义一个增强方案。该方案应用了[- 90,90]度之间的随机旋转和[1,2]度之间的随机缩放。增强的数据存储自动将映像的大小调整为inputSize培训中的价值。

imageAugmenter = imageDataAugmenter(...“RandRotation”(-90 90),...“RandScale”[1, 2]);inputSize = [100 100];

使用增强方案,定义增强图像数据存储。

augFoodImds = augmentedImageDatastore(inputSize,foodImds,...“DataAugmentation”, imageAugmenter);

增强的数据存储包含与原始图像数据存储相同数量的图像。

augFoodImds。NumObservations
Ans = 978

当您使用增强图像数据存储作为训练图像的来源时,数据存储随机扰动每个历元的训练数据,其中一个历元是训练算法对整个训练数据集的完整传递。因此,每个epoch使用的数据集略有不同,但每个epoch的训练图像的实际数量不会改变。

可视化增强数据

可视化您希望用于训练网络的增强图像数据。

Shuffle数据存储。

augFoodImds = shuffle(augFoodImds);

augmentedImageDatastore对象在读取数据存储时应用转换,而不将转换后的图像存储在内存中。因此,每次读取相同的图像时,都会看到定义的增强的随机组合。

使用函数读取增强数据存储的子集。

subset1 = read(augFoodImds);

在再次调用read和read数据存储的一个子集之前,将数据存储重置为其状态。

reset(augFoodImds) subset2 = read(augFoodImds);

显示增强图像的两个子集。

imshow (imtile (subset1.input,“GridSize”, (2 - 4)))

imshow (imtile (subset2.input,“GridSize”, (2 - 4)))

您可以看到,这两个实例都显示了使用不同转换的相同图像。在深度学习应用程序中,对图像应用转换是很有用的,因为你可以在随机改变的图像版本上训练网络。这样做将网络暴露给该类图像的不同变体,并使其能够学习对图像进行分类,即使它们具有不同的视觉属性。

创建数据存储对象后,使用深度网络设计器应用程序或trainNetwork用于训练图像分类网络。有关示例,请参见使用预训练网络的迁移学习

有关深度学习应用程序预处理图像的更多信息,请参见用于深度学习的图像预处理.属性,还可以应用更高级的增强功能,例如改变亮度或饱和度级别变换而且结合功能。有关更多信息,请参见用于深度学习的数据存储

另请参阅

|||

相关的话题