文件

NVIDIA DRIVE上的语义分割

此示例显示如何为使用深度学习的图像分段应用程序生成和部署CUDA®可执行文件。它使用用于NVIDIA GPU的GPU Cod金宝apper™支持包在NVIDIA Drive™平台上部署可执行文件。此示例在主机上执行代码生成,并使用支持包的远程构建功能在目标平台上构建生成的代码。金宝app有关语义分割的更多信息,请参阅语义分段网络的代码生成

先决条件

目标板要求

  • NVIDIA驱动PX2嵌入式平台。

  • 用于连接目标板和主机PC(如果目标板无法连接本地网络)的以太网交叉线缆。

  • NVIDIA CUDA工具包安装在电路板上。

  • NVIDIA cuDNN库(v5及以上)上的目标。

  • OpenCV 3.0或更高版本的读取和显示图像/ video的目标

  • 编译器和库的目标环境变量。有关编译器和库的支持版本的信息及其设置,请参阅金宝app安装和设置NVIDIA板的先决条件

开发主机要求

  • 用于代码生成的GPU编码器。有关概述和教程,请访问GPU编码器产品页面

  • 深度学习工具箱™使用DAG网络对象。

  • GPU编码器接口,用于深度学习库支持包。金宝app要安装此支持包,请使用金宝app附加资源管理器

  • NVIDIA CUDA Toolkit在主机上。

  • 主机上编译器和库的环境变量。有关编译器和库支持的版本的信息,请参见金宝app第三方产品下载188bet金宝搏.有关设置环境变量,请参见环境变量

创建文件夹并复制相关文件

以下代码行在当前工作目录(主机)中创建一个文件夹,并将所有相关文件复制到此文件夹中。如果在此文件夹中无法生成文件,请在运行此通信程序之前更改当前工作目录。

gpucoderdemo_setup (“segnet_deploy”);

连接到NVIDIA硬件

NVIDIA GPU的GPU金宝app编码器支持包通过TCP/IP使用SSH连接来执行命令,同时在DRIVE平台上构建和运行生成的CUDA代码。因此,需要将目标平台与主机连接到同一网络,或者使用以太网交叉网线直接将单板与主机连接。请参考NVIDIA的文档,了解如何设置和配置您的主板。

要与NVIDIA硬件通信,必须使用驾驶函数。您必须知道目标板的主机名或IP地址、用户名和密码,才能创建实时硬件连接对象。例如,

hwobj = drive(“drive-px2-name”'ubuntu''ubuntu');

注意:

在连接失败的情况下,在MATLAB命令行上报告了诊断错误消息。如果连接失败,则最可能的原因是IP地址或主机名不正确。

验证GPU环境

使用coder.checkGpuInstall函数并验证运行此示例所需的编译器和库是否正确设置。

envCfg = coder.gpuEnvConfig ('驾驶');envCfg。BasicCodegen = 1;envCfg。安静= 1;envCfg。HardwareObject = hwobj;coder.checkGpuInstall (envCfg);

获得预先训练的SegNet DAG网络对象

net = getsegnet();

DAG网络包含91层,包括卷积、批处理归一化、池化、非池化和像素分类输出层。要看到网络的所有层,进入网。层在MATLAB®命令窗口中。

使用GPU编码器为目标生成CUDA代码

这个例子用途segnet_predict.m.,是代码生成的入口点函数。要生成可部署到NVIDIA目标上的CUDA可执行文件,创建一个GPU代码配置对象来生成可执行文件。

cfg = coder.gpuconfig('可执行程序');

当有多个针对不同目标的实时连接对象时,代码生成器对创建最近实时对象的目标执行远程构建。要选择用于执行远程构建的硬件板,请使用setupcodegencontext()方法。如果只创建了一个活动连接对象,则没有必要调用此方法。

hwobj.setupCodegenContext;

使用编码器。硬件功能为驱动器平台创建配置对象并将其分配给硬件属性CFG.

cfg.hardware = coder.hardware(“NVIDIA驱动”);

使用BuildDir属性指定目录以在目标上执行远程构建过程。如果目标上不存在指定的构建目录,则该软件将创建具有给定名称的目录。如果没有分配任何值cfg.Hardware.BuildDir,远程构建过程会发生在最后一个指定的构建目录中。如果没有存储的构建目录值,则构建过程将在与实时连接对象关联的用户的主目录中进行。

cfg.hardware.builddir =.的~ /;

某些NVIDIA平台,如驱动器PX2包含多个GPU。在这些平台上,使用SelectCudadevice.GPU配置对象中的属性选择特定的GPU。

cfg.GpuConfig.SelectCudaDevice = 0;

习俗主要File是在生成的代码中调用predict函数的包装器。后期处理步骤使用OpenCV接口添加到主文件中。segnet预测的输出是一个11通道的图像。这里的11个频道代表了11个不同班级的预测分数。在后期处理中,给每个像素分配一个类标签,该类标签在11个通道中得分最大。每个类都与独特的颜色相关联,便于可视化。最后的输出是使用OpenCV显示的imshow函数。

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

在本例中,代码生成使用图像作为网络的输入来完成。然而,自定义主文件被编码为以视频为输入,并对视频序列中的每一帧进行分段预测。使用OpenCV库构建所需的编译器和链接器标志在buildinfo in中更新segnet_predict.m.文件。

生成用于代码生成的样本图像输入。

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

要生成CUDA代码,使用Codegen.函数并通过GPU代码配置对象。在主机上发生代码生成后,生成的文件将复制并构建目标。

Codegen(“配置”,cfg,'segnet_predict''-args',{img},“报告”);

在目标上运行可执行文件

将输入的测试视频复制到目标工作区目录,使用workspaceDir属性。属性的路径Codegen.文件夹在目标上。

hwobj.putFile (“CamVid.avi”, hwobj.workspaceDir);

使用runApplication ()硬件对象的方法在目标硬件上启动exectuable。

hwobj.runApplication ('segnet_predict'“CamVid.avi”);

分割后的图像输出显示在连接到目标板的监视器上的窗口中。

可以在主机上的MATLAB环境中杀死目标上正在运行的可执行文件killapplication()硬件对象的方法。此方法使用应用程序的名称而不是可执行文件。

hwobj.killapplication('segnet_predict');

清理

删除文件并返回原始文件夹。

清理