部署和摄像头图像的分类上NVIDIA特森TX2平台

本示例演示如何从DAGNetwork对象生成CUDA®代码,并使用针对NVIDIA GPU的GPU Coder™支持包将生成的代码部署到NVIDIA®Jetson TX2板上。万博1manbetx本例使用resnet50深度学习网络对USB摄像头视频流中的图像进行分类。

先决条件

目标板的要求

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

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

  • USB摄像头连接到TX2。

  • NVIDIA CUDA工具包安装在电路板上。

  • NVIDIA cuDNN库(v5或更高版本)的目标。

  • 的OpenCV 3.0(或更高)上的目标库,用于读取和显示图像/视频。

  • 对目标的编译器和库环境变量。有关编译器和库及其设置的支持版本的信息,请参阅万博1manbetx安装和设置先决条件NVIDIA主板(GPU编码器支持包的万博1manbetxNVIDIA GPU)的NVIDIA板。

开发主机需求

验证主机上支持NVIDIA安万博1manbetx装包

使用checkHardware万博1manbetxSupportPackageInstall函数来验证主机系统是否兼容运行此示例。

checkHardware万博1manbetxSupportPackageInstall();

连接到NVIDIA硬件

NVIDIA GPU的GPU万博1manbetx编码器支持包使用TCP/IP上的SSH连接来执行命令,同时在Jetson平台上构建和运行生成的CUDA代码。因此,您必须将目标平台连接到与主机计算机相同的网络,或使用以太网交叉电缆将板子直接连接到主机计算机。关于如何设置和配置板,请参阅NVIDIA文档。

要与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入口点函数使用预先训练好的ResNet-50网络对图像进行分类。ResNet-50是一个DAG网络,从ImageNet数据库中提取了100多万张图像。输出包含图像所属的每个类的分类分数。

类型resnet50_wrapper
功能OUT = resnet50_wrapper(IM)%#代码生成%包装功能来调用ResNet50预测函数。%版权所有2019 MathWorks公司%该实施例使用了OpenCV用于从网络照相机%阅读框和显示输出图像。更新buildinfo与目标可用%OpenCV库的链接。opencv_link_flags = '`pkg配置--cflags --libs opencv`';coder.updateBuildInfo( 'addLinkFlags',opencv_link_flags);%为了避免网络每次运行的多个负载,我们用执着%RNET持续RNET;如果的isEmpty(RNET)RNET = resnet50();端部转出= rnet.predict(IM);结束

生成和部署CUDA代码对目标

这个程序使用resnet50_wrapper.m作为用于代码生成的入口点函数。为了产生可在到目标NVIDIA部署的可执行CUDA,创建一个GPU编码器配置对象,用于生成一个可执行文件。

CFG = coder.gpuConfig('可执行程序');

使用coder.hardware函数为Jetson平台创建配置对象,并将其分配给硬件所述GPU代码配置对象的属性CFG

cfg.Hardware = coder.hardware(“NVIDIA特森”);

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

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

在本例中,代码生成是使用image作为输入完成的。但是,webcam流在部署后被输入到可执行文件中。

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

我=单(imread (“peppers.png”));IM = imresize(1M,[224224]);

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

cfg.CustomSource =完整文件('main_resnet50.h');cfg.CustomSource =完整文件('main_resnet50.cu');

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

代码生成-configCFG-args{我}resnet50_wrapper报告

运行目标上的应用

方法将synsetWords_resnet50文本文件从主机复制到目标设备putFile命令。

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

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

hwobj.runApplication ('resnet50_wrapper');

在杰特森TX2 RESNET分类输出

关闭应用程序

使用killApplication硬件对象的方法杀死目标上的运行的应用程序。

hwobj.killApplication('resnet50_wrapper');