exponenta event banner

Классификация категорий изображений с использованием глубокого обучения

В этом примере показано, как использовать предварительно обученную сверточную нейронную сеть (CNN) в качестве экстрактора функций для обучения классификатору категорий изображений.

Обзор

Сверточная нейронная сеть (CNN) - это мощная техника машинного обучения из области глубокого обучения. CNN обучаются с использованием больших коллекций разнообразных изображений. Из этих больших коллекций CNN могут узнать богатые представления функций для широкого спектра изображений. Эти представления элементов часто превосходят такие созданные вручную элементы, как HOG, LBP или SURF. Простой способ использовать силу CNN, не вкладывая время и усилия в обучение, заключается в использовании предварительно обученного CNN в качестве экстрактора функций.

В этом примере изображения из набора данных Flowers [5] классифицируются по категориям с использованием многоклассовой линейной SVM, обученной с использованием функций CNN, извлеченных из изображений. Этот подход к классификации категорий изображений соответствует стандартной практике обучения готового классификатора с использованием функций, извлеченных из изображений. Например, в примере Классификация категорий изображений с использованием пакета элементов используются элементы SURF в структуре пакета элементов для обучения мультиклассного SVM. Отличие здесь состоит в том, что вместо использования элементов изображения, таких как HOG или SURF, элементы извлекаются с помощью CNN .

Примечание.Для этого примера требуются Toolbox™ глубокого обучения, Toolbox™ статистики и машинного обучения и модель Toolbox™ глубокого обучения для ResNet-50 Network.

Для выполнения этого примера настоятельно рекомендуется использовать графический процессор NVIDIA™ с поддержкой CUDA. Для использования графического процессора требуется Toolbox™ параллельных вычислений. Сведения о поддерживаемых вычислительных возможностях см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox).

Загрузить данные изображения

Классификатор категорий будет обучен изображениям из набора данных Flowers [5].

% Location of the compressed data set
url = 'http://download.tensorflow.org/example_images/flower_photos.tgz';

% Store the output in a temporary folder
downloadFolder = tempdir;
filename = fullfile(downloadFolder,'flower_dataset.tgz');

Примечание.Время загрузки данных зависит от вашего подключения к Интернету. Следующий набор команд использует MATLAB для загрузки данных и блокирует MATLAB. Кроме того, с помощью веб-браузера можно сначала загрузить набор данных на локальный диск. Чтобы использовать файл, загруженный из Интернета, измените приведенную выше переменную outputFolder на расположение загруженного файла.

% Uncompressed data set
imageFolder = fullfile(downloadFolder,'flower_photos');

if ~exist(imageFolder,'dir') % download only once
    disp('Downloading Flower Dataset (218 MB)...');
    websave(filename,url);
    untar(filename,downloadFolder)
end

Загрузить изображения

Загрузить набор данных с помощью ImageDatastore для облегчения управления данными. Поскольку ImageDatastore работает с расположениями файлов изображений, изображения не загружаются в память до чтения, что делает его эффективным для использования с большими коллекциями изображений.

imds = imageDatastore(imageFolder, 'LabelSource', 'foldernames', 'IncludeSubfolders',true);

Ниже приведен пример изображения из одной из категорий, включенных в набор данных. Отображаемое изображение - Марио.

% Find the first instance of an image for each category
daisy = find(imds.Labels == 'daisy', 1);

figure
imshow(readimage(imds,daisy))

imds теперь переменная содержит изображения и метки категорий, связанные с каждым изображением. Метки автоматически назначаются из имен папок файлов изображений. Использовать countEachLabel для суммирования количества изображений в каждой категории.

tbl = countEachLabel(imds)
tbl=5×2 table
      Label       Count
    __________    _____

    daisy          633 
    dandelion      898 
    roses          641 
    sunflowers     699 
    tulips         799 

Поскольку imds выше содержится неравное количество изображений по категориям, давайте сначала скорректируем его, чтобы количество изображений в обучающем наборе было сбалансировано.

% Determine the smallest amount of images in a category
minSetCount = min(tbl{:,2}); 

% Limit the number of images to reduce the time it takes
% run this example.
maxNumImages = 100;
minSetCount = min(maxNumImages,minSetCount);

% Use splitEachLabel method to trim the set.
imds = splitEachLabel(imds, minSetCount, 'randomize');

% Notice that each set now has exactly the same number of images.
countEachLabel(imds)
ans=5×2 table
      Label       Count
    __________    _____

    daisy          100 
    dandelion      100 
    roses          100 
    sunflowers     100 
    tulips         100 

Загрузить предварительно обученную сеть

Есть несколько заранее подготовленных сетей, которые приобрели популярность. Большинство из них прошли обучение по набору данных ImageNet, который имеет 1000 категорий объектов и 1,2 миллиона обучающих изображений [1]. «ResNet-50» является одной из таких моделей и может быть загружен с помощью resnet50 функция от Neural Network Toolbox™. Используя resnet50 требует, чтобы вы сначала установили resnet50 (инструментарий глубокого обучения).

% Load pretrained network
net = resnet50();

Другие популярные сети, обучаемые на ImageNet, включают AlexNet, GoogLeNet, VGG-16 и VGG-19 [3], которые можно загрузить с помощью alexnet, googlenet, vgg16, и vgg19 из Toolbox™ глубокого обучения.

Использовать plot для визуализации сети. Так как это большая сеть, настройте окно отображения, чтобы показать только первый раздел.

% Visualize the first section of the network. 
figure
plot(net)
title('First section of ResNet-50')
set(gca,'YLim',[150 170]);

Первый слой определяет входные размеры. Каждый CNN имеет различные требования к размеру ввода. Тот, используемый в этом примере, требует входа изображения, который составляет 224 на 224 на 3.

% Inspect the first layer
net.Layers(1)
ans = 
  ImageInputLayer with properties:

                      Name: 'input_1'
                 InputSize: [224 224 3]

   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: [224×224×3 single]

Промежуточные слои составляют основную часть CNN. Это ряд сверточных слоев, чередующихся с выпрямленными линейными блоками (ReLU) и максимальными слоями пула [2]. За этими слоями следуют 3 полностью соединенных слоя.

Конечный слой - это слой классификации, и его свойства зависят от задачи классификации. В этом примере загруженная модель CNN была обучена решению 1000-сторонней задачи классификации. Таким образом, классификационный слой имеет 1000 классов из набора данных ImageNet.

% Inspect the last layer
net.Layers(end)
ans = 
  ClassificationOutputLayer with properties:

            Name: 'ClassificationLayer_fc1000'
         Classes: [1000×1 categorical]
      OutputSize: 1000

   Hyperparameters
    LossFunction: 'crossentropyex'

% Number of class names for ImageNet classification task
numel(net.Layers(end).ClassNames)
ans = 1000

Обратите внимание, что модель CNN не будет использоваться для первоначальной задачи классификации. Он будет повторно предназначен для решения другой задачи классификации в наборе данных Flowers.

Подготовка наборов обучающих и тестовых изображений

Разбейте наборы на данные обучения и проверки. Выберите 30% изображений из каждого набора для данных обучения, а остальные 70% - для данных проверки. Рандомизируйте разделение, чтобы избежать смещения результатов. Обучающие и тестовые наборы будут обрабатываться моделью CNN.

[trainingSet, testSet] = splitEachLabel(imds, 0.3, 'randomize');

Предварительно обработанные изображения для CNN

Как упоминалось ранее, net может обрабатывать только изображения RGB 224 на 224. Чтобы избежать повторного сохранения всех изображений в этом формате, используйте augmentedImageDatastore для изменения размеров и преобразования любых изображений в оттенках серого в RGB «на лету». augmentedImageDatastore может использоваться для дополнительного увеличения данных, а также для обучения сети.

% Create augmentedImageDatastore from training and test sets to resize
% images in imds to the size required by the network.
imageSize = net.Layers(1).InputSize;
augmentedTrainingSet = augmentedImageDatastore(imageSize, trainingSet, 'ColorPreprocessing', 'gray2rgb');
augmentedTestSet = augmentedImageDatastore(imageSize, testSet, 'ColorPreprocessing', 'gray2rgb');

Извлечение обучающих функций с помощью CNN

Каждый уровень CNN создает отклик или активацию на входное изображение. Однако в CNN имеется только несколько слоев, пригодных для извлечения признаков изображения. Слои в начале сети захватывают основные элементы изображения, такие как края и блобы. Чтобы увидеть это, визуализируйте веса сетевого фильтра из первого сверточного уровня. Это может помочь создать интуицию относительно того, почему функции, извлеченные из CNN, так хорошо работают для задач распознавания изображений. Обратите внимание, что визуализация элементов из более глубоких слоев может быть выполнена с помощью deepDreamImage от Deep Learning Toolbox™.

% Get the network weights for the second convolutional layer
w1 = net.Layers(2).Weights;

% Scale and resize the weights for visualization
w1 = mat2gray(w1);
w1 = imresize(w1,5); 

% Display a montage of network weights. There are 96 individual sets of
% weights in the first layer.
figure
montage(w1)
title('First convolutional layer weights')

Обратите внимание, как первый уровень сети изучил фильтры для захвата элементов больших двоичных объектов и краев. Эти «примитивные» функции затем обрабатываются более глубокими сетевыми уровнями, которые объединяют ранние функции для формирования функций изображения более высокого уровня. Эти функции более высокого уровня лучше подходят для задач распознавания, поскольку они объединяют все примитивные функции в более богатое представление изображения [4].

