Этот пример показывает, как сгенерировать 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