exponenta event banner

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

В этом примере показано, как создать функцию MEX для сети глубокого обучения, содержащей сверточный и двунаправленный уровни долговременной памяти (BiLSTM), в которой используется библиотека Intel Math Kernel Library for Deep Neural Networks (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

См. также

| |

Связанные темы