Классификация изображений с помощью GoogLeNet

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

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

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

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

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

net = googlenet;

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

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

   224   224     3

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

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] Сегеди, Кристиан, Вэй Лю, Янцин Цзи, Пьер Сермане, Скотт Рид, Драгомир Ангуэлов, Думитру Эрхан, Винсент Ванхукке и Эндрю Рабинович. «Все глубже со свертками». В материалах конференции IEEE по компьютерному зрению и распознаванию шаблонов, стр. 1-9. 2015.

См. также

| | | |

Похожие темы