这个例子展示了如何从一个DAGNetwork对象生成CUDA®代码,并使用NVIDIA GPU的GPU Coder™支持包将生成的代码部署到NVIDIA®Jetson TX2板上。金宝app本例使用resnet50深度学习网络对USB摄像头视流中的图像进行分类。
目标板需求
NVIDIA Jetson Tegra TX2嵌入式平台。
以太网交叉网线用于连接目标板和主机PC(如果目标板不能通过本地网络连接)。
USB摄像头连接TX2。
NVIDIA CUDA工具包安装在目标板上。
NVIDIA cuDNN库在目标板上。
OpenCV库上的目标用于读取和显示图像/视频。
编译器和库目标上的环境变量。有关编译器和库的支持版本及其设置的信息,请参见金宝app安装和安装NVIDIA板的先决条件NVIDIA Jetson和金宝appNVIDIA DRIVE平台MATLAB编码器支持包NVIDIA的董事会。
开发主机需求
NVIDIA CUDA工具包和驱动程序。
编译器和库的环境变量。有关受支持的编译器和库版本的信息,请参见金宝app第三方硬件.有关设置环境变量,请参见设置先决产品下载188bet金宝搏.
使用checkHardware金宝appSupportPackageInstall
函数来验证主机系统与运行此示例的兼容性。
checkHardware金宝appSupportPackageInstall ();
NVIDIA GPU的GPU金宝app编码器支持包使用TCP/IP上的SSH连接来执行命令,同时在Jetson平台上构建和运行生成的CUDA代码。因此,您必须将目标平台与主机连接到同一个网络,或者使用以太网交叉网线将单板直接连接到主机。关于如何设置和配置您的主板,请参阅NVIDIA文档。
要与NVIDIA硬件通信,必须使用杰森
NVIDIA Jetson和金宝appNVIDIA DRIVE平台MATLAB编码器支持包函数。您必须知道目标板的主机名或IP地址、用户名和密码,才能创建一个活动的硬件连接对象。
hwobj =杰森(“主机”,“用户名”,“密码”);
在连接失败的情况下,将在MATLAB命令行上报告诊断错误消息。如果连接失败,最可能的原因是不正确的IP地址或主机名。
当有多个针对不同目标的活动连接对象时,代码生成器将在为其创建最近活动对象的目标上执行远程构建。若要选择执行远程构建的硬件板,请使用setupCodegenContext ()
方法对应的活动硬件对象。如果只创建了一个活动连接对象,则不需要调用此方法。
hwobj.setupCodegenContext;
使用coder.checkGpuInstall
函数来验证运行此示例所需的编译器和库是否已正确设置。
envCfg = coder.gpuEnvConfig (“杰森”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;envCfg。HardwareObject = hwobj;coder.checkGpuInstall (envCfg);
的resnet50_wrapper.m
入口点函数使用预先训练的ResNet-50网络对图像进行分类。ResNet-50是一个DAG网络,它对来自ImageNet数据库的100多万张图像进行了训练。输出包含图像所属的每个类的分类分数。
类型resnet50_wrapper
function out = resnet50_wrapper(im,ocvFlag) %#codegen % Wrapper函数调用ResNet50预测函数。这个例子使用OpenCV从网络摄像头读取帧并%显示输出图像。更新buildinfo链接OpenCV库%可用的目标。if ocvFlag opencv_link_flags = ' ' pkg-config——libs opencv4 ';Opencv_compile_flags = ' pkg-config——cflags opencv4 ';Else opencv_link_flags = ' pkg-config——libs opencv ';Opencv_compile_flags = ' pkg-config——cflags——libs opencv ';结束coder.updateBuildInfo (addLinkFlags, opencv_link_flags);coder.updateBuildInfo (addCompileFlags, opencv_compile_flags);为了避免每次运行时的多次网络负载,我们使用persistent % rnet; if isempty(rnet) rnet = resnet50(); end out = rnet.predict(im); end
使用pkg-config
帮助工具查询是否OpenCV 4。目标板上已安装X。此示例使用该信息更新构建信息,以链接到目标上可用的适当OpenCV库。
试一试OpenCVver = strtrim(系统(hwobj,“pkg-config——modversion opencv4”));isOpenCV4 = 1;抓OpenCVver = strtrim(系统(hwobj,“pkg-config——modversion opencv的));isOpenCV4 = 0;结束
要生成可部署在NVIDIA目标上的CUDA可执行文件,需要创建一个GPU编码器配置对象来生成可执行文件。
cfg = coder.gpuConfig (exe”);
使用coder.hardware
函数来为Jetson平台创建一个配置对象,并将其分配给硬件
属性cfg
.
cfg。硬件= coder.hardware (英伟达杰森的);
设置深度学习配置为“cudn”或“tensorrt”
cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);
在本例中,代码生成使用图像作为输入。然而,网络摄像头流在部署后被输入到可执行文件。
代码生成的示例图像输入
我=单(imread (“peppers.png”));[224224] im = imresize (im);
自定义主文件被编码为以视频作为输入,并对视频序列中的每一帧进行分类。自定义main_resnet50.cu
File是一个包装器,它在生成的代码中调用预测函数。使用OpenCV接口在主文件中添加了一些后处理步骤,比如在输入帧上显示输出。
cfg。CustomSource = fullfile (“main_resnet50.h”);cfg。CustomSource = fullfile (“main_resnet50.cu”);
生成CUDA代码并将其部署到目标上,使用codegen
函数,并传递GPU代码配置对象。在主机上进行代码生成之后,将复制生成的文件并在工作空间目录中的目标上构建。
codegen配置cfgarg游戏{im, coder.Constant (isOpenCV4)}resnet50_wrapper报告
使用。将synsetWords_resnet50文本文件从主机复制到目标设备putFile
命令。
hwobj.putFile (“synsetWords_resnet50.txt”, hwobj.workspaceDir);
使用runApplication
方法在目标硬件上启动应用程序。应用程序将位于工作区目录中。
hwobj.runApplication (“resnet50_wrapper”);
如果网络摄像头窗口在目标板上不可见,它可能被定向到不正确的显示。使用setDisplayEnvironment
命令用来设置用于重定向目标上的显示的显示环境。该值必须与显示美元
单板上设置的环境值。
使用killApplication
方法来杀死目标上正在运行的应用程序。
hwobj.killApplication (“resnet50_wrapper”);