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

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

Необходимые условия для третьих лиц

Необходимый

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

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

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

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

Проверьте окружение GPU

Используйте 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);

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

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

Запуск сгенерированного 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 ® для 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 сети

Для классификации изображений можно также использовать сетевую 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'}

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

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

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

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

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

Похожие темы