В этом примере показано, как сгенерировать код 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 Jetson Xavier, вам понадобится MATLAB CODER пакет поддержки для платформ NVIDIA Jetson и NVIDIA DRIVE. Используйте checkHardwareSupportPackageInstall
функция, чтобы убедиться, что хост-система совместима для запуска этого примера. Если функция не выдает ошибку, пакет поддержки правильно установлен.
checkHardwareSupportPackageInstall();
Пакет поддержки использует 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-адрес или имя узла.
Используйте coder.checkGpuInstall
функция для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
envCfg = coder.gpuEnvConfig('jetson'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; envCfg.HardwareObject = hwobj; coder.checkGpuInstall(envCfg);
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, который может быть развернут на целевом устройстве 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')
codegen
| coder.checkGpuInstall
| coder.DeepLearningConfig
| coder.loadDeepLearningNetwork
| VideoReader
| jetson
(пакет поддержки MATLAB CODER для NVIDIA Джетсон и NVIDIA ВЕДУТ платформы), | killApplication
(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) | runApplication
(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE)coder.CuDNNConfig
| coder.gpuConfig
| coder.gpuEnvConfig
| coder.TensorRTConfig
| jetson
(пакет поддержки MATLAB CODER для NVIDIA Джетсон и NVIDIA ВЕДУТ платформы),