Создайте и исследуйте Datastore для классификации изображений

В этом примере показано, как создать, читайте и увеличьте datastore изображений для использования в обучении нейронная сеть для глубокого обучения. В частности, этот пример показывает, как создать ImageDatastore объект из набора изображений, считайте и извлеките свойства datastore и создайте augmentedImageDatastore для использования во время обучения.

Создайте Datastore изображений

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

Загрузите данные

Загрузите и извлеките набор данных классификации изображений.

Продовольственный набор данных Изображений В качестве примера содержит фотографии еды в девяти классах (caeser_salad, caprese_salad, french_fries, greek_salad, гамбургер, hot_dog, пицца, сашими и суши).

Загрузите и извлеките Продовольственный набор данных Изображений В качестве примера из https://www.mathworks.com/supportfiles/nnet/data/ExampleFoodImageDataset.zip. Этот набор данных составляет приблизительно 77 Мбайт. В зависимости от вашего интернет-соединения может занять время процесс загрузки. Установите downloadFolder к местоположению данных.

url = "https://www.mathworks.com/supportfiles/nnet/data/ExampleFoodImageDataset.zip";
downloadFolder = tempdir;
filename = fullfile(downloadFolder,'ExampleFoodImageDataset.zip');

dataFolder = fullfile(downloadFolder, "ExampleFoodImageDataset");
if ~exist(dataFolder, "dir")
    fprintf("Downloading Example Food Image data set (77 MB)... ")
    websave(filename,url);
    unzip(filename,dataFolder);
    fprintf("Done.\n")
end

Изображения в этом наборе данных разделены на подпапки для каждого класса.

Создайте datastore изображений из изображений в пути и их подпапках. Используйте имена папок в качестве имен метки.

foodImds = imageDatastore(dataFolder, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Свойства Datastore

Извлеките свойства 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

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

Смотрите также

| | |

Похожие темы