Генерация кода для сети классификации видео

В этом примере показано, как сгенерировать код CUDA ® для нейронной сети для глубокого обучения, которая классифицирует видео и развертывает сгенерированный код на плате NVIDIA ® Jetson Xavier с помощью пакета Coder™ Support MATLAB ® для платформ NVIDIA Jetson и NVIDIA DRIVE E. Нейронная сеть для глубокого обучения имеет как сверточный, так и двунаправленный слои долгой краткосрочной памяти (BiLSTM). Сгенерированное приложение считывает данные из заданного видео файла как последовательность видеокадров и выводит метку, которая классифицирует активность в видео. Этот пример генерирует код для сети, обученной в разделе «Классификация видео» Глубокому обучению используя пример из Deep Learning Toolbox(TM). Для получения дополнительной информации смотрите Классификация видео Используя Глубокое Обучение (Deep Learning Toolbox).

Необходимые условия для третьих лиц

Требования к целевой плате

  • Плата NVIDIA Jetson.

  • Перекрестный кабель Ethernet для подключения целевой платы и хост-ПК (если целевая плата не может быть подключена к локальной сети).

  • Поддерживаемый пакет Jetpack SDK, включающий библиотеки CUDA и cuDNN

  • Переменные окружения целевого компьютера для компиляторов и библиотек. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек и их настройке см. в разделе Установка и Setup необходимых условий для плат NVIDIA (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) для плат NVIDIA

Проверьте установку пакета поддержки NVIDIA на хосте

Чтобы сгенерировать и развернуть код на плате NVIDIA Jetson Xavier, вам понадобится MATLAB CODER пакет поддержки для платформ NVIDIA Jetson и NVIDIA DRIVE. Используйте checkHardwareSupportPackageInstall функция, чтобы убедиться, что хост-система совместима для запуска этого примера. Если функция не выдает ошибку, пакет поддержки правильно установлен.

checkHardwareSupportPackageInstall();

Подключение к оборудованию NVIDIA

Пакет поддержки использует SSH-соединение через TCP/IP для выполнения команд во время создания и выполнения сгенерированного кода CUDA на платформе Jetson. Поэтому необходимо подключить целевую платформу к той же сети, что и хосту-компьютеру, или использовать перекрестный кабель Ethernet, чтобы подключить плату непосредственно к хосту-компьютеру. См. документацию NVIDIA по настройке и конфигурированию системной платы.

Для связи с оборудованием NVIDIA необходимо создать объект подключения к активному оборудованию при помощи jetson (MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms). Для создания объекта подключения к активному оборудованию необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, при первом подключении к целевой плате создайте объект live для оборудования Jetson с помощью команды:

hwobj = jetson('jetson-name','ubuntu','ubuntu');

Объект jetson повторно использует эти настройки из последнего успешного подключения к оборудованию Jetson. Этот пример устанавливает SSH-соединение с оборудованием Jetson с помощью настроек, хранящихся в памяти.

hwobj = jetson;
Checking for CUDA availability on the Target...
Checking for 'nvcc' in the target system path...
Checking for cuDNN library availability on the Target...
Checking for TensorRT library availability on the Target...
Checking for prerequisite libraries is complete.
Gathering hardware details...
Checking for third-party library availability on the Target...
Gathering hardware details is complete.
 Board name         : NVIDIA Jetson AGX Xavier, NVIDIA Jetson Xavier NX
 CUDA Version       : 10.2
 cuDNN Version      : 8.0
 TensorRT Version   : 7.1
 GStreamer Version  : 1.14.5
 V4L2 Version       : 1.14.2-1
 SDL Version        : 1.2
 OpenCV Version     : 4.1.1
 Available Webcams  :  
 Available GPUs     : Xavier

Примечание:

В случае отказа соединения в командной строке MATLAB выводится сообщение об ошибке диагностики. В случае сбоя подключения наиболее вероятной причиной является неправильный IP-адрес или имя узла.

Проверьте окружение GPU

Используйте coder.checkGpuInstall функция для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.

envCfg = coder.gpuEnvConfig('jetson');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);

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

The net_classify функция точки входа жестко кодирует имя видео файла. Обратите внимание, что этот жесткий путь должен быть скорректирован с учетом местоположения видео, файла на вашем целевом компьютере. Функция точки входа затем считывает данные из файла с помощью VideoReader объект. Данные считываются в MATLAB как последовательность изображений (видеокадров). Эти данные затем обрезаются по центру и, наконец, передаются как вход в обученную сеть для предсказания. В частности, функция использует сеть, обученную в примере Classify Videos Using Deep Learning. Функция загружает сетевой объект из net.mat файл в постоянную переменную и повторно использует постоянный объект для последующих вызовов предсказания.

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

