Этот пример показывает, как сгенерировать MEX-функцию для нейронной сети для глубокого обучения, содержащей как сверточные, так и двунаправленные слои долгой краткосрочной памяти (BiLSTM), которые используют библиотеку Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN). Сгенерированная MEX-функция считывает данные из заданного видео файла как последовательность видеокадров и выводит метку, которая классифицирует активность в видео. Для получения дополнительной информации о обучении этой сети смотрите пример Классификация видео с использованием глубокого обучения (Deep Learning Toolbox).
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Список процессоров, поддерживающих библиотеку MKL-DNN, см. в разделе Поддержка Центральном Процессоре MKLDNN
Для получения дополнительной информации о поддерживаемых версиях компиляторов и библиотек смотрите Необходимые условия для глубокого обучения с MATLAB Coder
Этот пример поддерживается на платформах 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 Функция точки входа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-функцию, создайте 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-функцию с обрезкой по центру входа видео.
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

codegen | coder.DeepLearningConfig | coder.typeof