Классифицируйте изображение Используя GoogLeNet

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

GoogLeNet был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа, и затем выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов.

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

Загрузите предварительно обученную сеть GoogLeNet. Этот шаг требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки GoogLeNet. Если у вас нет необходимых пакетов поддержки установленными, то программное обеспечение обеспечивает ссылку на загрузку.

Можно также принять решение загрузить различную предварительно обученную сеть для классификации изображений. Чтобы попробовать различную предварительно обученную сеть, откройте этот пример в MATLAB® и выберите различную сеть. Например, можно попробовать squeezenet, сеть, которая является четной быстрее, чем googlenet. Можно запустить этот пример с другими предварительно обученными сетями. Для списка всех доступных сетей смотрите Предварительно обученные сети Загрузки.

net = googlenet;

Изображение, которое вы хотите классифицировать, должно иметь тот же размер как входной размер сети. Для GoogLeNet, первого элемента Layers свойство сети является входным слоем изображений. Сетевым входным размером является InputSize свойство изображения ввело слой.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   224   224     3

Итоговый элемент Layers свойство является классификацией выходной слой. ClassNames свойство этого слоя содержит имена классов, изученных сетью. Просмотрите 10 случайных имен классов из общего количества 1 000.

classNames = net.Layers(end).ClassNames;
numClasses = numel(classNames);
disp(classNames(randperm(numClasses,10)))
    'papillon'
    'eggnog'
    'jackfruit'
    'castle'
    'sleeping bag'
    'redshank'
    'Band Aid'
    'wok'
    'seat belt'
    'orange'

Считайте и измените размер изображения

Считайте и покажите изображение, что вы хотите классифицировать.

I = imread('peppers.png');
figure
imshow(I)

Отобразите размер изображения. Изображение является 384 512 пикселями и имеет три цветовых канала (RGB).

size(I)
ans = 1×3

   384   512     3

Измените размер изображения к входному размеру сети при помощи imresize. Это изменение размеров немного изменяет соотношение сторон изображения.

I = imresize(I,inputSize(1:2));
figure
imshow(I)

В зависимости от вашего приложения вы можете хотеть изменить размер изображения по-другому. Например, можно обрезать левый верхний угол изображения при помощи I(1:inputSize(1),1:inputSize(2),:). Если у вас есть Image Processing Toolbox™, то можно использовать imcrop функция.

Классифицируйте изображение

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

[label,scores] = classify(net,I);
label
label = categorical
     bell pepper 

Отобразите изображение с предсказанной меткой и предсказанной вероятностью изображения, имеющего ту метку.

figure
imshow(I)
title(string(label) + ", " + num2str(100*scores(classNames == label),3) + "%");

Отобразите главные предсказания

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

[~,idx] = sort(scores,'descend');
idx = idx(5:-1:1);
classNamesTop = net.Layers(end).ClassNames(idx);
scoresTop = scores(idx);

figure
barh(scoresTop)
xlim([0 1])
title('Top 5 Predictions')
xlabel('Probability')
yticklabels(classNamesTop)

Ссылки

[1] Szegedy, христианин, Вэй Лю, Янцин Цзя, Пьер Сермане, Скотт Рид, Драгомир Ангуелов, Dumitru Erhan, Винсент Вэнхук и Эндрю Рэбинович. "Идя глубже со свертками". В Продолжениях конференции по IEEE по компьютерному зрению и распознаванию образов, стр 1-9. 2015.

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

| | | |

Похожие темы