学生休息室

分享学生如何在日常项目中使用MATLAB和Simulink的技术和现实例子#学生成功#万博1manbetx

YOLOv2对象检测:将训练好的神经网络部署到NVIDIA嵌入式gpu

我们的上一篇博文他向我们介绍了如何使用MATLAB标记数据,设计深度神经网络,以及导入第三方预训练的网络。我们训练了一个YOLOv2网络来识别不同的竞争元素RoboSub-自主水下航行器(AUV)竞赛。查看我们训练的网络识别浮标和一个导航门在测试数据集中。

但接下来呢?在为RoboSub构建像AUV这样的自主、无束缚系统时,面临的挑战是将这些算法从桌面/开发环境转移到嵌入式计算机上,其特点是功耗要求低,但内存和计算能力也较低。记住:无论是生命还是自主系统,一切都是妥协。让我们深入研究如何使用MATLAB将这个网络部署到英伟达杰森.NVIDIA Jetson是一款具有CPU、GPU、PMIC、DRAM和闪存的高效节能系统模块(SOM),适用于边缘AI应用程序,具有多种配置规格。虽然此工作流程适用于NVIDIA Jetson TX2,但同样可以应用于其他NVIDIA嵌入式产品s manbetx 845

一、设置Jetson和主机

首先,让我们看看MATLAB主机和Jetson上所需的一些设置步骤。

MATLAB主机

GPU Coder有助于将MATLAB代码转换为NVIDIA Jetson的CUDA代码。下面是这个示例所需的产品列表。s manbetx 845

MathWorks产s manbetx 845品

  • MATLAB®(必需)
  • MATLAB Coder™(必需)
  • 并行计算工具箱™(必需)
  • 深度学习工具箱™(深度学习所需)
  • 用于深度学习库的GPU Coder接口(深度学习所需)
  • NVIDIA GPU万博1manbetx的GPU编码器支持包(需要将代码部署到NVIDIA GPU)
  • 图像处理工具箱™(推荐)
  • 计算机视觉工具箱™(推荐)
  • Embedded Coder®(推荐)
  • 万博1manbetx仿真软件®(推荐)

第三方库

作为参考,我们使用的是MATLAB R2020a;关于其他版本的适当库,请参考文档。

  • C/ c++编译器微软Visual Studio 2013 - 2019可用于窗户.为Linux使用GCC C/ c++编译器6.3.x.要检查编译器是否已经正确设置,使用以下命令:
setup c++
  • CUDA工具包和驱动程序: GPU Coder已在CUDA工具箱v10.1中测试学校网站编译器,cuFFTcuBLAScuSOLVER和Thrust库
  • CUDA深度神经网络库:NVIDIA CUDA®深度神经网络库(cuDNN)是一个用于深度神经网络的gpu加速原语库。GPU编码器已通过7.5.x版测试。下载文件并运行安装程序。
  • 英伟达TensorRT高性能深度学习推理优化器和运行时库,GPU Coder已通过v5.1.x测试。万博1manbetxR2019b及以后版本支持从Windows机器生成CUDA代码。
  • OpenCV库:需要开源计算机视觉库(OpenCV) v3.1.0。的OpenCV与计算机视觉工具箱一起发布的库没有所有必需的库,OpenCV安装程序也没有安装它们。因此,您必须下载OpenCV源代码并构建库并将其添加到路径中
  • CUDA工具包的ARM®和Linaro GCC 4.9使用gcc - linaro - 4.9 - 2016.02 - x86_64_aarch64 - linux - gnu释放tarball。

环境变量

一旦安装了所有的库,设置环境变量以将MATLAB指向这些库,当MATLAB会话结束时,这些环境变量将被擦除。将此代码添加到启动脚本中,以确保在启动MATLAB时设置了这些变量

setenv('CUDA_PATH','C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0');setenv(' nvida_cudnn ','C:\Program Files\NVIDIA GPU计算工具包\CUDA\cuDNN');setenv(' nvida_tensort ','C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\TensorRT');setenv(“OPENCV_DIR”、“C: \ Program Files \ opencv \构建的);setenv(“路径”,…['C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin;C:\Program Files\opencv\build\x64\vc15\bin'…采用“路径”)]);

英伟达杰森

安装完成后喷气背包在Jetson上,要运行这个示例,请安装简单的DirectMedia Layer (SDL v1.2)库在Jetson的终端上运行以下命令。

安装libsdl1.2debian

安装libsdl1.2-dev

方法中添加以下命令,在Jetson上设置环境变量$ HOME / . bashrcbash概要文件。使用sudo gedit $HOME/ .bashrc打开文件:

导出路径= / usr /地方/ cuda / bin:美元的道路

出口LD_LIBRARY_PATH = / usr /地方/ cuda / lib64: LD_LIBRARY_PATH美元

2建立与Jetson和验证设置的连接

下载所有必需的库之后,使用coder.checkGPUInstallApp以交互方式测试系统变量是否设置正确,以及MATLAB主机是否准备为Jetson生成和部署代码。

coder.checkGpuInstallApp;

截图

输入适当的设备参数并选择要运行的检查。基于组合检验选择MATLAB将:

  • 验证环境变量是否正确设置
  • 使用深度学习网络生成示例函数的代码
  • 编译并将其部署到Jetson
  • 生成带有检查结果的html报告

