Развертывание и классификация изображений веб-камеры на TX2 платформе NVIDIA Jetson

В этом примере показано, как сгенерировать код 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 на хосте

Используйте checkHardwareSupportPackageInstall функция, чтобы убедиться, что хост-система совместима для запуска этого примера.

checkHardwareSupportPackageInstall();

Подключение к оборудованию NVIDIA

Пакет поддержки 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;

Проверьте окружение GPU на целевом процессоре

Используйте coder.checkGpuInstall функция для проверки правильности настройки компиляторов и библиотек, необходимых для выполнения этого примера.

envCfg = coder.gpuEnvConfig('jetson');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);

ResNet-50 функции точки входа

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

Получите версию OpenCV на целевом компьютере

Используйте 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 на целевом устройстве

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

Выход классификации сбросов на TX2 Jetson

Убить приложение

Используйте killApplication метод аппаратного объекта, чтобы убить выполняемое приложение на цели.

hwobj.killApplication('resnet50_wrapper');

См. также

Объекты

  • (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE) | (Пакет поддержки MATLAB CODER для платформ NVIDIA Jetson и NVIDIA DRIVE)

Похожие темы