exponenta event banner

Создание кода для сети классификации видео

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

Предварительные условия для сторонних производителей

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

  • Плата NVIDIA Jetson.

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

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

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

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

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

checkHardwareSupportPackageInstall();

Подключение к аппаратному обеспечению NVIDIA

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

Для взаимодействия с оборудованием NVIDIA необходимо создать объект подключения к оборудованию в реальном времени с помощью jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE). Для создания объекта аппаратного подключения в реальном времени необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, при первом подключении к целевой плате создайте активный объект для оборудования 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 Функция точки входа

net_classify функция начальной точки жестко кодирует имя видеофайла. Обратите внимание, что этот жестко закодированный путь необходимо настроить в соответствии с расположением видеофайла на целевом оборудовании. Затем функция точки входа считывает данные из файла с помощью 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 на конечном объекте

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

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

Используйте coder.hardware чтобы создать объект конфигурации для платформы Jetson и назначить его 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 команда. Убедитесь, что этот видеофайл размещен в местоположении, жестко закодированном в функции точки входа 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')

См. также

Функции

Объекты

Связанные примеры

Подробнее