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

В этом примере показано, как сгенерировать код CUDA® от объекта DAGNetwork и развернуть сгенерированный код на плату NVIDIA® Jetson TX2 с помощью Пакета Поддержки GPU Coder™ для NVIDIA графические процессоры. Этот пример использует resnet50 нейронную сеть для глубокого обучения, чтобы классифицировать изображения от видеопотока веб-камеры USB.

Необходимые условия

Требования требуемой платы

  • NVIDIA Джетсон Tegra TX2 встроил платформу.

  • Кабель перекрестного соединения Ethernet, чтобы соединить требуемую плату и PC хоста (если требуемая плата не может быть соединена с локальной сетью).

  • Камера USB, чтобы соединиться с TX2.

  • NVIDIA инструментарий CUDA установлен на требуемой плате.

  • Библиотека NVIDIA cuDNN по требуемой плате.

  • Библиотека OpenCV по цели для чтения и отображения изображений/видео.

  • Переменные окружения на цели для компиляторов и библиотек. Для получения информации о поддерживаемых версиях компиляторов и библиотек и их настройки, смотрите Необходимые условия Установки и Setup для Советов NVIDIA (Пакет Поддержки GPU Coder для NVIDIA графические процессоры) для плат NVIDIA.

Требования узла разработки

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

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

checkHardwareSupportPackageInstall();

Свяжите с оборудованием NVIDIA

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

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

cfg = coder.gpuConfig('exe');

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

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

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

hwobj.killApplication('resnet50_wrapper');