学生休息室

分享学生如何在日常项目中使用Matlab和Simulink的技术和现实生活示例#studentsuccess金宝app

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

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

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

一、安装Jetson和主机

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

Matlab主人

GPU编码器有助于将MATLAB代码转换为NVIDIA JETSON的CUDA代码。以下是此示例所需产品列表。下载188bet金宝搏

MathWorks产下载188bet金宝搏品

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

第三方库

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

  • C / c++编译器-Microsoft Visual Studio 2013 - 2019可用于窗户.为Linux.使用C/ c++编译器6.3.x.要检查编译器是否已正确设置,请使用以下命令:
mex -setup c ++
  • CUDA工具包和驱动程序: GPU编码器已通过CUDA工具包v10.1测试NVCC.编译器,袖口cuBLASCusolver.,和推力库
  • CUDA深神经网络图书馆(CUDNN):NVIDIACUDA®深神经网络库(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发布tarball。

环境变量

一旦安装了所有的库,设置环境变量使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'…采用“路径”)]);

nvidia jetson.

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

安装libsdl1.2debian

安装libsdl1.2-dev

接下来,通过添加以下命令,在Jetson上设置环境变量$ 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);%从垫文件加载训练的网络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,'矩形',Bboxes(IDX),CellStr(标签(IDX)));否则Outimg = IMG;最终图像(D,OUTIMG);结束

这个函数加载并构造一个经过训练的检测器对象-mynet来自垫子文件 - 与Coder.LoadDeePlearningnetwork.函数。声明mynet作为持久化,将其存储在内存中,并不必在每次函数调用时重新构建对象。的检测对象的方法返回位置,置信度和分类标签。在学生竞赛中,竞争期间培训新的深度学习探测器,以反击自然照明和天气条件。该网络在编译时加载,因此将MAT文件交换并重建代码,以在几分钟内在给定条件下使用最合适的网络。

下一步是从连接到Jetson板的相机外设获取图像流。NVIDIA GPU的GPU金宝app编码器支持包将帮助您执行此操作。现在,对于这次演示我们正在使用NVIDIA Jetson TX2,但如上所述,支持包可以为其他NVIDIA GPU生成代码。金宝app

GPU编码器支持NV金宝appIDIA 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对象配置Build,如下所示:

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

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

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

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

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

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

hwobj.runapplication('robosubpredict');
hwobj.killApplication(“roboSubPredict”);

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

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

关键的外卖

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

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

评论

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