学生休息室

分享技术和现实生活的例子,学生可以如何使用MATLAB和Simulink在他们的日常项目#学生成功金宝app

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

我们的以前的博文,指导我们使用MATLAB标记数据,设计深度神经网络,以及导入第三方预训练网络。我们训练了一个YOLOv2网络,以识别来自RoboSub自主水下航行器(AUV)竞赛。查看我们训练有素的网络识别浮标和导航门在测试数据集。

但是下一个什么?当为RoboSub构建一个自主的、无拴系的系统(如AUV)时,挑战在于将这些算法从桌面/开发环境转移到嵌入式计算机上,其特点是功耗要求低,但内存和计算能力也较低。记住:无论是生命系统还是自主系统,一切都是妥协。让我们深入研究如何使用MATLAB将这个网络部署到英伟达捷森酒店. NVIDIA Jetson是一种具有CPU、GPU、PMIC、DRAM和闪存的节能模块上系统(SOM),适用于各种配置规格的边缘AI应用程序。虽然这个工作流是针对英伟达JethsTx2,但同样可以应用于其他NVIDIA嵌入式产品下载188bet金宝搏

一、安装Jetson和主机

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

MATLAB主机

GPU编码器帮助转换MATLAB代码为NVIDIA Jetson CUDA代码。下面是本示例所需产品的列表。下载188bet金宝搏

MathWorks产下载188bet金宝搏品

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

第三方库

作为参考,我们使用MATLAB R2020a;有关其他版本的相应库,请参阅文档。

  • C / c++编译器-Microsoft Visual Studio 2013 - 2019可用于窗户.为Linux使用C/ c++编译器6.3.x. 要检查编译器是否已正确设置,请使用以下命令:
墨西哥人设置c++
  • CUDA工具包和驱动程序: GPU编码器已通过CUDA工具包v10.1测试nvcc编译器,卡夫特,cuBLAS,库索尔弗,和推力库
  • CUDA深层神经网络库(cuDNN):NVIDIA CUDA®深度神经网络库(CUDNN)是一个用于深度神经网络的GPU加速原语库。GPU编码器已经用v7.5.x进行了测试。下载文件并运行安装程序。
  • 英伟达TensorRT:高性能深度学习推理优化器和运行时库,GPU编码器已测试与v5.1.x。金宝app在R2019b及更高版本中支持从Windows机器生成CUDA代码。
  • OpenCV库: Open Source Computer Vision Library (OpenCV) v3.1.0是必需的。的OpenCV计算机视觉工具箱附带的库没有所有必需的库,OpenCV安装程序也没有安装它们。因此,您必须下载OpenCV源代码并构建库并将其添加到路径中
  • CUDA工具包的ARM®和Linaro GCC 4.9使用gcc - linaro - 4.9 - 2016.02 - x86_64_aarch64 - linux - gnu释放柏油球。

环境变量

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

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

英伟达捷森酒店

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

安装libsdl1.2debian

安装libsdl1.2-dev

接下来,通过将以下命令添加到$HOME/.bashrcbash配置文件的文件。使用sudo gedit $HOME/ .bashrc打开文件:

导出路径=/usr/local/cuda/bin:$PATH

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

2与Jetson建立连接并验证设置

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

coder.checkGpuInstallApp;

截图

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

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

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

3编写MATLAB代码用于代码生成

MATLAB代码和Simulin金宝appk模型可以转换为C/ c++、CUDA、HDL等底层代码。这使您能够两全其美——用高级语言开发代码,然后将其作为高效的底层代码实现,并针对嵌入式设备进行优化。以前从未使用过代码生成?本系列教程介绍了代码生成和硬件支持的基础知识。金宝app

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

roboSubPredict()函数% # codegen%创建一个Jetson对象来访问主板及其外围设备hwobj =杰森;w =摄像头(hwobj, 1);d = imageDisplay (hwobj);%从MAT文件加载经过训练的网络mynet = code . loaddeeplearningnetwork ('detectorYoloV2.mat');结束%过程循环For I = 1:1e5 img = snapshot(w);[bboxes、分数、标签]= mynet.detect (img,“阈值”,0.6);[~, idx] = max(分数);%在图像中注释检测。如果~isempty(bboxes)outImg=insertObjectAnnotation(img,'Rectangle',bboxes(idx),cellstr(labels(idx));else out img=img;结束图像(d,outImg);结束

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

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

NVIDIA GPU金宝app的GPU编码器支持包

GPU Coder 金宝appSupport Package for NVIDIA GPU通过构建生成的CUDA代码并将其部署到目标硬件板的GPU和CPU上,实现MATLAB算法在嵌入式NVIDIA GPU上的自动化部署。它使您能够与NVIDIA目标进行远程通信,并控制用于原型设计的外围设备。检查下面的代码:

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

hwobj =杰森;w =摄像头(hwobj, 1);d = imageDisplay (hwobj);

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

img=快照(w);% w是之前创建的网络摄像机对象图像(d,img);% d是imageDisplay对象

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

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

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

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

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

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

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

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

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

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

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

关键的外卖

我想以一些关键的收获作为结尾:

  • 代码生成和部署可帮助您在几分钟内获得生产就绪代码,而无需调试低级代码
  • 硬件支持包帮助自动化在Je金宝apptson上的构建和部署
  • 替换探测器mat文件并在几分钟内重新生成和部署新网络的代码
  • 更改构建类型以生成可集成到其他代码库中的可读、可编辑的代码
|

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。