Генерация кода для сверточной сети LSTM, которая использует Intel MKL-DNN

В этом примере показано, как сгенерировать MEX-функцию для нейронной сети для глубокого обучения, содержащей и сверточные и двунаправленные долгие краткосрочные слои (BiLSTM) памяти, который использует Math Kernel Library Intel для Глубоких нейронных сетей (MKL-DNN). Сгенерированная MEX-функция считывает данные из заданного видеофайла как последовательность видеокадров и выводит метку, которая классифицирует действие на видео. Для получения дополнительной информации об обучении этой сети смотрите, что пример Классифицирует Видео Используя Глубокое обучение (Deep Learning Toolbox).

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

Этот пример поддерживается на Mac®, Linux® и платформах Windows® и не поддерживаемый для MATLAB Online.

Подготовьте вход

Считайте видеофайл pushup.mp4 при помощи readvideo функция помощника включена с этим примером во вспомогательном файле. Смотреть видео, цикл по отдельным системам координат видеофайла и использовать imshow функция.

filename = "pushup.mp4";
video = readVideo(filename);
numFrames = size(video,4);
figure
for i = 1:numFrames
    frame = video(:,:,:,i);
    imshow(frame/255);
    drawnow
end

Центральная обрезка входные видеокадры к входному размеру обучившего сеть при помощи centerCrop функция помощника, присоединенная как вспомогательный файл.

inputSize = [224 224 3];
video = centerCrop(video,inputSize);

video_classify Функция точки входа

video_classify.m функция точки входа берет последовательности изображений и передает его обучившему сеть для предсказания. Эта функция использует сверточную сеть LSTM, которая обучена в примере, Классифицируют Видео Используя Глубокое обучение (Deep Learning Toolbox). Функция загружает сетевой объект из файла net.mat файл в персистентную переменную и затем использует classify (Deep Learning Toolbox) функция, чтобы выполнить предсказание. На последующих вызовах, функциональные повторные использования уже загруженный постоянный объект.

type('video_classify.m')
function out = video_classify(in) %#codegen

% During the execution of the first function call, the network object is
% loaded in the persistent variable mynet. In subsequent calls, this loaded
% object is reused. 

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('net.mat');
end

% Provide input and perform prediction
out = classify(mynet,in); 

Сгенерируйте MEX

Чтобы сгенерировать MEX-функцию, создайте coder.MexCodeConfig объект cfg. Установите TargetLang свойство cfg на C++. Используйте coder.DeepLearningConfig функция, чтобы создать настройку глубокого обучения возражает для MKL-DNN. Присвойте его DeepLearningConfig свойство cfg.

cfg = coder.config('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn');

Запустите getVideoClassificationNetwork функция помощника, чтобы загрузить видео сеть классификации и сохранить сеть в файле MAT net.mat.

getVideoClassificationNetwork();

Используйте coder.typeof функция, чтобы задать тип и размер входного параметра к функции точки входа. В этом примере вход имеет двойной тип с размером [224 224 3] и переменная длина последовательности.

Input = coder.typeof(double(0),[224 224 3 Inf],[false false false true]);

Сгенерируйте MEX-функцию путем выполнения codegen команда.

codegen -config cfg video_classify -args {Input} -report
Code generation successful: View report

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

Запустите сгенерированную MEX-функцию с обрезанным центром вводом видео.

output = video_classify_mex(video)
output = categorical
     pushup 

Наложите предсказание на входном видео.

video = readVideo(filename);
numFrames = size(video,4);
figure
for i = 1:numFrames
    frame = video(:,:,:,i);
    frame = insertText(frame, [1 1], char(output), 'TextColor', [255 255 255],'FontSize',30, 'BoxColor', [0 0 0]);
    imshow(frame/255);
    drawnow
end

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

| |

Похожие темы