В этом примере показано, как создать, читайте и увеличьте datastore изображений для использования в обучении нейронная сеть для глубокого обучения. В частности, этот пример показывает, как создать ImageDatastore
объект из набора изображений, считайте и извлеките свойства datastore и создайте augmentedImageDatastore
для использования во время обучения.
Используйте imageDatastore
объект управлять большим количеством изображений, которые не могут в целом уместиться в памяти. Большое количество изображений распространено в применении глубокого обучения, которое регулярно включает обучение на тысячах помеченных изображений. Эти изображения часто хранятся в папке с подпапками, содержащими изображения для каждого класса.
Этот пример использует Продовольственный набор данных Изображений В качестве примера, который содержит 978 фотографий еды в девяти классах и составляет приблизительно 77 Мбайт в размере. Загрузите ExampleFoodImageDataset.zip
файл от веб-сайта MathWorks, затем разархивируйте файл.
zipFile = matlab.internal.examples.downloadSupportFile('nnet','data/ExampleFoodImageDataset.zip'); filepath = fileparts(zipFile); dataFolder = fullfile(filepath,'ExampleFoodImageDataset'); unzip(zipFile,dataFolder);
Изображения в этом наборе данных разделены на подпапки для каждого класса.
Создайте datastore изображений из изображений в пути и их подпапках. Используйте имена папок в качестве имен метки.
foodImds = imageDatastore(dataFolder, ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames');
Извлеките свойства datastore.
Найдите общее количество наблюдений. Этот набор данных имеет 978 разделений наблюдений в девять классов.
numObs = length(foodImds.Labels)
numObs = 978
Найдите количество наблюдений в классе. Вы видите, что этот набор данных не содержит равное количество наблюдений в каждом классе.
numObsPerClass = countEachLabel(foodImds)
numObsPerClass=9×2 table
Label Count
_____________ _____
caesar_salad 26
caprese_salad 15
french_fries 181
greek_salad 24
hamburger 238
hot_dog 31
pizza 299
sashimi 40
sushi 124
Можно также визуализировать распределение меток класса с помощью гистограммы.
histogram(foodImds.Labels) set(gca,'TickLabelInterpreter','none')
Проверяйте, что данные как ожидалось путем просмотра случайного выбора изображений от datastore.
numObsToShow = 8; idx = randperm(numObs,numObsToShow); imshow(imtile(foodImds.Files(idx),'GridSize',[2 4],'ThumbnailSize',[100 100]))
Можно также просмотреть изображения, которые принадлежат определенному классу.
class = "pizza"; idxClass = находят (foodImds.Labels == класс); idx = randsample (idxClass, numObsToShow); imshow (imtile (foodImds.Files (idx),'GridSize',[2 4],'ThumbnailSize',[100 100]));
Чтобы более тщательно изучить в отдельных изображениях в вашем datastore или папке, используйте Image Browser (Image Processing Toolbox) приложение.
Увеличение позволяет вам обучить нейронные сети, чтобы быть инвариантными к искажениям в данных изображения. Например, можно добавить рандомизированные вращения, чтобы ввести изображения так, чтобы сеть была инвариантной к присутствию вращения. augmentedImageDatastore
объект обеспечивает удобный способ применить ограниченный набор увеличений к 2D изображениям для проблем классификации.
Задайте схему увеличения. Эта схема применяет случайное вращение между [–90,90] степени и случайное масштабирование между [1,2]. Увеличенный datastore автоматически изменяет размер изображений к inputSize
значение во время обучения.
imageAugmenter = imageDataAugmenter( ... 'RandRotation',[-90 90], ... 'RandScale',[1 2]); inputSize = [100 100];
Используя схему увеличения, задайте увеличенный datastore изображений.
augFoodImds = augmentedImageDatastore(inputSize,foodImds, ... 'DataAugmentation',imageAugmenter);
Увеличенный datastore содержит то же количество изображений как datastore оригинального изображения.
augFoodImds.NumObservations
ans = 978
Когда вы используете увеличенный datastore изображений в качестве источника учебных изображений, datastore случайным образом тревожит обучающие данные в течение каждой эпохи, где эпоха является всей передачей алгоритма настройки по целому обучающему набору данных. Поэтому каждая эпоха использует немного отличающийся набор данных, но фактическое количество учебных изображений в каждую эпоху не изменяется.
Визуализируйте увеличенные данные изображения, которые вы хотите использовать, чтобы обучить сеть.
Переставьте datastore.
augFoodImds = shuffle(augFoodImds);
augmentedImageDatastore
объект применяет преобразования при чтении datastore и не хранит преобразованные изображения в памяти. Следовательно, каждый раз, когда вы читаете те же изображения, вы видите случайную комбинацию заданных увеличений.
Используйте read
функционируйте, чтобы считать подмножество увеличенного datastore.
subset1 = read(augFoodImds);
Сбросьте datastore к его состоянию прежде, чем вызвать чтение и считайте подмножество datastore снова.
reset(augFoodImds) subset2 = read(augFoodImds);
Отобразите два подмножества увеличенных изображений.
imshow(imtile(subset1.input,'GridSize',[2 4]))
imshow(imtile(subset2.input,'GridSize',[2 4]))
Вы видите, что оба экземпляра показывают те же изображения с различными преобразованиями. Применение преобразований к изображениям полезно в применении глубокого обучения, когда можно обучить сеть на случайным образом измененных версиях изображения. Выполнение так отсоединяет сеть различным изменениям изображений от того класса и позволяет ему учиться классифицировать изображения, даже если у них есть различные визуальные свойства.
После создания вашего объекта datastore используйте приложение Deep Network Designer или trainNetwork
функция, чтобы обучить сеть классификации изображений. Для примера смотрите, что Передача обучения Использует Предварительно обученную сеть.
Для получения дополнительной информации о предварительной обработке изображений для применения глубокого обучения смотрите, Предварительно обрабатывают Изображения для Глубокого обучения. Можно также применить более усовершенствованные увеличения, такие как различные уровни яркости или насыщения, при помощи transform
и combine
функции. Для получения дополнительной информации смотрите Хранилища данных для Глубокого обучения.
augmentedImageDatastore
| Deep Network Designer | imageDatastore
| trainNetwork