exponenta event banner

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

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

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

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

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

Подключитесь к камере и загрузите предварительно обученную сеть GoogLeNet. На этом шаге можно использовать любую предварительно подготовленную сеть. В данном примере требуется пакет поддержки MATLAB для веб-камер USB и модель Deep Learning Toolbox™ для сети 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

См. также

| |

Связанные темы