В этом примере показано, как использовать предварительно обученную сверточную нейронную сеть (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');Как упоминалось ранее, 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, так хорошо работают для задач распознавания изображений. Обратите внимание, что визуализация элементов из более глубоких слоев может быть выполнена с помощью 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, которое следует ниже.
Затем используйте функции изображения 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: как переподготовить классификатор изображений для новых категорий.
countEachLabel | activations (инструментарий глубокого обучения) | alexnet (инструментарий для глубокого обучения) | classificationLayer (инструментарий для глубокого обучения) | convolution2dLayer (инструментарий для глубокого обучения) | deepDreamImage (инструментарий для глубокого обучения) | fullyConnectedLayer (инструментарий для глубокого обучения) | imageInputLayer (инструментарий для глубокого обучения) | maxPooling2dLayer (инструментарий для глубокого обучения) | predict (инструментарий для глубокого обучения) | reluLayer (инструментарий для глубокого обучения) | confusionmat(Панель инструментов для статистики и машинного обучения) | fitcecoc(Набор инструментов для статистики и машинного обучения)