В этом примере показано, как сгенерировать код CUDA ® из объекта DAGNetwork и развернуть сгенерированный код на TX2 плате NVIDIA ® Jetson с помощью пакета GPU Coder™ Support для графических процессоров NVIDIA. Этот пример использует нейронную сеть для глубокого обучения resnet50 для классификации изображений из видеопотока веб-камеры USB.
Требования к целевой плате
NVIDIA Jetson Tegra TX2 встраиваемая платформа.
Перекрестный кабель Ethernet для подключения целевой платы и хост-ПК (если целевая плата не может быть подключена к локальной сети).
USB-камера для подключения к TX2.
Набор инструментов NVIDIA CUDA, установленный на целевой плате.
Библиотека NVIDIA cuDNN на целевой плате.
Библиотека OpenCV на цели для чтения и отображения изображений/видео.
Переменные окружения целевого компьютера для компиляторов и библиотек. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек и их настройке см. в разделе Установка и Setup необходимых условий для плат NVIDIA (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) для плат NVIDIA
Требования к узлу разработки
Инструментарий и драйвер NVIDIA CUDA.
Переменные окружения для компиляторов и библиотек. Дополнительные сведения о поддерживаемых версиях компиляторов и библиотек см. в разделе Оборудование сторонних производителей. Для настройки переменных окружения смотрите Настройка обязательных продуктов.
Используйте checkHardwareSupportPackageInstall
функция, чтобы убедиться, что хост-система совместима для запуска этого примера.
checkHardwareSupportPackageInstall();
Пакет поддержки GPU Coder для графических процессоров NVIDIA использует SSH-соединение через TCP/IP для выполнения команд во время создания и выполнения сгенерированного кода CUDA на платформе Jetson. Поэтому необходимо подключить целевую платформу к той же сети, что и хосту-компьютеру, или использовать перекрестный кабель Ethernet, чтобы подключить плату непосредственно к хосту-компьютеру. См. документацию NVIDIA по настройке и конфигурированию системной платы.
Для связи с оборудованием NVIDIA необходимо создать объект подключения к активному оборудованию при помощи jetson
(MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms). Для создания объекта подключения к активному оборудованию необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы.
hwobj= jetson('host-name','username','password');
В случае отказа соединения в командной строке MATLAB выводится сообщение об ошибке диагностики. В случае сбоя подключения наиболее вероятной причиной является неправильный IP-адрес или имя узла.
Когда существует несколько объектов live connection для разных целей, генератор кода выполняет удаленную сборку для цели, для которой был создан недавний объект live. Чтобы выбрать плату оборудования для выполнения удаленной сборки, используйте setupCodegenContext()
способ соответствующего объекта оборудование. Если был создан только один объект live connection, вызывать этот метод не обязательно.
hwobj.setupCodegenContext;
Используйте coder.checkGpuInstall
функция для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.
envCfg = coder.gpuEnvConfig('jetson'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; envCfg.HardwareObject = hwobj; coder.checkGpuInstall(envCfg);
The 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
helper tool, чтобы запросить, установлен ли 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, создайте объект строения кодера GPU для генерации исполняемого файла.
cfg = coder.gpuConfig('exe');
Используйте coder.hardware
функция для создания объекта строения для платформы Jetson и назначения его Hardware
свойство объекта строения кода GPU 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
и передайте объект строения кода GPU. После того, как генерация кода происходит на хосте, сгенерированные файлы копируются и строятся на целевом компьютере в директории рабочей области.
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 CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) | jetson
(Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE)