Этот пример показов, как создать, прочитать и увеличить изображение datastore для использования в обучении нейронной сети для глубокого обучения. В частности, в этом примере показано, как создать ImageDatastore
объект из набора изображений, чтение и извлечение свойств datastore и создание 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);
Изображения в этом наборе данных разделяются на подпапки для каждого класса.
Создайте image 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 = find (foodImds.Labels = = класс); idx = randsample (idxClass, numObsToShow); imshow (imtile Файлов (idx),'GridSize',[2 4],'ThumbnailSize',[100 100]));
Чтобы присмотреться к отдельным изображениям в хранилище datastore или папке, используйте приложение Image Browser (Image Processing Toolbox).
Увеличение позволяет вам обучать сети, чтобы быть инвариантными к искажениям в данных изображений. Для примера можно добавить рандомизированные повороты к входным изображениям, так что сеть инвариантна наличию вращения. Система координат augmentedImageDatastore
объект предоставляет удобный способ применения ограниченного набора дополнений к 2-D изображений для задач классификации.
Задайте схему увеличения. Эта схема применяет случайное вращение между [-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
Когда вы используете дополненный image datastore в качестве источника обучающих изображений, datastore случайным образом возмущает обучающие данные для каждой эпохи, где эпоха является полным проходом алгоритма настройки по всему набору обучающих данных. Поэтому каждая эпоха использует несколько другой набор данных, но фактическое количество обучающих изображений в каждой эпохе не меняется.
Визуализируйте данные дополненного изображения, которые вы хотите использовать для обучения сети.
Перетащите datastore.
augFoodImds = shuffle(augFoodImds);
The augmentedImageDatastore
объект применяет преобразования при чтении datastore и не хранит преобразованные изображения в памяти. Следовательно, каждый раз, когда вы читаете одни и те же изображения, вы видите случайную комбинацию заданных увеличений.
Используйте read
функция для чтения подмножества дополненного datastore.
subset1 = read(augFoodImds);
Перед вызовом read и повторным чтением подмножества 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
функций. Для получения дополнительной информации смотрите Datastores для глубокого обучения.
augmentedImageDatastore
| Deep Network Designer | imageDatastore
| trainNetwork