创建和探索图像分类的数据存储
本示例展示如何创建、读取和增强用于训练深度学习网络的图像数据存储。特别地,这个示例展示了如何创建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
用于训练图像分类网络。有关示例,请参见使用预训练网络的迁移学习.
有关深度学习应用程序预处理图像的更多信息,请参见用于深度学习的图像预处理.属性,还可以应用更高级的增强功能,例如改变亮度或饱和度级别变换
而且结合
功能。有关更多信息,请参见用于深度学习的数据存储.
另请参阅
trainNetwork
|深度网络设计器|augmentedImageDatastore
|imageDatastore