В этом примере показано, как выполнить генерацию кода для приложения классификации изображений, которое использует глубокое обучение. Это использует codegen
команда, чтобы сгенерировать MEX-функцию, которая запускает прогноз при помощи сетей классификации изображений, таких как MobileNet-v2, ResNet и GoogLeNet.
CUDA® включил NVIDIA®, графический процессор с вычисляет возможность 3.2 или выше.
NVIDIA инструментарий CUDA и драйвер.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек, смотрите Сторонние продукты (GPU Coder). Для подготовки переменных окружения смотрите Подготовку Необходимых как условие продуктов (GPU Coder).
Интерфейс 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;