В этом примере показано, как выполнить генерацию кода для приложения классификации изображений, которое использует глубокое обучение. Это использует codegen
команда, чтобы сгенерировать MEX-функцию, которая запускает прогноз при помощи сетей классификации изображений, таких как MobileNet-v2, ResNet и GoogLeNet.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты. Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов.
Интерфейс GPU Coder для Библиотек Глубокого обучения поддерживает пакет. Чтобы установить этот пакет поддержки, используйте Add-On Explorer.
Используйте coder.checkGpuInstall
функция, чтобы проверить, что компиляторы и библиотеки, необходимые для выполнения этого примера, настраиваются правильно.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
mobilenetv2_predict
Функция точки входаMobileNet-v2 является сверточной нейронной сетью, которая обучена больше чем на миллионе изображений от базы данных ImageNet. Сеть является 155 слоями глубоко и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. Сеть имеет входной размер изображений 224 224. Используйте analyzeNetwork
функционируйте, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.
net = mobilenetv2(); analyzeNetwork(net);
mobilenetv2_predict.m функция точки входа берет вход изображений и запускает прогноз на изображении с помощью предварительно обученной сверточной нейронной сети MobileNet-v2. Функция использует постоянный объект mynet, чтобы загрузить серийный сетевой объект и снова использует персистентный объект для прогноза на последующих вызовах.
type('mobilenetv2_predict.m')
% Copyright 2017-2019 The MathWorks, Inc. function out = mobilenetv2_predict(in) %#codegen persistent mynet; if isempty(mynet) mynet = coder.loadDeepLearningNetwork('mobilenetv2','mobilenetv2'); end % pass in input out = mynet.predict(in);
Сгенерировать код CUDA для mobilenetv2_predict
функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig
функция, чтобы создать CuDNN
объект настройки глубокого обучения и присвоение это к DeepLearningConfig
свойство объекта настройки графического процессора кода. Запустите codegen
команда и задает входной размер [224,224,3]. Это значение соответствует входному размеру слоя сети MobileNet-v2.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg mobilenetv2_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/mobilenetv2_predict/html/report.mldatx').
Серийная сеть сгенерирована, как класс C++, содержащий массив 155 классов слоя и функций, чтобы настроить, вызовите, предсказывают и очищают сеть.
class b_mobilenetv2_0 { .... public: b_mobilenetv2_0(); void setup(); void predict(); void cleanup(); ~b_mobilenetv2_0(); };
setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. predict()
метод выполняет прогноз для каждого из этих 155 слоев в сети.
Функция точки входа mobilenetv2_predict()
в файле сгенерированного кода mobilenetv2_predict.cu
создает статический объект b_mobilenetv2 типа класса и вызывает настройку, и предскажите на этом сетевом объекте.
static b_mobilenetv2_0 mynet; static boolean_T mynet_not_empty;
/* Function Definitions */ void mobilenetv2_predict(const real_T in[150528], real32_T out[1000]) { if (!mynet_not_empty) { DeepLearningNetwork_setup(&mynet); mynet_not_empty = true; }
/* pass in input */ DeepLearningNetwork_predict(&mynet, in, out); }
Двоичные файлы экспортируются для слоев параметрами такой, как полностью соединено и слои свертки в сети. Например, файлы cnn_mobilenetv2_conv* _ w и cnn_mobilenetv2_conv* _ b соответствуют весам и смещают параметры для слоев свертки в сети. Чтобы видеть список сгенерированных файлов, используйте:
dir(fullfile(pwd, 'codegen', 'mex', 'mobilenetv2_predict'))
Загрузите входное изображение.
im = imread('peppers.png');
imshow(im);
Вызовите mobilenetv2_predict_mex
на входном изображении.
im = imresize(im, [224,224]); predict_scores = mobilenetv2_predict_mex(double(im));
Получите лучшие пять баллов прогноза и их метки.
[scores,indx] = sort(predict_scores, 'descend'); classNames = net.Layers(end).ClassNames; classNamesTop = classNames(indx(1:5)); h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,scores(5:-1:1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top Five Predictions That Use MobileNet-v2')
Включенная функция помощника mobilenet_live.m системы координат захватов от веб-камеры, выполняет прогноз и отображает результаты классификации на каждом из полученных видеокадров. Этот пример использует функцию, которая поддерживается MATLAB® Support Package для USB Webcams™. Можно загрузить и установить пакет поддержки через Инсталлятор Пакета Поддержки.
type('mobilenet_live.m')
% Copyright 2017-2019 The MathWorks, Inc. function mobilenet_live % Connect to a camera camera = webcam; % The labels with top 5 prediction scores are % mapped to corresponding labels net = mobilenetv2(); classnames = net.Layers(end).ClassNames; imfull = zeros(224,400,3, 'uint8'); fps = 0; ax = axes; while true % Take a picture ipicture = camera.snapshot; % Resize and cast the picture to single picture = imresize(ipicture,[224,224]); % Call MEX function for MobileNet-v2 prediction tic; pout = mobilenetv2_predict(single(picture)); newt = toc; % fps fps = .9*fps + .1*(1/newt); % top 5 scores [top5labels, scores] = getTopFive(pout,classnames); % display if isvalid(ax) dispResults(ax, imfull, picture, top5labels, scores, fps); else break; end end end function dispResults(ax, imfull, picture, top5labels, scores, fps) for k = 1:3 imfull(:,177:end,k) = picture(:,:,k); end h = imshow(imfull, 'InitialMagnification',200, 'Parent', ax); scol = 1; srow = 20; text(get(h, 'Parent'), scol, srow, sprintf('MobileNet-v2 Demo'), 'color', 'w', 'FontSize', 20); srow = srow + 20; text(get(h, 'Parent'), scol, srow, sprintf('Fps = %2.2f', fps), 'color', 'w', 'FontSize', 15); srow = srow + 20; for k = 1:5 t = text(get(h, 'Parent'), scol, srow, top5labels{k}, 'color', 'w','FontSize', 15); pos = get(t, 'Extent'); text(get(h, 'Parent'), pos(1)+pos(3)+5, srow, sprintf('%2.2f%%', scores(k)), 'color', 'w', 'FontSize', 15); srow = srow + 20; end drawnow; end function [labels, scores] = getTopFive(predictOut,classnames) [val,indx] = sort(predictOut, 'descend'); scores = val(1:5)*100; labels = classnames(indx(1:5)); end
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;
Можно также использовать сеть DAG ResNet-50 в классификации изображений. Предварительно обученная модель ResNet-50 для MATLAB доступна в пакете поддержки ResNet-50 Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB).
net = resnet50; disp(net)
DAGNetwork with properties: Layers: [177×1 nnet.cnn.layer.Layer] Connections: [192×2 table] InputNames: {'input_1'} OutputNames: {'ClassificationLayer_fc1000'}
Чтобы сгенерировать код CUDA для resnet_predict.m функции точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Эта точка входа вызовы функции resnet50
функционируйте, чтобы загрузить сеть и выполнить прогноз на входном изображении.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg resnet_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/resnet_predict/html/report.mldatx').
Вызовите resnet_predict_mex
на входном изображении.
predict_scores = resnet_predict_mex(double(im));
Получите лучшие пять баллов прогноза и их метки.
[scores,indx] = sort(predict_scores, 'descend'); classNames = net.Layers(end).ClassNames; classNamesTop = classNames(indx(1:5)); h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,scores(5:-1:1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top Five Predictions That Use ResNet-50')
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;
Предварительно обученная модель GoogLeNet для MATLAB доступна в пакете поддержки GoogLeNet Deep Learning Toolbox. Чтобы загрузить и установить пакет поддержки, используйте Add-On Explorer. Чтобы узнать больше о нахождении и установке дополнений, смотрите, Получают Дополнения (MATLAB).
net = googlenet; disp(net)
DAGNetwork with properties: Layers: [144×1 nnet.cnn.layer.Layer] Connections: [170×2 table] InputNames: {'data'} OutputNames: {'output'}
Сгенерируйте код CUDA для googlenet_predict.m функции точки входа. Эта точка входа вызовы функции googlenet
функционируйте, чтобы загрузить сеть и выполнить прогноз на входном изображении. Чтобы сгенерировать код для этой функции точки входа, создайте объект настройки графического процессора для цели MEX.
cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); codegen -config cfg googlenet_predict -args {ones(224,224,3)} -report
Code generation successful: To view the report, open('codegen/mex/googlenet_predict/html/report.mldatx').
Вызовите googlenet_predict_mex
на входном изображении.
im = imresize(im, [224,224]); predict_scores = googlenet_predict_mex(double(im));
Получите лучшие пять баллов прогноза и их метки.
[scores,indx] = sort(predict_scores, 'descend'); classNames = net.Layers(end).ClassNames; classNamesTop = classNames(indx(1:5)); h = figure; h.Position(3) = 2*h.Position(3); ax1 = subplot(1,2,1); ax2 = subplot(1,2,2); image(ax1,im); barh(ax2,scores(5:-1:1)) xlabel(ax2,'Probability') yticklabels(ax2,classNamesTop(5:-1:1)) ax2.YAxisLocation = 'right'; sgtitle('Top Five Predictions That Use GoogLeNet')
Очистите статический сетевой объект, который загрузился в памяти.
clear mex;