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

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

Используйте MATLAB ®, простую веб-камеру и глубокую нейронную сеть для идентификации объектов в вашем окружении. Этот пример использует GoogLeNet, предварительно обученную глубокую сверточную нейронную сеть (CNN или ConvNet), которая была обучена на более чем миллионе изображений и может классифицировать изображения в 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Можно скачать GoogLeNet и использовать MATLAB, чтобы постоянно обрабатывать изображения с камеры в режиме реального времени.

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

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

Подключитесь к камере и загрузите предварительно обученную сеть GoogLeNet. На этом шаге можно использовать любую предварительно обученную сеть. Для примера требуется MATLAB Support Package для веб-камер USB, и Deep Learning Toolbox™ Model для сети GoogLeNet. Если у вас нет установленных необходимых пакетов поддержки, то программное обеспечение предоставляет ссылку на загрузку.

camera = webcam;
net = googlenet;

Если вы хотите запустить пример снова, сначала запустите команду clear camera где camera - подключение к веб-камере. В противном случае вы увидите ошибку, поскольку не можете создать другое подключение к той же веб-камере.

Классификация снимка с камеры

Чтобы классифицировать изображение, необходимо изменить его размер на вход сигнала сети. Получите первые два элемента InputSize свойство входного слоя изображений сети. Входной слой изображений является первым слоем сети.

inputSize = net.Layers(1).InputSize(1:2)
inputSize =

   224   224

Отобразите изображение с камеры с предсказанной меткой и ее вероятностью. Перед вызовом необходимо изменить размер изображения на размер входа сети classify.

figure
im = snapshot(camera);
image(im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title({char(label),num2str(max(score),2)});

Непрерывная классификация изображений с камеры

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

h = figure;

while ishandle(h)
    im = snapshot(camera);
    image(im)
    im = imresize(im,inputSize);
    [label,score] = classify(net,im);
    title({char(label), num2str(max(score),2)});
    drawnow
end

Отображение верхних предсказаний

Предсказанные классы могут изменяться быстро. Поэтому может быть полезно отобразить верхние предсказания вместе. Можно отобразить пять лучших предсказаний и их вероятностей путем построения классов с самыми высокими счетами прогноза.

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

Создайте окно рисунка. Сначала измените размер окна, увеличив ширину вдвое, и создайте два подграфика.

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

В левой подграфике отобразите изображение и классификацию вместе.

im = snapshot(camera);
image(ax1,im)
im = imresize(im,inputSize);
[label,score] = classify(net,im);
title(ax1,{char(label),num2str(max(score),2)});

Выберите пять лучших предсказаний путем выбора классов с наивысшими счетами.

[~,idx] = sort(score,'descend');
idx = idx(5:-1:1);
classes = net.Layers(end).Classes;
classNamesTop = string(classes(idx));
scoreTop = score(idx);

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

barh(ax2,scoreTop)
xlim(ax2,[0 1])
title(ax2,'Top 5')
xlabel(ax2,'Probability')
yticklabels(ax2,classNamesTop)
ax2.YAxisLocation = 'right';

Постоянно классифицируйте изображения и отображайте верхние предсказания

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

Создайте окно рисунка. Сначала измените размер окна, чтобы иметь вдвое большую ширину, и создайте два подграфика. Чтобы предотвратить изменение размера осей, установите PositionConstraint свойство к 'innerposition'.

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);
ax2.PositionConstraint = 'innerposition';

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

while ishandle(h)
    % Display and classify the image
    im = snapshot(camera);
    image(ax1,im)
    im = imresize(im,inputSize);
    [label,score] = classify(net,im);
    title(ax1,{char(label),num2str(max(score),2)});

    % Select the top five predictions
    [~,idx] = sort(score,'descend');
    idx = idx(5:-1:1);
    scoreTop = score(idx);
    classNamesTop = string(classes(idx));

    % Plot the histogram
    barh(ax2,scoreTop)
    title(ax2,'Top 5')
    xlabel(ax2,'Probability')
    xlim(ax2,[0 1])
    yticklabels(ax2,classNamesTop)
    ax2.YAxisLocation = 'right';

    drawnow
end

См. также

| |

Похожие темы