NVIDIA Jetson TX2平台上网络摄像头图像的部署和分类
这个例子展示了如何从DAGNetwork对象生成CUDA®代码,并使用NVIDIA GPU的GPU Coder™支持包将生成的代码部署到NVIDIA®Jetson®TX2板上。本例使用resnet50深度学习网络对USB网络摄像头视频流中的图像进行分类。
先决条件
目标板需求
NVIDIA Jetson Tegra TX2嵌入式平台。
以太网交叉网线,用于连接目标板和主机PC(如果目标板无法连接到本地网络)。
USB摄像头连接到TX2。
NVIDIA CUDA工具包已安装在目标板上。
目标板上的NVIDIA cuDNN库。
目标上的OpenCV库用于读取和显示图像/视频。
编译器和库的目标上的环境变量。有关编译器和库的支持版本及其设置的信息,请参见NVIDIA板安装和设置先决条件(针对NVIDIA Jetson和NVIDIA DRIVE平台的MATLAB编码器支持包)NVIDIA的董事会。
开发主机需求
NVIDIA CUDA工具包和驱动程序。
编译器和库的环境变量。有关编译器和库的支持版本的信息,请参见第三方硬件.有关设置环境变量,请参见设置必备产品2022世界杯八强谁会赢?.
验证主机上NVIDIA支持包的安装
使用checkHardwareSupportPackageInstall
函数来验证主机系统与运行此示例相兼容。
checkHardwareSupportPackageInstall ();
连接到NVIDIA硬件
NVIDIA GPU的GPU编码器支持包使用TCP/IP上的SSH连接来执行命令,同时在Jetson平台上构建和运行生成的CUDA代码。因此,您必须将目标平台连接到与主机相同的网络,或者使用以太网交叉电缆将板直接连接到主机。关于如何设置和配置您的板,请参阅NVIDIA文档。
方法来与NVIDIA硬件通信,必须创建活动硬件连接对象杰森
(针对NVIDIA Jetson和NVIDIA DRIVE平台的MATLAB编码器支持包)函数。要创建活动硬件连接对象,必须知道目标板的主机名或IP地址、用户名和密码。例如,当第一次连接到目标板时,使用以下命令为Jetson硬件创建一个活动对象:
hwobj =杰森(“主机”,“用户名”,“密码”);
jetson对象重用最近成功连接到jetson硬件的这些设置。这个示例使用存储在内存中的设置建立到Jetson硬件的SSH连接。
hwobj =杰森;
正在检查目标上的CUDA可用性…正在检查目标系统路径中的'nvcc'…正在检查目标上cuDNN库的可用性…检查目标上的TensorRT库可用性…前提库的检查已经完成。收集硬件信息…正在检查目标上的第三方库可用性…完成硬件详细信息的收集。单板名称:NVIDIA Jetson TX2 CUDA版本:10.0 cuDNN版本:7.6 TensorRT版本:6.0 GStreamer版本:1.14.5 V4L2版本:1.14.2- SDL版本:1.2 OpenCV版本:4.1.1可用网络摄像头:可用gpu: NVIDIA Tegra X2可用数字引脚:7 11 12 13 15 16 18 19 21 22 23 24 29 31 32 33 35 36 37 38 40
在连接失败的情况下,在MATLAB命令行上报告一个诊断错误消息。如果连接失败,最可能的原因是IP地址或主机名不正确。
当不同目标有多个活动连接对象时,代码生成器在为其创建最近活动对象的目标上执行远程构建。若要选择用于执行远程构建的硬件板,请使用setupCodegenContext ()
方法。如果只创建了一个活动连接对象,则不需要调用此方法。
hwobj.setupCodegenContext;
在目标机上验证GPU环境
使用coder.checkGpuInstall
函数来验证运行此示例所需的编译器和库是否已正确设置。
envCfg = coder.gpuEnvConfig (“杰森”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;envCfg。HardwareObject = hwobj;coder.checkGpuInstall (envCfg);
ResNet-50入口点函数
的resnet50_wrapper.m
入口点函数使用预先训练的ResNet-50网络对图像进行分类。ResNet-50是一个经过ImageNet数据库中超过100万张图像训练的DAG网络。输出包含图像所属的每个类的分类分数。
类型resnet50_wrapper
函数out = resnet50_wrapper(im,ocvFlag) %#codegen %包装器函数调用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);为了避免每次运行时网络的多重负载,我们使用持久的% rnet; if isempty(rnet) rnet = resnet50(); end out = rnet.predict(im); end
获取目标上的OpenCV版本
使用pkg-config
帮助工具查询OpenCV 4。X已安装在目标板上。本示例使用该信息更新构建信息,以链接到目标上可用的适当OpenCV库。
isOpenCV4 = 1;ocvVersion = hwobj.OpenCVVersion ();如果(str2double(ocvVersion(1)) <= 3) isOpenCV4 = 0;结束
在目标上生成和部署CUDA代码
要生成一个可以部署到NVIDIA目标上的CUDA可执行文件,请创建一个用于生成可执行文件的GPU编码器配置对象。
cfg = coder.gpuConfig (exe”);
使用coder.hardware
函数为Jetson平台创建一个配置对象,并将其分配给硬件
属性的图形处理器代码配置对象cfg
.
cfg。硬件= coder.hardware (英伟达杰森的);
将深度学习配置设置为“cudnn”或“tensort”
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
命令。
putFile (hwobj“synsetWords_resnet50.txt”, hwobj.workspaceDir);
使用runApplication
方法在目标硬件上启动应用程序。应用程序将位于工作区目录中。
runApplication (hwobj“resnet50_wrapper”);
如果网络摄像头窗口在目标板上不可见,则可能指向了错误的显示。使用setDisplayEnvironment
函数设置用于重定向目标上的显示的显示环境。该值必须与显示美元
板上设置的环境值。
Jetson TX2上的Resnet分类输出
关闭应用程序
使用killApplication
方法来终止目标上正在运行的应用程序。
killApplication (hwobj“resnet50_wrapper”);
另请参阅
对象
相关的话题
- 在NVIDIA硬件上构建并运行可执行文件
- 使用GPU编码器应用程序在NVIDIA硬件上构建和运行可执行程序
- 停止或重新启动在NVIDIA硬件上运行的可执行文件(针对NVIDIA Jetson和NVIDIA DRIVE平台的MATLAB编码器支持包)
- 在NVIDIA硬件上运行Linux命令(针对NVIDIA Jetson和NVIDIA DRIVE平台的MATLAB编码器支持包)