文档

NVIDIA DRIVE上的语义分割

这个例子展示了如何为使用深度学习的图像分割应用程序生成和部署CUDA®可执行文件。它使用NVIDIA GPU的GPU编码器™支持金宝app包来部署NVIDIA DRIVE™平台上的可执行文件。本例在主机上执行代码生成,并通过使用支持包的远程构建功能在目标平台上构建生成的代码。金宝app有关语义分割的更多信息,请参见语义分割网络的代码生成

先决条件

目标板需求

  • NVIDIA驱动PX2嵌入式平台。

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

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

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

  • OpenCV 3.0或更高版本的库上的目标,用于读取和显示图像/视频

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

开发主机需求

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

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

  • GPU编码器接口深度学习库支持包。金宝app要安装此支持包,请使用金宝app扩展浏览器

  • NVIDIA CUDA工具包上的主机。

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

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

下面的代码行将在当前工作目录(host)中创建一个文件夹,并将所有相关文件复制到该文件夹中。如果无法在此文件夹中生成文件,请在执行此命令之前更改当前工作目录。

gpucoderdemo_setup (“segnet_deploy”);

连接到NVIDIA硬件

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

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

hwobj =驱动(“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网络对象

网= getSegNet ();

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

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

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

cfg = coder.gpuConfig (exe”);

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

hwobj.setupCodegenContext;

使用coder.hardware函数创建DRIVE平台的配置对象,并将其分配给硬件属性cfg

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

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

cfg.Hardware.BuildDir =的~ /

某些NVIDIA平台(如DRIVE PX2)包含多个gpu。在这样的平台上,使用SelectCudaDevice属性,选择指定的图形处理器。

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”“参数”{img},“报告”);

在目标上运行可执行文件

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

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

使用runApplication ()方法来在目标硬件上启动可执行文件。

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

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

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

hwobj.killApplication (“segnet_predict”);

清理

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

清理