学生休息室

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

YOLOv2对象检测:部署训练神经网络嵌入NVIDIA gpu

我们的以前的博文通过使用MATLAB标签数据,走我们,和设计深层神经网络,以及导入第三方pre-trained网络。我们训练YOLOv2网络来识别不同的竞争的元素RoboSub——自主水下航行器(AUV)的竞争。看到我们的训练网络识别浮标和导航门在测试数据集。

但是下一个什么?在构建一个自治时,无线系统像一个AUV RoboSub、面临的挑战是把这些算法从一个桌面/开发环境到嵌入式计算机,以一个低功率需求,也降低了内存和计算能力。记住:无论是生活或自治系统,一切都是妥协?。让我们深入使用MATLAB来部署这个网络英伟达杰森。NVIDIA杰森是一种权力有效System-on-Module (SOM)和CPU、GPU, PMIC, DRAM和闪存边AI的应用程序有多种配置规范。虽然这个工作流是NVIDIA的杰森,TX2,同样可以应用到其他NVIDIA嵌入式产品s manbetx 845

即设置杰森和主机

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

MATLAB主机

GPU编码器帮助MATLAB代码转化为NVIDIA的CUDA代码杰森。这是一个对于这个示例所需的产品列表。s manbetx 845

MathWorks产s manbetx 845品

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

第三方库

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

  • C / c++编译器-微软Visual Studio 2013 - 2019可用于窗户。为Linux使用GCC 6.3.x C / c++编译器。检查编译器是否已经正确设置,使用以下命令:
