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

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

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

The video_classify.m функция точки входа принимает последовательности изображений и передает их в обученную сеть для предсказания. Эта функция использует сверточную сеть LSTM, которая обучена в примере Classify Videos Using Deep Learning (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 функция helper для загрузки сети классификации видео и сохранения сети в файле 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

См. также

| |

Похожие темы