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

Этот пример показывает, как извлечь признаки выученного изображения из предварительно обученной сверточной нейронной сети и использовать эти функции для обучения классификатора изображений. Редукция данных является самым простым и быстрым способом использования репрезентативной степени предварительно обученных глубоких сетей. Для примера можно обучить машину опорных векторов (SVM), используя fitcecoc (Statistics and Machine Learning Toolbox™) на извлеченных функциях. Поскольку редукция данных требуется только один проход через данные, это хорошая начальная точка, если у вас нет графический процессор, чтобы ускорить обучение сети с.

Загрузка данных

Разархивируйте и загружайте образцы изображений как image datastore. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные как ImageDatastore объект. image datastore позволяет хранить большие данные изображений, включая данные, которые не помещаются в памяти. Разделите данные на 70% обучающих и 30% тестовых данных.

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

Теперь в этом очень маленьком наборе данных 55 обучающих изображений и 20 изображений для валидации. Отобразите некоторые образцовые изображения.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

Figure contains 16 axes. Axes 1 contains an object of type image. Axes 2 contains an object of type image. Axes 3 contains an object of type image. Axes 4 contains an object of type image. Axes 5 contains an object of type image. Axes 6 contains an object of type image. Axes 7 contains an object of type image. Axes 8 contains an object of type image. Axes 9 contains an object of type image. Axes 10 contains an object of type image. Axes 11 contains an object of type image. Axes 12 contains an object of type image. Axes 13 contains an object of type image. Axes 14 contains an object of type image. Axes 15 contains an object of type image. Axes 16 contains an object of type image.

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

Загрузка предварительно обученной ResNet-18 сети. Если пакет Deep Learning Toolbox Model для ResNet-18 Network поддержки не установлен, то программное обеспечение предоставляет ссылку загрузки. ResNet-18 обучается на более чем миллионе изображений и может классифицировать изображения в 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате модель получила богатые представления функций для широкой области значений изображений.

net = resnet18
net = 
  DAGNetwork with properties:

         Layers: [71x1 nnet.cnn.layer.Layer]
    Connections: [78x2 table]
     InputNames: {'data'}
    OutputNames: {'ClassificationLayer_predictions'}

Анализ сетевой архитектуры. Первый слой, входной слой для изображений, требует входа изображений размера 224 224 3, где 3 количество цветовых каналов.

inputSize = net.Layers(1).InputSize;
analyzeNetwork(net)

Извлечение функций изображения

Сеть требует изображений входа размера 224 на 224 на 3, но у изображений в хранилищах данных изображения есть различные размеры. Чтобы автоматически изменить размер обучающих и тестовых изображений перед их вводом в сеть, создайте дополненные хранилища данных изображений, укажите необходимый размер изображения и используйте эти хранилища данных в качестве входных параметров для activations.

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

Сеть создает иерархическое представление входа изображений. Более глубокие слои содержат функции более высокого уровня, созданные с использованием функций более низкого уровня более ранних слоев. Чтобы получить представления функций обучающих и тестовых изображений, используйте activations на слое глобального объединения, 'pool5', в конце сети. Глобальный слой объединения объединяет входные функции во всех пространственных местоположениях, получая в общей сложности 512 признаков.

layer = 'pool5';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

whos featuresTrain
  Name                Size              Bytes  Class     Attributes

  featuresTrain      55x512            112640  single              

Извлеките метки классов из обучающих и тестовых данных.

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

Классификатор подгонки изображений

Используйте функции, извлеченную из обучающих изображений, как переменные-предикторы и подбирайте мультикласс машины опорных векторов (SVM), используя fitcecoc (Statistics and Machine Learning Toolbox).

classifier = fitcecoc(featuresTrain,YTrain);

Классификация тестовых изображений

Классифицируйте тестовые изображения с помощью обученной модели SVM с помощью функций, извлеченной из тестовых изображений.

YPred = predict(classifier,featuresTest);

Отобразите четыре выборочных тестовых изображения с их предсказанными метками.

idx = [1 5 10 15];
figure
for i = 1:numel(idx)
    subplot(2,2,i)
    I = readimage(imdsTest,idx(i));
    label = YPred(idx(i));
    imshow(I)
    title(char(label))
end

Figure contains 4 axes. Axes 1 with title MathWorks Cap contains an object of type image. Axes 2 with title MathWorks Cube contains an object of type image. Axes 3 with title MathWorks Playing Cards contains an object of type image. Axes 4 with title MathWorks Screwdriver contains an object of type image.

Вычислите точность классификации на тестовом наборе. Точность является частью меток, которые сеть предсказывает правильно.

accuracy = mean(YPred == YTest)
accuracy = 1

Классификатор train по функциям

Можно также извлечь функции из более раннего слоя сети и обучить классификатор этих функций. Более ранние слои обычно извлекают меньше, более мелкие функции, имеют более высокое пространственное разрешение и большее общее количество активаций. Извлеките функции из 'res3b_relu' слой. Это конечный слой, который выходы 128 функций и активации имеют пространственный размер 28 на 28.

layer = 'res3b_relu';
featuresTrain = activations(net,augimdsTrain,layer);
featuresTest = activations(net,augimdsTest,layer);
whos featuresTrain
  Name                Size                      Bytes  Class     Attributes

  featuresTrain      28x28x128x55            22077440  single              

Извлечённые функции, используемые в первой части этого примера, были объединены во все пространственные местоположения слоем глобального объединения. Чтобы достичь того же результата при извлечении функций в более ранних слоях, вручную усредняйте активации по всем пространственным местоположениям. Чтобы получить функции в форме N-by-C, где N - количество наблюдений, а C - количество функций, удалите синглтонные размерности и транспонируйте.

featuresTrain = squeeze(mean(featuresTrain,[1 2]))';
featuresTest = squeeze(mean(featuresTest,[1 2]))';
whos featuresTrain
  Name                Size             Bytes  Class     Attributes

  featuresTrain      55x128            28160  single              

Обучите классификатор SVM более мелким функциям. Вычислите точность теста.

classifier = fitcecoc(featuresTrain,YTrain);
YPred = predict(classifier,featuresTest);
accuracy = mean(YPred == YTest)
accuracy = 0.9500

Оба обученных SVM имеют высокую точность. Если точность недостаточно высока с помощью редукции данных, попробуйте перенести обучение вместо этого. Для получения примера смотрите Train Нейронной сети для глубокого обучения для классификации новых изображений. Список и сравнение предварительно обученных сетей смотрите в Pretrained Deep Neural Networks.

См. также

| (Statistics and Machine Learning Toolbox)

Похожие темы