此示例显示如何为使用深度学习的图像分段应用程序生成和部署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 GPU的GPU金宝app编码器支持包通过TCP/IP使用SSH连接来执行命令,同时在DRIVE平台上构建和运行生成的CUDA代码。因此,需要将目标平台与主机连接到同一网络,或者使用以太网交叉网线直接将单板与主机连接。请参考NVIDIA的文档,了解如何设置和配置您的主板。
要与NVIDIA硬件通信,必须使用驾驶函数。您必须知道目标板的主机名或IP地址、用户名和密码,才能创建实时硬件连接对象。例如,
hwobj = drive(“drive-px2-name”那'ubuntu'那'ubuntu');
注意:
在连接失败的情况下,在MATLAB命令行上报告了诊断错误消息。如果连接失败,则最可能的原因是IP地址或主机名不正确。
使用coder.checkGpuInstall函数并验证运行此示例所需的编译器和库是否正确设置。
envCfg = coder.gpuEnvConfig ('驾驶');envCfg。BasicCodegen = 1;envCfg。安静= 1;envCfg。HardwareObject = hwobj;coder.checkGpuInstall (envCfg);
net = getsegnet();
DAG网络包含91层,包括卷积、批处理归一化、池化、非池化和像素分类输出层。要看到网络的所有层,进入网。层
在MATLAB®命令窗口中。
这个例子用途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');
删除文件并返回原始文件夹。
清理