В этом примере показано, как создать и развернуть исполняемый файл CUDA ® для приложения сегментации образов, использующего глубокое обучение. Он использует пакет поддержки MATLAB ® Coder™ для платформ NVIDIA Jetson и NVIDIA DRIVE для развертывания исполняемого файла на платформе NVIDIA DRIVE™. В этом примере выполняется генерация кода на хост-компьютере и компоновка сгенерированного кода на целевой платформе с использованием возможности удаленной сборки пакета поддержки. Дополнительные сведения см. в разделе Создание кода для семантической сети сегментации.
Требования к целевой плате
NVIDIA DRIVE PX2 встроенная платформа.
Кросс-кабель Ethernet для подключения целевой платы и хост-ПК (если невозможно подключить целевую плату к локальной сети).
Набор инструментов NVIDIA CUDA, установленный на плате.
Библиотека NVIDIA cuDNN (v5 и выше) на цели.
Библиотека OpenCV на целевом компьютере для чтения и отображения изображений.
Переменные среды в целевом объекте для компиляторов и библиотек. Дополнительные сведения см. в разделе Предварительные условия установки и установки плат NVIDIA (пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE).
Требования к хосту разработки
Кодер графического процессора для генерации кода CUDA. Учебное пособие см. в разделе Начало работы с кодером графического процессора.
Toolbox™ глубокого обучения для использования сетевого объекта группы обеспечения доступности баз данных.
Пакет поддержки интерфейса кодера GPU для библиотек глубокого обучения. Для установки этого пакета поддержки используйте MATLAB ®Add-On Explorer.
Набор инструментов NVIDIA CUDA на хосте.
Переменные среды для компиляторов и библиотек. Дополнительные сведения см. в разделах Аппаратное обеспечение сторонних производителей и Настройка необходимых продуктов.
Следующая строка кода создает папку в текущей рабочей папке на хосте и копирует все соответствующие файлы в эту папку. Если невозможно создать файлы в этой папке, перед выполнением этой команды измените текущую рабочую папку.
nvidiademo_setup('segnet_deploy');
Пакет поддержки использует SSH-соединение по TCP/IP для выполнения команд при создании и выполнении сгенерированного кода CUDA на платформах DRIVE. Подключите целевую платформу к той же сети, что и хост-компьютер, или используйте кросс-кабель Ethernet для подключения платы непосредственно к хост-компьютеру. Для получения информации о настройке и настройке платы см. документацию по NVIDIA.
Для связи с аппаратным обеспечением NVIDIA создайте объект подключения аппаратного обеспечения в реальном времени с помощью drive(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE). Для создания объекта аппаратного подключения в реальном времени необходимо знать имя хоста или IP-адрес, имя пользователя и пароль целевой платы. Например, при первом подключении к целевой плате создайте оперативный объект для оборудования 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);
net = getSegNet();
Downloading pre-trained SegNet (107 MB)...
Сеть DAG содержит 91 уровень, включая свертку, пакетную нормализацию, объединение в пулы, распаковку и выходные уровни классификации пикселей. Для просмотра всех уровней сети используйте analyzeNetwork функция.
В этом примере используется segnet_predict.m файл в качестве функции точки входа для генерации кода. Чтобы создать исполняемый файл CUDA, который можно развернуть на целевом объекте NVIDIA, создайте объект конфигурации кода графического процессора для создания исполняемого файла.
cfg = coder.gpuConfig('exe');
При наличии нескольких активных объектов соединения для различных целей генератор кода выполняет удаленную сборку на целевой плате, для которой был создан недавний активный объект. Чтобы выбрать аппаратную плату для выполнения удаленной сборки, используйте setupCodegenContext() способ соответствующего активного аппаратного объекта. Если был создан только один объект реального соединения, вызов этого метода не требуется.
hwobj.setupCodegenContext;
Чтобы создать объект конфигурации для платформы DRIVE и назначить его Hardware свойство объекта конфигурации кода cfg, используйте coder.hardware функция.
cfg.Hardware = coder.hardware('NVIDIA Drive');
Чтобы указать папку для выполнения процесса удаленной сборки на целевой плате, используйте BuildDir собственность. Если указанная папка сборки не существует на целевой плате, программа создает папку с указанным именем. Если значение не назначено cfg.Hardware.BuildDir, удаленный процесс сборки происходит в последней указанной папке сборки. Если сохраненное значение папки сборки отсутствует, процесс сборки выполняется в домашней папке.
cfg.Hardware.BuildDir = '~/remoteBuildDir';
На платформах NVIDIA, таких как DRIVE PX2, которые содержат несколько графических процессоров, используйте SelectCudaDevice в объекте конфигурации графического процессора для выбора определенного графического процессора.
cfg.GpuConfig.SelectCudaDevice = 0;
Обычай main.cu файл - это оболочка, вызывающая функцию прогнозирования в сгенерированном коде. Шаги постобработки добавляются в основной файл с помощью интерфейсов OpenCV. Выходной сигнал прогнозирования SegNet представляет собой 11-канальное изображение. Одиннадцать каналов здесь представляют оценки предсказания одиннадцати различных классов. При постобработке каждому пикселю назначается метка класса, которая имеет максимальную оценку среди 11 каналов. Каждый класс связан с уникальным цветом для визуализации. Конечный результат показан с помощью OpenCV imshow функция.
cfg.CustomSource = fullfile('main.cu');
В этом примере генерация кода использует изображение в качестве входа в сеть. Однако пользовательский основной файл кодируется, чтобы принимать видео в качестве входных данных и выполнять предсказание SegNet для каждого кадра в видеопоследовательности. Флаги компилятора и компоновщика, необходимые для построения исполняемого файла с помощью библиотеки OpenCV, обновляются в buildinfo в файле | segnet _ predict.m '.
Создать образец входного изображения для создания кода.
img = imread('peppers.png');
img = imresize(img,[360 480]);
Для создания кода CUDA используйте codegen и передать конфигурацию кода GPU и размер входов для и 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
drive(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE) | jetson(Пакет поддержки кодеров MATLAB для платформ NVIDIA Jetson и NVIDIA DRIVE)