if coder.target('MATLAB')
    videoFilename = 'situp.mp4';
else
    videoFilename = '/home/ubuntu/VideoClassify/situp.mp4';
end

frameSize = [1920 1080];

% read video
video = readVideo(videoFilename, frameSize);

% specify network input size
inputSize = [224 224 3];

% crop video
croppedVideo = centerCrop(video,inputSize);

% A persistent object mynet is used to load the series network object. At
% the first call to this function, the persistent object is constructed and
% setup. When the function is called subsequent times, the same object is
% reused to call predict on inputs, thus avoiding reconstructing and
% reloading the network object.

persistent mynet;

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

% pass in cropped input to network
out = classify(mynet, croppedVideo); 


%   Copyright 2019-2021 The MathWorks, Inc.

Сведения о сети

Сеть, используемая для классификации входа видео, имеет несколько заметные функции:

1. Сеть имеет входной слой последовательности, чтобы принимать последовательности изображений как входные.

2. Сеть использует слой складывания последовательности, за которым следуют сверточные слои, чтобы применить сверточные операции к каждому видеокадру независимо, таким образом извлекая функции из каждой системы координат.

3. Сеть использует слой развертывания последовательности и слой сплющивания, чтобы восстановить структуру последовательности и изменить форму выхода на векторные последовательности в ожидании уровня BiLSTM.

4. Наконец, сеть использует уровень BiLSTM, за которым следуют выходные слои, чтобы классифицировать векторные последовательности.

Чтобы отобразить интерактивную визуализацию сетевой архитектуры и информацию о слоях сети, используйте analyzeNetwork (Deep Learning Toolbox) функция.

Выполняйте net_classify в MATLAB

Загрузите сеть классификации видео.

getVideoClassificationNetwork();

Цикл по отдельным системам координат situp.mp4 чтобы просмотреть тестовое видео в MATLAB.

videoFileName = 'situp.mp4';
video = readVideo(videoFileName);

numFrames = size(video,4);
figure
for i = 1:numFrames
    frame = video(:,:,:,i);
    imshow(frame/255);
    drawnow
end

Выполняйте net_classify и обратите внимание на выходную метку. Обратите внимание, что если имеется доступный хост графический процессор, он будет автоматически использоваться при запуске net_classify.

net_classify()
ans = 

  categorical

     situp 

Сгенерируйте и разверните код CUDA на целевом устройстве

Чтобы сгенерировать исполняемый файл CUDA, который может быть развернут на целевом устройстве NVIDIA, создайте новый объект строения кодера GPU для генерации исполняемого файла. Установите целевую библиотеку глубокого обучения на 'cudnn'.

clear cfg
cfg = coder.gpuConfig('exe');
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');

Используйте coder.hardware функция для создания объекта строения для платформы Jetson и назначения его Hardware свойство объекта строения кода GPU cfg.

cfg.Hardware = coder.hardware('NVIDIA Jetson');

Установите директорию сборки на целевом компьютере. Измените путь к примеру ниже на местоположение на целевом компьютере, где необходимо поместить сгенерированный код.

cfg.Hardware.BuildDir = '/home/ubuntu/VideoClassify';

Пользовательский основной файл main.cu - оболочка, которая вызывает net_classify функцию в сгенерированной библиотеке.

cfg.CustomInclude = '.';
cfg.CustomSource = fullfile('main.cu');

Запуск codegen команда. На этот раз код будет сгенерирован, а затем скопирован на целевую плату. Затем исполняемый файл будет построен на целевой плате.

codegen -config cfg net_classify
Code generation successful.

Запуск сгенерированного приложения на целевом компьютере

Скопируйте тестовое видео файла situp.mp4 от хоста-компьютера до целевого устройства при помощи putFile команда. Убедитесь, что это видео файла помещено в местоположение, жестко закодированное в функции точки входа net_classify. В этом примере это расположение является целевым компьютером директории сборки.

hwobj.putFile(videoFileName, cfg.Hardware.BuildDir);

Использование runApplication чтобы запустить приложение на целевом компьютере. Метка будет отображаться на выход клемме целевого устройства.

hwobj.runApplication('net_classify');
### Launching the executable on the target...
Executable launched successfully with process ID 4394.
Displaying the simple runtime log for the executable...

Note: For the complete log, run the following command in the MATLAB command window:
system(hwobj,'cat /home/ubuntu/VideoClassify/MATLAB_ws/R2021a/home/lnarasim/Documents/MATLAB/ExampleManager/lnarasim.eLCM/deeplearning_shared-ex98434544/net_classify.log')

См. также

Функции

Объекты

Похожие примеры

Подробнее о