基于NVIDIA DRIVE的语义分割
这个例子展示了如何为使用深度学习的图像分割应用程序生成和部署CUDA®可执行文件。它使用NVIDIA GPU的GPU Coder™支持包在NVIDIA DRIVE™平台上部署可执行文件。本示例在主机上执行代码生成,并使用支持包的远程构建功能在目标平台上构建生成的代码。有关语义分割的更多信息,请参见语义分割网络的代码生成.
先决条件
目标板要求
NVIDIA DRIVE PX2嵌入式平台。
用于连接目标板和主机PC的以太网交叉网线(如果目标板无法连接到本地网络)。
NVIDIA CUDA工具包安装在板上。
目标上的NVIDIA cuDNN库(v5及以上)。
目标上的OpenCV 3.0或更高版本的库用于读取和显示图像/视频
目标上用于编译器和库的环境变量。有关编译器和库的支持版本及其设置的信息,请参见安装和设置NVIDIA板的先决条件.
开发主机要求
用于代码生成的GPU Coder (TM)。有关概述和教程,请访问GPU Coder产品页面.
深度学习工具箱™使用DAG网络对象。
GPU编码器接口的深度学习库支持包。要安装此支持包,请使用扩展浏览器.
主机上的NVIDIA CUDA工具包。
主机上用于编译器和库的环境变量。有关编译器和库的受支持版本的信息,请参见第三方产品2022世界杯八强谁会赢?.有关设置环境变量,请参见环境变量.
创建一个文件夹并复制相关文件
下面这行代码在当前工作目录(主机)中创建了一个文件夹,并将所有相关文件复制到该文件夹中。如果不能在此文件夹中生成文件,请在运行此命令之前更改当前工作目录。
gpucoderdemo_setup (“segnet_deploy”);
连接到NVIDIA硬件
NVIDIA GPU的GPU编码器支持包使用TCP/IP上的SSH连接来执行命令,同时在DRIVE平台上构建和运行生成的CUDA代码。因此,必须将目标平台连接到与主机相同的网络中,或者使用以太网交叉电缆将单板直接连接到主机。有关如何设置和配置您的电路板,请参阅NVIDIA文档。
要与NVIDIA硬件通信,必须使用开车函数。创建硬件活连接对象时,需要知道目标板的主机名或IP地址、用户名和密码。例如,
Hwobj = drive(“drive-px2-name”,ubuntu的,ubuntu的);
注意:
在连接失败的情况下,MATLAB命令行上报告诊断错误消息。如果连接失败,最有可能的原因是错误的IP地址或主机名。
检查GPU环境
使用coder.checkGpuInstall函数并验证运行此示例所需的编译器和库是否正确设置。
envCfg = code . 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 = code . gpuconfig (exe”);
当不同目标有多个活动连接对象时,代码生成器将在为其创建最近活动对象的目标上执行远程构建。若要选择执行远程构建的硬件板,请使用setupCodegenContext ()
各自活动硬件对象的方法。如果只创建了一个活动连接对象,则没有必要调用此方法。
hwobj.setupCodegenContext;
使用coder.hardware函数为DRIVE平台创建一个配置对象,并将其分配给硬件
代码配置对象的属性cfg
.
cfg。硬件= code . Hardware (“NVIDIA驱动”);
使用BuildDir
属性指定在目标上执行远程生成过程的目录。如果指定的构建目录在目标上不存在,那么软件将创建一个具有给定名称的目录。如果没有赋值cfg.Hardware.BuildDir
,则远程构建过程发生在最后指定的构建目录中。如果没有存储生成目录值,则生成过程将在与活动连接对象关联的用户的主目录中进行。
cfg.Hardware.BuildDir =的~ /;
某些NVIDIA平台(如DRIVE PX2)包含多个gpu。在这样的平台上,使用SelectCudaDevice
属性,选择指定的图形处理器。
cfg. gpconfig . selectcudadevice = 0;
自定义主要File是一个包装器,在生成的代码中调用预测函数。使用OpenCV接口将后处理步骤添加到主文件中。分段预测的输出是一个11通道的图像。这里的十一个通道代表了十一个不同类别的预测分数。在后处理中,每个像素被分配一个在11个通道中得分最高的类标签。每个类都与独特的颜色相关联,以便可视化。使用OpenCV显示最终输出imshow
函数。
cfg。CustomSource = fullfile(“main.cu”);
在本例中,代码生成使用图像作为网络输入。然而,自定义主文件被编码为将视频作为输入,并对视频序列中的每一帧进行分段预测。使用OpenCV库构建所需的编译器和链接器标志在buildinfo中更新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”);
清理
删除文件并返回到原始文件夹。
清理