Генерация кода для нейронных сетей для глубокого обучения

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

Запустите генерацию кода MEX

Сгенерировать код 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'))

Запустите сгенерированный MEX

Загрузите входное изображение.

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;

Классификация Изображений при помощи сети ResNet-50

Можно также использовать сеть 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'}

Запустите генерацию кода MEX

Чтобы сгенерировать код 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 (Inception)

Предварительно обученная модель 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'}

Запустите генерацию кода MEX

Сгенерируйте код 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;

Похожие темы