主要内容

NVIDIA Jetson TX2平台上网络摄像头图像的部署和分类

此示例演示如何从DAGNETH对象生成CUDA®代码,并使用GPU编码器将生成的代码部署到NVIDIA®JETSON®TX2板上。™ NVIDIA GPU支持包。本例使用resnet50深度学习网络对USB网络摄像头视频流中的图像进行分类。金宝app

先决条件

目标板要求

  • NVIDIA Jetson Tegra TX2嵌入式平台。

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

  • 连接到TX2的USB摄像头。

  • 目标板上安装了NVIDIA CUDA工具包。

  • 目标板上的NVIDIA cuDNN库。

  • 目标上的OpenCV库,用于读取和显示图像/视频。

  • 编译器和库的目标上的环境变量。有关编译器和库的受支持版本及其设置的信息,请参阅金宝app安装和设置NVIDIA主板的先决条件(针对NVIDIA Jets金宝appon和NVIDIA驱动平台的MATLAB编码器支持包)对于NVIDIA板。

开发主机需求

验证主机上是否安装了NVID金宝appIA支持包

使用checkHardware金宝appSupportPackageInstall命令,以验证主机系统是否兼容运行此示例。

检查硬件支持包安装();金宝app

连接到NVIDIA硬件

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

要与NVIDIA硬件通信,必须使用杰森(针对NVIDIA Jets金宝appon和NVIDIA驱动平台的MATLAB编码器支持包)函数。您必须知道目标板的主机名或IP地址、用户名和密码,才能创建实时硬件连接对象。

hwobj=jetson(“主机名”,“用户名”,“密码”);

如果连接失败,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是一个DAG网络,训练了来自ImageNet数据库的100多万张图像。输出包含图像所属的每个类的分类分数。

类型resnet50_包装器
function out = resnet50_wrapper(im,ocvFlag) %#codegen % Wrapper函数调用ResNet50 predict函数。本示例使用OpenCV从网络摄像头读取帧并显示输出图像。更新buildinfo以链接OpenCV库% available on target。如果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; if isempty(rnet) rnet = resnet50(); end out = rnet.predict(im); end

获取目标上的OpenCV版本

使用包装配置用于查询目标板上是否安装了OpenCV 4.x的帮助工具。此示例使用该信息更新构建信息,以链接到目标板上可用的相应OpenCV库。

isOpenCV4 = 1;ocvVersion = hwobj.OpenCVVersion ();如果(str2double(ocvVersion(1)) <= 3) isOpenCV4 = 0;终止

在目标系统上生成并部署CUDA代码

要生成可部署到NVIDIA目标上的CUDA可执行文件,请创建用于生成可执行文件的GPU编码器配置对象。

cfg=coder.gpuConfig(“exe”);

使用编码器硬件函数创建用于Jetson平台的配置对象,并将其分配给硬件GPU代码配置对象的属性cfg

cfg.Hardware=coder.Hardware(“NVIDIA Jetson”);

将深度学习配置设置为“cudnn”或“tensorrt”

cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);

在本例中,代码生成使用图像作为输入。然而,网络摄像头流在部署后被提供一个输入给可执行文件。

用于代码生成的示例图像输入

我=单(imread (“peppers.png”));[224224] im = imresize (im);

自定义主文件被编码为将视频作为输入,并对视频序列中的每一帧进行分类。自定义main_resnet50.cu文件是在生成的代码中调用predict函数的包装器。使用OpenCV接口在主文件中添加后处理步骤,例如在输入帧上显示输出。

cfg.CustomSource=fullfile(“main_resnet50.h”);cfg.CustomSource=fullfile(“main_resnet50.cu”);

要生成CUDA代码并将其部署到目标,请使用编码基因函数,并传递GPU代码配置对象。在主机上进行代码生成之后,将复制生成的文件并在工作区目录中的目标上构建。

编码基因-配置cfg-args{im, coder.Constant (isOpenCV4)}resnet50_包装器报告

在目标上运行应用程序

属性将synsetWords_resnet50文本文件从主机复制到目标设备putFile命令

putFile(hwobj,“synsetWords_resnet50.txt”,hwobj.workspaceDir);

使用运行应用程序方法来在目标硬件上启动应用程序。应用程序将位于工作区目录中。

runApplication (hwobj“resnet50_包装器”);

如果网络摄像头窗口在目标板上不可见,则它可能指向了错误的显示器。请使用setDisplayEnvironment命令功能设置用于在目标上重定向显示的显示环境。该值必须与显示美元单板上设置的环境值。

在Jetson TX2上重置分类输出

关闭应用程序

使用killApplication方法来终止目标上正在运行的应用程序。

killApplication (hwobj“resnet50_包装器”);

另见

物体

  • (针对NVIDIA Jets金宝appon和NVIDIA驱动平台的MATLAB编码器支持包)|(针对NVIDIA Jets金宝appon和NVIDIA驱动平台的MATLAB编码器支持包)

相关的话题