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

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

Сторонние необходимые условия

Требования требуемой платы

  • NVIDIA плата Джетсона.

  • Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если требуемая плата не может быть соединена с локальной сетью).

  • Поддерживаемый SDK Реактивного ранца, который включает CUDA и cuDNN библиотеки

  • Переменные окружения на цели для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек и их настройки, смотрите Необходимые условия Установки и Setup для Советов NVIDIA (Пакет Поддержки GPU Coder для NVIDIA графические процессоры) для плат NVIDIA.

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

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

checkHardwareSupportPackageInstall();

Свяжите с оборудованием NVIDIA

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

Чтобы связаться с оборудованием NVIDIA, необходимо создать живой аппаратный объект связи при помощи jetson (Пакет Поддержки GPU Coder для 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
 CUDA Version       : 10.0
 cuDNN Version      : 7.5
 TensorRT Version   : 5.1
 GStreamer Version  : 1.14.5
 V4L2 Version       : 1.14.2-1
 SDL Version        : 1.2
 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); 

О сети

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

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 

Generate & Deploy Код CUDA по цели

Чтобы сгенерировать исполняемый файл 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

Запустите сгенерированное приложение на цели

Скопируйте тестовый видеофайл 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 22968.
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/nmalimba/Documents/MATLAB/Examples/deeplearning_shared-ex98434544/net_classify.log')
Для просмотра документации необходимо авторизоваться на сайте