墨西哥人设置c++
  • CUDA工具包和司机:GPU编码器测试了CUDA工具包v10.1默认安装附带的学校网站编译器,cuFFT,cuBLAS,cuSOLVER和推力库
  • CUDA深层神经网络库(cuDNN):NVIDIA的CUDA®深层神经网络库(cuDNN)是一个GPU-accelerated库原语的深层神经网络。GPU编码器与v7.5.x测试。下载文件并运行安装程序。
  • 英伟达TensorRT:高性能深学习推理优化器和运行时库,GPU编码器与v5.1.x测试。万博1manbetx支持R2019b CUDA代码生成,后来从一个Windows机器。
  • OpenCV库计算机视觉:开源库(OpenCV) v3.1.0是必需的。的OpenCV计算机视觉库附带工具箱没有所有必需的库和OpenCV安装程序没有安装它们。因此,您必须下载OpenCV源代码和构建库,并将它添加到路径
  • 手臂®和CUDA工具包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计算工具包\ CUDA \ v10.0”);setenv (“NVIDIA_CUDNN”、“C: \ Program Files \ NVIDIA GPU计算工具包\ CUDA \ cuDNN”);setenv (“NVIDIA_TENSORT”、“C: \ Program Files \ NVIDIA GPU计算工具包\ CUDA \ TensorRT”);setenv (“OPENCV_DIR”、“C: \ Program Files \ opencv \构建的);setenv(“路径”,…[' C: \ Program Files \ NVIDIA GPU计算工具包\ CUDA \ v10.0 \ bin; C: \程序文件\ NVIDIA GPU计算工具包\ CUDA \ cuDNN \ bin, C: \ Program Files \ opencv \制造\ x64 \ vc15 \ bin”……采用“路径”)]);

英伟达杰森

一旦你已经安装了喷气背包杰森,运行这个例子,安装简单DirectMedia层(SDL v1.2)图书馆在杰森通过运行以下命令在一个终端上的杰森。

$ sudo apt-get libsdl1.2debian安装

$ sudo apt-get libsdl1.2-dev安装

接下来,设置环境变量通过添加以下命令的杰森$ HOME / . bashrc申请bash配置文件。使用sudo中$ HOME / . bashrc打开文件:

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

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

二世。建立连接与杰森和验证设置

一旦下载了所有必需的库,使用coder.checkGPUInstallApp交互式测试如果系统变量设置正确,如果MATLAB主机准备杰森的生成和部署代码。

coder.checkGpuInstallApp;

截图

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

  • 验证是否已正确设置环境变量
  • 生成代码为例深入学习网络功能
  • 编译并将它部署到杰森
  • 生成一个html报告检查结果

看看这个文档页面来了解更多信息。

三世。编制MATLAB代码代码生成

MATLAB代码和仿真软件模型可万博1manbetx以转换为低级代码像C / c++, CUDA,高密度脂蛋白等。这使您能够获得最佳的worlds-develop用高级语言代码,然后使用它作为高效的低级代码,针对嵌入式设备进行了优化。从未使用过的代码生成?查看本系列教程的基础代码生成和硬件支持。万博1manbetx

我们AUV依赖于相机看到它的环境,所以我们的目标检测系统必须由一个相机给杰森视频流。我们的网络将处理图像流和返回的像素位置,信心得分,感兴趣的对象的分类标签。当将MATLAB代码转换为C / c++或在这种情况下,CUDA,用你想要的功能来生成代码的函数,如下所示。GPU编码器将MATLAB函数转换成CUDA功能和生成任何其他文件需要执行这个函数在CUDA环境中。使用% # codegen指令来检查代码生成的兼容性:

roboSubPredict()函数% # codegen%创建一个杰森对象访问董事会及其外围设备hwobj =杰森;w =摄像头(hwobj, 1);d = imageDisplay (hwobj);%从垫文件加载训练网络持久mynet如果isempty (mynet) mynet = coder.loadDeepLearningNetwork (“detectorYoloV2.mat”);结束%过程循环因为我= 1:1e5 img =快照(w);[bboxes、分数、标签]= mynet.detect (img,“阈值”,0.6);[~,idx] = max(分数);%注释图像中检测。如果~ isempty (bboxes) outImg = insertObjectAnnotation (img,“矩形”,bboxes (idx) cellstr(标签(idx)));其他outImg = img;终端形象(d, outImg);结束结束

这个函数加载和构造一个对象——训练检测器mynet从MAT-File-withcoder.loadDeepLearningNetwork函数。声明mynet持续,将其存储在内存和省去了重建对象在每次函数调用。的检测对象的方法返回位置,信心得分,和分类标签。经常在学生竞赛,团队培训新深度学习探测器在比赛中事件应对自然采光和天气条件。网络加载在编译时换出MAT-file和重建的代码,使用最合适的网络为给定的条件下,在几分钟内。

下一步是获取图像流从相机连接到外围Jetson董事会。GPU编码器支持NVIDIA万博1manbetx GPU包将会帮助你做到这一点。现在,在本文中我们使用一个NVIDIA杰森TX2,但正如上面提到的,其他的NVIDIA gpu的支持包可以生成代码。万博1manbetx

GPU编码器为NVI万博1manbetxDIA GPU的支持包

GPU编码器支持NV万博1manbetxIDIA GPU自动化部署包MATLAB算法在嵌入式NVIDIA GPU的构建和部署代码生成的CUDA GPU和CPU上的目标硬件。它使您能够远程与英伟达通信目标和控制原型的外围设备。检查下面的代码:

创建一个杰森对象访问董事会及其外围设备。

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

调用杰森函数创建一个杰森对象代表杰森的连接板;使用此对象及其各种方法创建对象等外围设备连接到董事会网络摄像头imageDisplay如上所示。杰森对象的更多信息查看它的文档页面。使用这些对象及其方法在视频数据流,分别在显示器显示输出。

img =快照(w);% w是先前创建的远程对象图像(d, img);% d imageDisplay对象

四、生成代码和部署应用程序

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

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

在这个配置我们指导GPU编码器自动生成主要功能并编译成可执行的代码。这个可以调整根据你的应用程序中,需要生成一个图书馆融入另一个代码库?选择合适的构建类型如下所示

调用codegen命令和生成报告查看生成的代码。

cfg codegen(“配置”,“roboSubPredict”,“报告”);

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

使用杰森对象发射并杀死杰森从MATLAB上的应用程序。

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

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

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

关键的外卖

我想在一些关键的外卖结束:

  • 代码生成和部署帮助你准备好生产代码在几分钟内没有低级代码调试的麻烦
  • 硬件支持包可以帮助自动构建万博1manbetx和部署到杰森
  • 更换探测器mat文件和重建为一个新的网络生成和部署代码在几分钟内
  • 改变build-type生成可读,可编辑代码,可以集成到其他的代码库
|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。