Можно легко извлечь элементы из одного из более глубоких слоев с помощью activations способ. Выбор одного из выбираемых глубоких слоев является выбором конструкции, но обычно перед началом классификационного слоя он начинается со слоя. В net, этот слой называется «fc1000». Давайте извлекем обучающие возможности с помощью этого слоя.

featureLayer = 'fc1000';
trainingFeatures = activations(net, augmentedTrainingSet, featureLayer, ...
    'MiniBatchSize', 32, 'OutputAs', 'columns');

Обратите внимание, что функция активации автоматически использует графический процессор для обработки, если он доступен, в противном случае используется центральный процессор.

В вышеприведенном коде «MiniBatchSize» установлен на 32, чтобы гарантировать, что CNN и данные изображения помещаются в память GPU. Возможно, потребуется понизить значение MiniBatchSize, если недостаточно памяти для графического процессора. Кроме того, выходные данные активации расположены в виде столбцов. Это помогает ускорить многоклассное линейное обучение SVM, которое следует ниже.

Мультиклассный классификатор SVM с использованием функций CNN

Затем используйте функции изображения CNN для обучения мультиклассного классификатора SVM. Быстрый решатель стохастического градиентного спуска используется для обучения путем установки fitcecoc для функции «Learners» задано значение «Linear». Это помогает ускорить обучение при работе с векторами функций CNN высокой размерности.

% Get training labels from the trainingSet
trainingLabels = trainingSet.Labels;

% Train multiclass SVM classifier using a fast linear solver, and set
% 'ObservationsIn' to 'columns' to match the arrangement used for training
% features.
classifier = fitcecoc(trainingFeatures, trainingLabels, ...
    'Learners', 'Linear', 'Coding', 'onevsall', 'ObservationsIn', 'columns');

Классификатор оценки

Повторите процедуру, использованную ранее для извлечения элементов изображения из testSet. Затем испытательные признаки могут быть переданы в классификатор для измерения точности обученного классификатора.

% Extract test features using the CNN
testFeatures = activations(net, augmentedTestSet, featureLayer, ...
    'MiniBatchSize', 32, 'OutputAs', 'columns');

% Pass CNN image features to trained classifier
predictedLabels = predict(classifier, testFeatures, 'ObservationsIn', 'columns');

% Get the known labels
testLabels = testSet.Labels;

% Tabulate the results using a confusion matrix.
confMat = confusionmat(testLabels, predictedLabels);

% Convert confusion matrix into percentage form
confMat = bsxfun(@rdivide,confMat,sum(confMat,2))
confMat = 5×5

    0.8571    0.0286    0.0286    0.0714    0.0143
    0.0571    0.8286         0    0.0571    0.0571
    0.0143         0    0.7714    0.0714    0.1429
    0.0286    0.0571    0.0571    0.8000    0.0571
         0         0    0.2000    0.0286    0.7714

% Display the mean accuracy
mean(diag(confMat))
ans = 0.8057

Применение обученного классификатора к одному тестовому изображению

Примените обученный классификатор для классификации новых изображений. Прочитайте одно из «ромашечных» тестовых изображений.

testImage = readimage(testSet,1);
testLabel = testSet.Labels(1)
testLabel = categorical
     daisy 

Извлеките элементы изображения с помощью CNN.

% Create augmentedImageDatastore to automatically resize the image when
% image features are extracted using activations.
ds = augmentedImageDatastore(imageSize, testImage, 'ColorPreprocessing', 'gray2rgb');

% Extract image features using the CNN
imageFeatures = activations(net, ds, featureLayer, 'OutputAs', 'columns');

Выполните прогноз с помощью классификатора.

% Make a prediction using the classifier
predictedLabel = predict(classifier, imageFeatures, 'ObservationsIn', 'columns')
predictedLabel = categorical
     daisy 

Ссылки

[1] Дэн, Цзя и др. «Imagenet: крупномасштабная иерархическая база данных изображений». Компьютерное зрение и распознавание образов, 2009. CVPR 2009. Конференция IEEE on. IEEE, 2009.

[2] Крижевский, Алекс, Илья Суцкевер, и Жоффруа Э. Хинтон. «Классификация Imagenet с глубокими сверточными нейронными сетями». Достижения в системах обработки нейронной информации. 2012.

[3] Симоньян, Карен и Эндрю Зиссерман. «Очень глубокие сверточные сети для крупномасштабного распознавания изображений» .arXiv препринт arXiv:1409.1556 (2014).

[4] Донахью, Джефф и др. «Decaf: Функция глубокой сверточной активации для общего визуального распознавания». arXiv preprint arXiv:1310.1531 (2013).

[5] Tensorflow: как переподготовить классификатор изображений для новых категорий.

См. также

| (инструментарий глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (инструментарий для глубокого обучения) | (Панель инструментов для статистики и машинного обучения) | (Набор инструментов для статистики и машинного обучения)

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