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