В этом примере показано, как сгенерировать код CUDA® для нейронной сети для глубокого обучения, которая классифицирует видео, и разверните сгенерированный код на плату NVIDIA® Jetson Xavier при помощи MATLAB® Coder™ Support Package для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами. Нейронная сеть для глубокого обучения имеет и сверточные и двунаправленные долгие краткосрочные слои (BiLSTM) памяти. Сгенерированное приложение считывает данные из заданного видеофайла как последовательность видеокадров и выводит метку, которая классифицирует действие на видео. Этот пример генерирует код для сети, обученной в Классифицировать Видео Используя пример Глубокого обучения от Deep Learning Toolbox(TM). Для получения дополнительной информации смотрите, Классифицируют Видео Используя Глубокое обучение (Deep Learning Toolbox).
Требования требуемой платы
NVIDIA плата Джетсона.
Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если требуемая плата не может быть соединена с локальной сетью).
Поддерживаемый SDK Реактивного ранца, который включает CUDA и cuDNN библиотеки
Переменные окружения на цели для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек и их настройки, смотрите Необходимые условия Установки и Setup для Советов NVIDIA (Пакет Поддержки MATLAB Coder для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами) для плат NVIDIA.
Чтобы сгенерировать и развернуть код в плату Джетсона Ксавьера NVIDIA, вам будет нужен Пакет Поддержки MATLAB Coder для NVIDIA, Джетсон и NVIDIA УПРАВЛЯЮТ Платформами. Используйте checkHardwareSupportPackageInstall
функция, чтобы проверить, что хост-система совместима, чтобы запустить этот пример. Если функция не выдает ошибку, пакет поддержки правильно установлен.
checkHardwareSupportPackageInstall();
Пакет поддержки использует связь SSH по TCP/IP, чтобы выполнить команды при создании и выполнении сгенерированного кода CUDA по платформе Джетсона. Необходимо поэтому соединить целевую платформу с той же сетью как хост - компьютер или использовать кабель перекрестного соединения Ethernet, чтобы соединить плату непосредственно с хостом - компьютером. Обратитесь к документации NVIDIA относительно того, как настроить и сконфигурировать вашу плату.
Чтобы связаться с оборудованием NVIDIA, необходимо создать живой аппаратный объект связи при помощи jetson
(Пакет Поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЕТ Платформами), функция. Необходимо знать, что имя хоста или IP-адрес, имя пользователя и пароль требуемой платы создают живой аппаратный объект связи. Например, при соединении с требуемой платой впервые, создайте живой объект для оборудования Джетсона при помощи команды:
hwobj = jetson('jetson-name','ubuntu','ubuntu');
Объект jetson снова использует эти настройки с новой успешной связи на оборудование Джетсона. Этот пример устанавливает связь SSH с оборудованием Джетсона с помощью настроек, сохраненных в памяти.
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
Функция точки входаnet_classify
функция точки входа hardcodes имя видеофайла. Обратите внимание на то, что этот hardcoded путь должен быть настроен к местоположению видеофайла на вашем целевом компьютере. Функция точки входа затем считывает данные из файла с помощью VideoReader
объект. Данные считаны в MATLAB как последовательность изображений (видеокадры). Эти данные затем обрезаются центром, и наконец передаются как вход обучившему сеть для предсказания. А именно, функция использует сеть, обученную в Классифицировать Видео Используя пример Глубокого обучения. Функция загружает сетевой объект от 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
функция, чтобы создать настройку возражает для платформы Джетсона и присвоить ее Hardware
свойство объекта 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
команда. Убедитесь, что этот видеофайл помещается в местоположение hardcoded в функции точки входа 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 Джетсон и NVIDIA УПРАВЛЯЕТ платформами), | runApplication
(Пакет поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЕТ платформами),coder.CuDNNConfig
| coder.gpuConfig
| coder.gpuEnvConfig
| coder.TensorRTConfig
| jetson
(пакет поддержки MATLAB Coder для NVIDIA Джетсон и NVIDIA УПРАВЛЯЮТ платформами),