请查看此文档页了解更多信息。

3编写MATLAB代码进行代码生成

MATLAB代码和Simulin万博1manbetxk模型可以转换成低级代码,如C/ c++, CUDA, HDL等。这使您能够两全其美——用高级语言开发代码,然后将其实现为针对嵌入式设备优化的高效低级代码。以前从未使用过代码生成?查看本系列教程,了解代码生成和硬件支持的基础知识。万博1manbetx

我们的AUV依靠摄像头来观察周围的环境,所以我们的目标探测系统必须由摄像头组成,摄像头向Jetson提供视频流。我们的网络将处理图像流并返回感兴趣对象的像素位置、置信度评分和分类标签。当将MATLAB代码转换为C/ c++或在本例中为CUDA时,将您想要为其生成代码的功能包装在函数中,如下所示。GPU Coder将此MATLAB函数转换为CUDA函数,并生成在CUDA环境中执行此函数所需的任何其他文件。使用% # codegen检查代码生成兼容性的指令:

roboSubPredict()函数% # codegen创建一个Jetson对象来访问单板及其外围设备Hwobj = jetson;W = webcam(hwobj,1);d = imageDisplay(hwobj);从MAT文件加载训练过的网络persistent mynet if isempty(mynet) mynet = code . loaddeeplearningnetwork ('detectorYoloV2.mat');结束%进程循环对于I = 1:1e5 img =快照(w);[bboxes,scores,labels] = mynet.detect(img,'Threshold',0.6);[~,idx] = max(scores);注释图像中的检测。if ~isempty(bboxes) outImg = insertObjectAnnotation(img,'Rectangle', bboxes(idx), cellstr(labels(idx)));else outImg = img;终端形象(d, outImg);结束结束

这个函数加载并构造一个训练好的检测器对象-mynet从一个mat文件coder.loadDeepLearningNetwork函数。声明mynet作为持久化对象,将其存储在内存中,从而避免在每次函数调用时重新构造对象。的检测方法返回位置、置信度分数和分类标签。在学生比赛中,团队经常在比赛期间训练新的深度学习探测器,以应对自然光线和天气条件。网络在编译时加载,因此在几分钟内换出mat文件并重新构建代码,以便在给定条件下使用最合适的网络。

下一步是从连接到Jetson Board的相机外围设备获取图像流。NVIDIA GPU的GPU万博1manbetx编码器支持包将帮助您做到这一点。现在,对于这个演示,我们使用的是NVIDIA Jetson TX2,但如上所述,支持包也可以为其他NVIDIA gpu生成代码。万博1manbetx

NVIDIA GPU万博1manbetx的GPU编码器支持包

NVIDIA GPU万博1manbetx的GPU编码器支持包通过构建生成的CUDA代码并将其部署到目标硬件板的GPU和CPU上,自动在嵌入式NVIDIA GPU上部署MATLAB算法。它使您能够远程与NVIDIA目标通信并控制外围设备进行原型制作。检查下面的代码:

创建一个Jetson对象来访问电路板及其外围设备。

Hwobj = jetson;W = webcam(hwobj,1);d = imageDisplay(hwobj);

调用杰森函数创建一个Jetson对象,该对象表示到Jetson板的连接;使用此对象及其各种方法为连接到电路板的外围设备创建对象网络摄像头而且imageDisplay如上所示。有关Jetson对象的更多信息,请查看其文档页面.使用这些对象及其方法分别在显示设备上显示视频数据流和输出。

Img =快照(w);% w是前面创建的webcam对象图像(d, img);% d是imageDisplay对象

IV.生成代码并部署应用程序

最后,我们准备将应用程序部署到Jetson上。使用编码器配置对象配置构建,如下所示:

cfg = code . gpuconfig ('exe');cfg。硬件=编码器。硬件(NVIDIA杰森的);cfg.Hardware.BuildDir = '~/remoteBuildTest';cfg。GenerateExampleMain = ' generateecodeandcompile '

在这个配置中,我们指示GPU Coder自动生成一个主函数,并将代码编译成可执行文件。这可以根据您的应用程序进行调整,需要生成一个库集成到另一个代码库吗?选择适当的构建类型,如下所示

调用codegen命令并生成一个报告以查看生成的代码。

codegen('-config ', cfg,'roboSubPredict', '-report');

这将部署一个roboSubPredict.elf可执行文件在Jetson的构建目录中。导航到该目录以查看Jetson上生成的所有文件。

使用Jetson对象在MATLAB中启动和终止Jetson上的应用程序。

hwobj.runApplication(“roboSubPredict”);
hwobj.killApplication(“roboSubPredict”);

这是我们训练过的探测器作为CUDA代码在杰森号上运行的视频,从电脑屏幕上播放的视频中识别浮标和导航门。

要了解更多信息并下载本示例中使用的代码访问这个GitHub存储库而且观看这个视频

关键的外卖

我想以一些重要的结论作为结束:

  • 代码生成和部署可以帮助您在几分钟内获得生产就绪的代码,而无需调试低级代码的麻烦
  • 硬件支持包有助于将构建和部万博1manbetx署自动化到Jetson上
  • 更换检测器mat文件并在几分钟内重新生成和部署用于新网络的代码
  • 更改构建类型以生成可读、可编辑的代码,这些代码可以集成到其他代码库中
|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。