主要内容

部署和网络摄像头图像分类NVIDIA杰森TX2平台

这个例子展示了如何从DAGNetwork对象生成CUDA®代码和部署生成的代码在NVIDIA®杰森®TX2董事会使用GPU编码器™NVIDIA GPU的支持包。金宝app下面的例子使用了resnet50深入学习网络从USB摄像头视频图像进行分类。

先决条件

目标板需求

  • 英伟达杰森Tegra TX2嵌入式平台。

  • 以太网交叉电缆来连接目标板和主机PC(如果目标不能被连接到一个本地网络)。

  • USB摄像头连接到TX2。

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

  • 英伟达cuDNN图书馆在目标板上。

  • OpenCV库读取和显示在目标图像/视频。

  • 环境变量的目标编译器和库。信息支持版本的编译器和库及其设置,明白了金宝app安装和设置先决条件NVIDIA董事会(MATLAB编码器支持包为金宝appNVIDIA杰森和NVIDIA驱动平台)NVIDIA的董事会。

开发主机需求

验证NVIDIA支持包安装在金宝app主机上

使用checkHardware金宝appSupportPackageInstall函数来验证主机系统兼容运行这个示例。

checkHardware金宝appSupportPackageInstall ();

连接到NVIDIA硬件

GPU编码器支持NVIDIA金宝app GPU包使用SSH连接在TCP / IP来构建和运行时执行命令生成的CUDA代码在杰森平台上。你必须将目标平台连接到同一网络主机或者使用以太网交叉电缆董事会直接连接到主机。请参阅NVIDIA文档如何设置和配置你的董事会。

与NVIDIA硬件进行通信,您必须创建一个生活硬件连接对象使用杰森(MATLAB编码器支持包为金宝appNVIDIA杰森和NVIDIA驱动平台)函数。你必须知道主机名或IP地址,用户名和密码的目标板创建一个生活硬件连接对象。

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

在连接失败的情况下,诊断错误消息报道在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入口点函数使用一个pre-trained ResNet-50网络对图像进行分类。ResNet-50 DAG网络培训超过一百万图像从ImageNet数据库。输出包含类别分数属于每个类的图像。

类型resnet50_wrapper
ocvFlag函数= resnet50_wrapper (im) % # codegen %包装器函数来调用ResNet50预测函数。% 2019 - 2021版权MathWorks公司%这个例子使用OpenCV阅读帧从一个网络摄像头和%显示输出图像。更新buildinfo与OpenCV图书馆%上可用的目标。如果ocvFlag opencv_link_flags =“pkg-config——libs opencv4”;opencv_compile_flags =“pkg-config——cflags opencv4”;其他opencv_link_flags =“pkg-config——libs opencv”;opencv_compile_flags =“pkg-config——cflags填词opencv”;结束coder.updateBuildInfo (addLinkFlags, opencv_link_flags);coder.updateBuildInfo (addCompileFlags, opencv_compile_flags);%,以避免网络为每个运行的多个负载,我们使用持久% rnet持久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代码

生成一个CUDA可执行文件,可以部署在一个NVIDIA的目标,创建一个GPU编码器配置对象生成一个可执行的。

cfg = coder.gpuConfig (exe”);

使用coder.hardware杰森平台的功能来创建一个配置对象,并将其分配给硬件GPU代码配置对象的属性cfg

cfg。硬件= coder.hardware (英伟达杰森的);

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

cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);

在本例中,代码生成是通过使用图像作为输入。然而,摄像头流是美联储在部署后的输入可执行。

代码生成的示例图像输入

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

自定义主文件编码需要视频作为输入,并将视频序列的每一帧。自定义main_resnet50.cu文件是一个调用预测函数的包装器生成的代码。后加工步骤等显示输出在输入框添加主要使用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”);

另请参阅

对象

  • (MATLAB编码器支持包为金宝appNVIDIA杰森和NVIDIA驱动平台)|(MATLAB编码器支持包为金宝appNVIDIA杰森和NVIDIA驱动平台)

相关的话题