В этом примере показано, как создавать, читать и дополнять хранилище данных изображений для использования при обучении сети глубокого обучения. В частности, в этом примере показано, как создать ImageDatastore объект из коллекции изображений, чтение и извлечение свойств хранилища данных и создание augmentedImageDatastore для использования во время обучения.
Использовать imageDatastore объект для управления большой коллекцией изображений, которые не могут полностью поместиться в памяти. Большие коллекции изображений распространены в приложениях для глубокого обучения, которые регулярно включают обучение тысячам помеченных изображений. Эти изображения часто хранятся в папке с вложенными папками, содержащими изображения для каждого класса.

В этом примере используется набор данных Example Food Images, который содержит 978 фотографий продуктов питания девяти классов и имеет размер приблизительно 77 МБ. Загрузить ExampleFoodImageDataset.zip на веб-сайте MathWorks, затем распакуйте файл.
zipFile = matlab.internal.examples.downloadSupportFile('nnet','data/ExampleFoodImageDataset.zip'); filepath = fileparts(zipFile); dataFolder = fullfile(filepath,'ExampleFoodImageDataset'); unzip(zipFile,dataFolder);
Изображения в этом наборе данных разделены на подпапки для каждого класса.

Создайте хранилище данных изображения из изображений в пути и их вложенных папок. Используйте имена папок в качестве имен меток.
foodImds = imageDatastore(dataFolder, ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames');
Извлеките свойства хранилища данных.
Найдите общее количество наблюдений. Этот набор данных имеет 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')

Убедитесь, что данные соответствуют ожиданиям, просматривая случайный выбор изображений из хранилища данных.
numObsToShow = 8; idx = randperm(numObs,numObsToShow); imshow(imtile(foodImds.Files(idx),'GridSize',[2 4],'ThumbnailSize',[100 100]))

Также можно просматривать изображения, принадлежащие определенному классу.
class ="pizza"; idxClass = find(foodImds.Labels == 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
При использовании хранилища данных дополненного изображения в качестве источника обучающих изображений хранилище данных случайным образом возмущает обучающие данные для каждой эпохи, где эпоха является полным прохождением обучающего алгоритма по всему набору обучающих данных. Поэтому каждая эпоха использует несколько другой набор данных, но фактическое количество тренировочных изображений в каждой эпохе не меняется.
Визуализируйте данные дополненного изображения, которые необходимо использовать для обучения сети.
Перетасовка хранилища данных.
augFoodImds = shuffle(augFoodImds);
augmentedImageDatastore объект применяет преобразования при чтении хранилища данных и не сохраняет преобразованные изображения в памяти. Следовательно, каждый раз, когда вы читаете одни и те же изображения, вы видите случайную комбинацию определенных дополнений.
Используйте read для чтения подмножества дополненного хранилища данных.
subset1 = read(augFoodImds);
Сбросьте хранилище данных в его состояние перед повторным вызовом функции чтения и чтения подмножества хранилища данных.
reset(augFoodImds) subset2 = read(augFoodImds);
Отображение двух подмножеств дополненных изображений.
imshow(imtile(subset1.input,'GridSize',[2 4]))
imshow(imtile(subset2.input,'GridSize',[2 4]))
Можно видеть, что в обоих экземплярах отображаются одни и те же изображения с различными преобразованиями. Применение преобразований к изображениям полезно в приложениях глубокого обучения, так как вы можете обучить сеть случайным образом измененным версиям изображения. При этом сеть подвергается различным изменениям изображений из этого класса и позволяет ей научиться классифицировать изображения, даже если они имеют разные визуальные свойства.
После создания объекта хранилища данных используйте приложение Deep Network Designer или trainNetwork функция для обучения сети классификации изображений. Пример см. в разделе Передача обучения с использованием предварительно обученной сети.
Дополнительные сведения о предварительной обработке изображений для приложений глубокого обучения см. в разделе Предварительная обработка изображений для глубокого обучения. Можно также применить более расширенные увеличения, такие как различные уровни яркости или насыщенности, используя transform и combine функции. Дополнительные сведения см. в разделе Хранилища данных для глубокого обучения.
augmentedImageDatastore | Конструктор глубоких сетей | imageDatastore | trainNetwork