В этом примере показано, как классифицировать изображения с веб-камеры в реальном времени с помощью предварительно обученной глубокой сверточной нейронной сети 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