В этом примере показано, как выполнить генерацию кода для приложения классификации изображений, которое использует глубокое обучение. Он использует codegen
команда для генерации MEX-функции, которая запускает предсказание с помощью сетей классификации изображений, таких как MobileNet-v2, ResNet и GoogLeNet.
Необходимый
Этот пример генерирует CUDA MEX и имеет следующие требования к третьим лицам.
Графический процессор NVIDIA с поддержкой CUDA ® и совместимый драйвер.
Дополнительный
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Набор инструментальных средств NVIDIA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации смотрите Оборудование сторонних производителей (GPU Coder) и Настройка продуктов предпосылок (GPU Coder).
Используйте coder.checkGpuInstall
(GPU Coder) для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
mobilenetv2_predict
Функция точки входаMobileNet-v2 - сверточная нейронная сеть, которая обучается более чем на миллионе изображений из базы данных ImageNet. Сеть имеет глубину 155 слоев и может классифицировать изображения в 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. Сеть имеет размер входного сигнала изображения 224 224. Используйте analyzeNetwork
функция для отображения интерактивной визуализации архитектуры нейронной сети для глубокого обучения.
net = mobilenetv2(); analyzeNetwork(net);
The 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
функция точки входа, создайте объект строения кода GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig
(GPU Coder) функция для создания CuDNN
объект строения глубокого обучения и присвоение его DeepLearningConfig
свойство объекта строения кода GPU. Запуск 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(); };
The setup()
метод класса настраивает указатели и выделяет память для каждого слоя сетевого объекта. The 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
захватывает системы координат из веб-камеры, выполняет предсказание и отображает результаты классификации на каждом из захваченных видеокадров. Этот пример использует webcam
(Пакет поддержки MATLAB для веб-камер USB), который поддерживается пакетом поддержки MATLAB ® для 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;
Для классификации изображений можно также использовать сетевую ResNet-50 DAG. Предварительно обученная модель ResNet-50 для MATLAB доступна в ResNet-50 пакете поддержки Deep Learning Toolbox. Для загрузки и установки пакета поддержки используйте браузер Add-On Explorer. Дополнительные сведения о поиске и установке дополнений см. в разделе Получение и управление Дополнений.
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
функция точки входа, создайте объект строения кода GPU для цели 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. Дополнительные сведения о поиске и установке дополнений см. в разделе Получение и управление Дополнений.
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
функция для загрузки сети и выполнения прогнозирования на вход изображении. Чтобы сгенерировать код для этой функции точки входа, создайте объект строения GPU для цели 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;