В этом примере показано, как создать код CUDA ® из объекта DAGNetwork и развернуть созданный код на плате TX2 NVIDIA ® Jetson с помощью пакета поддержки GPU Coder™ для графических процессоров NVIDIA. В этом примере используется сеть глубокого обучения resnet50 для классификации изображений из потока видео веб-камеры USB.
Требования к целевой плате
NVIDIA Jetson Tegra TX2 встраиваемая платформа.
Кросс-кабель Ethernet для подключения целевой платы и хост-ПК (если целевая плата не может быть подключена к локальной сети).
USB-камера для подключения к TX2.
Набор инструментов NVIDIA CUDA, установленный на целевой плате.
Библиотека NVIDIA cuDNN на целевой плате.
Библиотека OpenCV на цели для чтения и отображения изображений/видео.
Переменные среды в целевом объекте для компиляторов и библиотек. Сведения о поддерживаемых версиях компиляторов и библиотек и их настройке см. в разделе Установка и настройка предварительных условий для плат NVIDIA (пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) для плат NVIDIA.
Требования к хосту разработки
Набор инструментов и драйвер NVIDIA CUDA.
Переменные среды для компиляторов и библиотек. Сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Аппаратное обеспечение сторонних производителей. Сведения о настройке переменных среды см. в разделе Настройка необходимых продуктов.
Используйте checkHardwareSupportPackageInstall для проверки совместимости хост-системы с этим примером.
checkHardwareSupportPackageInstall();
Пакет поддержки кодеров GPU для графических процессоров NVIDIA использует SSH-соединение через TCP/IP для выполнения команд при создании и выполнении сгенерированного кода CUDA на платформе Jetson. Поэтому необходимо подключить целевую платформу к той же сети, что и хост-компьютер, или использовать кросс-кабель Ethernet для подключения платы непосредственно к хост-компьютеру. Обратитесь к документации NVIDIA по настройке и настройке платы.
Для взаимодействия с аппаратным обеспечением NVIDIA необходимо создать объект подключения аппаратного обеспечения в реальном времени с помощью jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE). Для создания объекта аппаратного подключения в реальном времени необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы.
hwobj= jetson('host-name','username','password');
В случае сбоя соединения в командной строке MATLAB появляется сообщение об ошибке диагностики. В случае сбоя подключения наиболее вероятной причиной является неправильный IP-адрес или имя узла.
При наличии нескольких активных объектов подключения для различных целей генератор кода выполняет удаленное построение на цели, для которой был создан недавний живой объект. Чтобы выбрать аппаратную плату для выполнения удаленной сборки, используйте setupCodegenContext() способ соответствующего активного аппаратного объекта. Если был создан только один объект реального соединения, вызывать этот метод не требуется.
hwobj.setupCodegenContext;
Используйте coder.checkGpuInstall для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
envCfg = coder.gpuEnvConfig('jetson'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; envCfg.HardwareObject = hwobj; coder.checkGpuInstall(envCfg);
resnet50_wrapper.m функция начальной точки использует предварительно обученную сеть ResNet-50 Network для классификации изображений. ResNet-50 является сетью DAG, обученной работе с более чем миллионом изображений из базы данных ImageNet. Выходные данные содержат категориальные оценки каждого класса, которому принадлежит изображение.
type resnet50_wrapper
function out = resnet50_wrapper(im,ocvFlag) %#codegen
% Wrapper function to call ResNet50 predict function.
% Copyright 2019-2021 The MathWorks, Inc.
% This example uses OpenCV for reading frames from a web camera and
% displaying output image. Update buildinfo to link with OpenCV library
% available on target.
if ocvFlag
opencv_link_flags = '`pkg-config --libs opencv4`';
opencv_compile_flags = '`pkg-config --cflags opencv4`';
else
opencv_link_flags = '`pkg-config --libs opencv`';
opencv_compile_flags = '`pkg-config --cflags --libs opencv`';
end
coder.updateBuildInfo('addLinkFlags',opencv_link_flags);
coder.updateBuildInfo('addCompileFlags',opencv_compile_flags);
% To avoid multiple loads of the network for each run, we use persistent
% rnet
persistent rnet;
if isempty(rnet)
rnet = resnet50();
end
out = rnet.predict(im);
end
Используйте pkg-config средство поддержки для запроса о том, установлен ли OpenCV 4.x на целевой плате. В этом примере используется информация для обновления информации построения для связи с соответствующей библиотекой OpenCV, доступной в целевом объекте.
try OpenCVver = strtrim(system(hwobj,'pkg-config --modversion opencv4')); isOpenCV4 = 1; catch OpenCVver = strtrim(system(hwobj,'pkg-config --modversion opencv')); isOpenCV4 = 0; end
Чтобы создать исполняемый файл CUDA, который можно развернуть на целевом объекте NVIDIA, создайте объект конфигурации кодера графического процессора для создания исполняемого файла.
cfg = coder.gpuConfig('exe');
Используйте coder.hardware чтобы создать объект конфигурации для платформы Jetson и назначить его Hardware свойство объекта конфигурации кода графического процессора cfg.
cfg.Hardware = coder.hardware('NVIDIA Jetson');
Задайте для конфигурации глубокого обучения значение 'cudnn' или tensorrt '
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
В этом примере генерация кода выполняется с использованием изображения в качестве входного сигнала. Однако поток веб-камеры подается на вход исполняемого файла после развертывания.
Образец входного изображения для генерации кода
im = single(imread('peppers.png'));
im = imresize(im,[224,224]);
Пользовательский основной файл кодируется для ввода видео и классифицирует каждый кадр в видеопоследовательности. Обычай main_resnet50.cu файл - это оболочка, вызывающая функцию прогнозирования в сгенерированном коде. Шаги постобработки, такие как отображение выходных данных во входном кадре, добавляются в основной файл с помощью интерфейсов OpenCV.
cfg.CustomSource = fullfile('main_resnet50.h'); cfg.CustomSource = fullfile('main_resnet50.cu');
Чтобы создать код CUDA и развернуть его на цели, используйте codegen и передать объект конфигурации кода графического процессора. После создания кода на хосте созданные файлы копируются и создаются на целевом объекте в каталоге рабочей области.
codegen -config cfg -args {im,coder.Constant(isOpenCV4)} resnet50_wrapper -report
Скопируйте synsetWords_resnet50 текстовый файл с хост-компьютера на целевое устройство с помощью putFile команда.
hwobj.putFile('synsetWords_resnet50.txt',hwobj.workspaceDir);
Используйте runApplication способ аппаратного объекта для запуска приложения на целевом аппаратном обеспечении. Приложение будет размещено в каталоге рабочей области.
hwobj.runApplication('resnet50_wrapper');
Если окно веб-камеры не отображается на целевой плате, оно может быть направлено на неверный дисплей. Используйте setDisplayEnvironment для установки среды отображения, используемой для перенаправления отображения на целевой объект. Значение должно совпадать с $DISPLAY значение среды, установленное на плате.

Используйте killApplication способ аппаратного объекта для уничтожения запущенного приложения на целевом объекте.
hwobj.killApplication('resnet50_wrapper');
drive(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) | jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE)