本示例演示如何从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板。
开发主机需求
英伟达CUDA工具包和驱动程序。
深度学习工具箱™使用一个DAGNetwork对象。
GPU编码器接口深度学习库的支持包。万博1manbetx要安装此支持包,使用万博1manbetx加载项资源管理器。
GPU编码器支持包的万博1manbetxNVIDIA GPU。要安装此支持包,使用万博1manbetx加载项资源管理器。
环境变量的编译器和库。有关编译器和库的支持版本的信息,请参阅万博1manbetx第三方产品s manbetx 845。有关设置环境变量的内容,请参见设置前提条件的产品s manbetx 845。
使用checkHardware万博1manbetxSupportPackageInstall
函数来验证主机系统是否兼容运行此示例。
checkHardware万博1manbetxSupportPackageInstall();
NVIDIA GPU的GPU万博1manbetx编码器支持包使用TCP/IP上的SSH连接来执行命令,同时在Jetson平台上构建和运行生成的CUDA代码。因此,您必须将目标平台连接到与主机计算机相同的网络,或使用以太网交叉电缆将板子直接连接到主机计算机。关于如何设置和配置板,请参阅NVIDIA文档。
要与NVIDIA硬件通信,必须使用特森
函数。要创建活动硬件连接对象,您必须知道目标板的主机名或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
功能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);结束
这个程序使用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');
使用killApplication
硬件对象的方法杀死目标上的运行的应用程序。
hwobj.killApplication('resnet50_wrapper');