Семантическая сегментация на NVIDIA DRIVE

В этом примере показано, как сгенерировать и развернуть исполняемый файл CUDA ® для приложения сегментации изображений, которое использует глубокое обучение. Он использует MATLAB ® Coder™ Support Package для платформ NVIDIA Jetson и NVIDIA DRIVE для развертывания исполняемого файла на платформе NVIDIA DRIVE™. Этот пример выполняет генерацию кода на хост-компьютер и создает сгенерированный код на целевой платформе с помощью возможности удаленного построения пакета поддержки. Для получения дополнительной информации смотрите Генерацию кода для семантической сети сегментации.

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

Требования к целевой плате

  • NVIDIA DRIVE PX2 встраиваемая платформа.

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

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

  • Библиотека NVIDIA cuDNN (v5 и выше) на целевом компьютере.

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

  • Переменные окружения целевого компьютера для компиляторов и библиотек. Для получения дополнительной информации см. раздел Установка и Setup Необходимых условий для плат NVIDIA (MATLAB CODER пакет поддержки для платформ NVIDIA Jetson и NVIDIA DRIVE).

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

  • GPU Coder для генерации кода CUDA. Для получения руководства «Запуск с GPU Coder».

  • Deep Learning Toolbox™ использовать сетевой объект DAG.

  • Пакет поддержки интерфейса GPU Coder для библиотек глубокого обучения. Для установки этого пакета поддержки используйте MATLAB ® Add-On Explorer.

  • Набор инструментов NVIDIA CUDA на хосте.

  • Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».

Создайте папку и скопируйте соответствующие файлы

Следующая строка кода создает папку в текущей рабочей папке на хосте и копирует все соответствующие файлы в эту папку. Если вы не можете сгенерировать файлы в этой папке, перед запуском этой команды измените текущую рабочую папку.

nvidiademo_setup('segnet_deploy');

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

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

Для связи с оборудованием NVIDIA создайте объект подключения к активному оборудованию с помощью drive (MATLAB Coder Support Package for NVIDIA Jetson и NVIDIA DRIVE Platforms). Для создания объекта подключения к активному оборудованию необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, при первом подключении к целевой плате создайте объект live для оборудования Drive с помощью команды:

hwobj = drive('drive-px2-name','ubuntu','ubuntu');

Во время создания оборудования объект пакет поддержки выполняет проверку аппаратных и программного оборудования, установку сервера ввода-вывода и собирает периферийную информацию для целевого устройства. Эта информация отображается в Командном окне.

В случае отказа соединения в командной строке MATLAB выводится сообщение об ошибке диагностики. Если подключение не удалось, наиболее вероятной причиной является неправильный IP-адрес или имя узла.

Проверьте окружение графического процессора на целевой плате

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

envCfg = coder.gpuEnvConfig('drive');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
envCfg.HardwareObject = hwobj;
coder.checkGpuInstall(envCfg);

Получите предварительно обученный сетевой объект SegNet DAG

net = getSegNet();
Downloading pre-trained SegNet (107 MB)...

Сеть DAG содержит 91 слой, включая свертку, нормализацию партии ., объединение, отмену охлаждения и выходные слои классификации пикселей. Чтобы увидеть все слои сети, используйте analyzeNetwork функция.

Сгенерируйте код CUDA для целевой платы с помощью GPU Coder

Этот пример использует segnet_predict.m файл как функция точки входа для генерации кода. Чтобы сгенерировать исполняемый файл CUDA, который можно развернуть на целевом устройстве NVIDIA, создайте объект строения кода GPU для генерации исполняемого файла.

cfg = coder.gpuConfig('exe');

Когда существует несколько объектов live connection для разных целей, генератор кода выполняет удаленную сборку на целевой плате, для которой был создан недавний объект live. Чтобы выбрать плату оборудования для выполнения удаленной сборки, используйте setupCodegenContext() способ соответствующего объекта оборудование. Если был создан только один объект live connection, вам не нужно вызывать этот метод.

hwobj.setupCodegenContext;

Чтобы создать объект строения для платформы DRIVE и назначить его Hardware свойство объекта строения кода cfg, используйте coder.hardware функция.

cfg.Hardware = coder.hardware('NVIDIA Drive');

Чтобы задать папку для выполнения процесса удаленной сборки на целевой плате, используйте BuildDir свойство. Если заданная папка сборки не существует на целевой плате, то программа создает папку с заданным именем. Если значение не назначено cfg.Hardware.BuildDirпроцесс удаленного сборки происходит в последней указанной папке сборки. Если нет значения сохраненной папки сборки, процесс сборки происходит в домашней папке.

cfg.Hardware.BuildDir = '~/remoteBuildDir';

На платформах NVIDIA, таких как PX2 DRIVE, которые содержат несколько графических процессоров, используйте SelectCudaDevice свойство в графический процессор строения объекте, чтобы выбрать конкретный графический процессор.

cfg.GpuConfig.SelectCudaDevice = 0;

Настраиваемая main.cu файл является оболочкой, которая вызывает функцию предсказания в сгенерированном коде. Шаги постобработки добавляются в основной файл с помощью интерфейсов OpenCV. Выходы предсказания SegNet являются 11-канальным изображением. Одиннадцать каналов здесь представляют счета предсказания одиннадцати различных классов. При постобработке каждому пикселю присваивается метка класса, которая имеет максимальный счет среди 11 каналов. Каждый класс связан с уникальным цветом для визуализации. Окончательный выход показан при помощи OpenCV imshow функция.

cfg.CustomSource  = fullfile('main.cu');

В этом примере генерация кода использует изображение в качестве входов для сети. Однако пользовательский основной файл кодируется, чтобы взять видео как вход и выполнить предсказание SegNet для каждой системы координат в видеопоследовательности. Флаги компилятора и линкера, необходимые для создания исполняемого файла с библиотекой OpenCV, обновляются в buildinfo раздел в |segnet_predict.m'file.

Сгенерируйте образец входа изображения для генерации кода.

img = imread('peppers.png');
img = imresize(img,[360 480]);

Чтобы сгенерировать код CUDA, используйте codegen функционировать и передать графический процессор кода строения и размер входов для и segnet_predict.m функция точки входа. После того, как генерация кода происходит на хосте, сгенерированные файлы копируются и строятся на целевой плате.

codegen('-config ', cfg, 'segnet_predict', '-args', {img},'-report');

Запуск исполняемого файла на целевой плате

Скопируйте вход тестовое видео в целевую папку рабочей области, используя workspaceDir свойство аппаратного объекта. Это свойство содержит путь к codegen папка на целевой плате.

hwobj.putFile('CamVid.avi', hwobj.workspaceDir);

Чтобы запустить исполняемый файл на целевом компьютере, используйте runApplication() метод аппаратного объекта.

hwobj.runApplication('segnet_predict','CamVid.avi');

Выход сегментированного изображения отображается в окне на мониторе, который соединяется с целевой платой.

Можно остановить выполнение исполняемого файла на целевой плате из окружения MATLAB на хосте, используя killApplication() метод аппаратного объекта. Этот метод использует имя приложения, а не исполняемого файла.

hwobj.killApplication('segnet_predict');

Очистка

Чтобы удалить файлы примера и вернуться в исходную папку, вызовите cleanup функция.

cleanup

См. также

Объекты

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

Похожие темы