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

В этом примере показано, как выполнить генерацию кода для приложения классификации изображений, которое использует глубокое обучение. Это использует codegen команда, чтобы сгенерировать MEX-функцию, которая запускает предсказание при помощи сетей классификации изображений, таких как MobileNet-v2, ResNet и GoogLeNet.

Сторонние необходимые условия

Необходимый

Этот пример генерирует MEX CUDA и имеет следующие сторонние требования.

  • CUDA® включил NVIDIA® графический процессор и совместимый драйвер.

Дополнительный

Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте среду графического процессора

Используйте 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 (Deep Learning Toolbox) функция, чтобы отобразить интерактивную визуализацию архитектуры нейронной сети для глубокого обучения.

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 системы координат захватов от веб-камеры, выполняет предсказание и отображает результаты классификации на каждом из полученных видеокадров. Этот пример использует webcam (Пакет Поддержки MATLAB для Веб-камер USB) функция, которая поддерживается 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;

Смотрите также

Функции

Объекты

Похожие темы