主要内容

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

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

创建映像数据存储

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

下载数据集

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

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

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

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

foodImds = imageDatastore(dataFolder,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

数据存储属性

提取数据存储的属性。

求观察总数。该数据集有978个观测结果,分为9类。

numObs = length(foodImds.Labels)
numObs = 978

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

numObsPerClass = countEachLabel(foodImds)
numObsPerClass =9×2表标签数_____________ _____凯撒沙拉26 caprese沙拉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.)标签== class);idx = randsample(idxClass,numObsToShow);imshow (imtile (foodImds.Files (idx),“GridSize”(2 - 4),“ThumbnailSize”100年[100]));

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

图像增强

增强功能使您能够训练网络不受图像数据失真的影响。例如,您可以向输入图像添加随机旋转,这样网络对旋转的存在是不变的。一个augmentedImageDatastore对象提供了一种方便的方法,将有限的增强集应用于二维图像,以解决分类问题。

定义一个扩充方案。该方案应用[- 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是训练算法在整个训练数据集上的完整传递。因此,每个epoch使用的数据集略有不同,但每个epoch中训练图像的实际数量没有变化。

可视化增强数据

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

洗牌数据存储。

augFoodImds = shuffle(augFoodImds);

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

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

subset1 = read(augFoodImds);

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

reset(augFoodImds) subset2 = read(augFoodImds);

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

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

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

您可以看到,两个实例都显示了相同的图像,但转换不同。对图像进行转换在深度学习应用程序中非常有用,因为您可以用图像的随机更改版本训练网络。这样做可以使网络接触到同一类图像的不同变体,并使它能够学习对图像进行分类,即使它们具有不同的视觉属性。

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

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

另请参阅

|||

相关的话题