exponenta event banner

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

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

Используйте checkHardwareSupportPackageInstall для проверки совместимости хост-системы с этим примером.

checkHardwareSupportPackageInstall();

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

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

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

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

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 значение среды, установленное на плате.

Вывод классификации Resnet на TX2 Jetson

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

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

hwobj.killApplication('resnet50_wrapper');

См. также

Объекты

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

Связанные темы