exponenta event banner

Создание и изучение хранилища данных для классификации изображений

В этом примере показано, как создавать, читать и дополнять хранилище данных изображений для использования при обучении сети глубокого обучения. В частности, в этом примере показано, как создать 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 функции. Дополнительные сведения см. в разделе Хранилища данных для глубокого обучения.

См. также

| | |

Связанные темы