将MATLAB环境下深度学习目标检测模型部署在Jetson TX2开发板

2023-11-16

摘要:在MATLAB2019b环境下训练深度学习目标检测模型。利用MATLABcoder和GPUcoder生成c++代码和CUDA代码,并部署在NVIDIA Jetson TX2开发板上运行。1.利用NVIDIA SDK manager对TX2进行刷机,配置CUDA、cuDNN环境,并安装各种支持包;2.在主机上配置MATLAB环境,包括C++编译器、CUDA、cuDNN、TensorRT和openCV等;3.利用主机MATLAB中codegen函数,在TX2中生成CUDA和c++代码以及可执行文件。

本文视频来源:Deploy YOLOv2 to an NVIDIA Jetson

代码连接:下载

目录

1.TX2刷机和环境配置

2.主机MATLAB2019b支持包和安装环境配置

3.主机MATLAB连接TX2并生成配套代码和可执行文件


 

1.TX2刷机和环境配置

  • 在NVIDIA Jetson上安装Jetpack:

利用Jetpack给NVIDIA Jetson刷机,安装操作系统、必要的深度学习库,包括TensorRT, cuDNN, CUDA Toolkit, OpenCV等。需要有Linux系统或Linux虚拟机的Windows系统的主机,如果选用虚拟机,分配足够的存储空间(30G+)。网上给TX2刷机的文章很多,主要分为两类:直接下载Jetpack进行刷机和使用SDK manager刷机助手。相比而言推荐后者,更加简便。

这里直接附上两个链接以供参考:

https://blog.csdn.net/u012254599/article/details/100009909

https://blog.csdn.net/weixin_39951217/article/details/101071917

后续会专门写一篇博客介绍我刷机过程中遇到的坑和解决方法。总结起来三个要点(其他博客未提及的要点):1.SDK manager装机全程无需网线将主机和TX2连接(而另一种直接下载Jetpack刷机的方式是需要网线和路由器将主机和TX2连接到同一个局域网的);2.进入主机Linux环境(我用的虚拟机)下打开终端输入

-s xrandr 1680x1050 //调节屏幕显示尺寸,如果太小SDK manager在启动时会提示报错

3.不要Automatic setup,直接选Manual setup,然后一通recover模式操作复原系统。复原后先在板子上设置登录名称、密码,然后在主机中点下一步,开始刷机;4.刷机完成后,其他支持包的安装过程经常会中途失败,重新再来几遍,如果老报错(比如我在安装OpenCV时每次卡到95%后就崩溃)尝试在TX2中输入以下指令:

sudo apt update
sudo apt --fix-broken install
sudo aot upgrade

对TX2部分文件更新升级,修复破损文件。之后再尝试安装其他支持包。5.如果4中方法不好用,直接从头来过,从STEP1开始再来一遍,想想会很心累,但我OpenCV的安装失败问题就是这样解决的。

  • 安装Simple DirectMedia Layer (SDL v1.2)库

刷机完成后,在TX2终端输入以下两行指令以安装SDL库

 $ sudo apt-get install libsdl1.2debian
 $ sudo apt-get install libsdl1.2-dev
  • 设置TX2环境变量

输入

sudo gedit $HOME/.bashrc 

打开$HOME/.bashrc文件,在文件最开始加入这两句话:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

点击保存后退出,命令行中会提示警告,没影响,忽视掉就行。

 

至此,TX2的刷机和环境配置工作就完成了。

2.主机MATLAB2019b支持包和安装环境配置

这部分内容顶部的代码连接中都有具体的讲解,在此不做赘述了。(文中不方便细讲,有问题可以留言私信)

3.主机MATLAB连接TX2并生成配套代码和可执行文件

用TX2自带的数据线将主机和TX2相连,MATLAB中输入指令:

ipaddress = '192.168.137.209'; % This is specific to your jetson, use ifconfig to find the ipaddress or set a static ip for the jetson 
username = 'nvidia';
password = 'nvidia';
hwobj = jetson(ipaddress, username, password);

输入TX2的IP、用户名和密码,并用jetson函数在MATLAB上连接TX2。之后设置GPU环境:

gpuEnvObj = coder.gpuEnvConfig('jetson');
gpuEnvObj.BasicCodegen = 1;
gpuEnvObj.BasicCodeexec = 1;
gpuEnvObj.DeepLibTarget = 'cudnn'; % either tensorrt or cudnn
gpuEnvObj.DeepCodeexec = 1;
gpuEnvObj.DeepCodegen = 1;
gpuEnvObj.HardwareObject = hwobj;
results = coder.checkGpuInstall(gpuEnvObj);

如果返回的所有结果都是PASSED则环境没问题。再往后就是我自己做的一个例子了,其实就是把MATLAB中车辆检测的一个yolov2resNet50模型部署在TX2上:

首先在MATLAB中获取yolov2ResNet50VehicleExample.mat模型,该模型。输入以下指令以打开CodeGenForObjectDetectionUsingYOLOV2Example:

openExample('deeplearning_shared/CodeGenForObjectDetectionUsingYOLOV2Example')

运行文件里面的这句话

%% Get Pretrained DAGNetwork
net = getYOLOv2();

以获得预训练过得yolov2模型。该模型用于车辆检测(预训练的效果并不好,在此只作为一个例子展示)。下载得到的模型:

在桌面新建一个文件夹cardetection,将yolov2ResNet50VehicleExample.mat模型和highway_lanechange.mp4视频复制到文件夹下

之后我的cardetect.m主函数(也是用于后面生成GPU Code的函数),以及主函数中调用的yolov2_detect函数分别如下:

function cardetect() %#codegen

%   Copyright 2019 The MathWorks, Inc.

coder.gpu.kernelfun;
hwobj = jetson();
width = 640;
height = 480;%视频中的长宽分别为640*480,可以根据自己的视频分辨率修改
videoFileName = 'highway_lanechange.mp4';%视频名称也可以修改
vobj = VideoReader(hwobj,videoFileName,'Width',width,'Height',height);
dispObj = imageDisplay(hwobj);

while vobj.hasFrame
    input = vobj.readFrame;
    
    % run cardetection on the frame 
    outImg =  yolov2_detect(input);
    
    % display the output
    image(dispObj,outImg);
end

end

 

function outImg = yolov2_detect(input)

%   Copyright 2018-2019 The MathWorks, Inc.

persistent yolov2Obj;

if isempty(yolov2Obj)
    yolov2Obj = coder.loadDeepLearningNetwork('yolov2ResNet50VehicleExample.mat');%这里加载的预训练过得yolov2ResNet50VehicleExample.mat,效果并不理想,可以加载别的模型或者自己用数据训练一遍
end

% pass in input
[bboxes,~,labels] = yolov2Obj.detect(input,'Threshold',0.5);

% convert categorical labels to cell array of charactor vectors for MATLAB
% execution
if coder.target('MATLAB')
    labels = cellstr(labels);
end

% Annotate detections in the image.
outImg = insertObjectAnnotation(input,'rectangle',bboxes,labels);

 

以上两个函数写好后,利用MATLAB GPU Coder将其转换成TX2上生成可执行的CUDA Code。先配置参数:

% To generate a CUDA executable that can be deployed  on to a NVIDIA 
% target, create a GPU code configuration object for generating an executable.
cfg = coder.gpuConfig('exe');

% Use the <matlab:doc('coder.hardware') coder.hardware> function to create 
% a configuration object for the Jetson platform and assign it to
% the |Hardware| property of the code configuration object |cfg|.
cfg.Hardware = coder.hardware('NVIDIA Jetson');

% Use the |BuildDir| property to specify the directory for performing remote 
% build process on the target. If the specified build directory does not 
% exist on the target then the software creates a directory with the 
% given name. If no value is assigned to |cfg.Hardware.BuildDir|, the remote
% build process happens in the last specified build directory. If 
% there is no stored build directory value, the build process takes place 
% in the home directory.
cfg.Hardware.BuildDir = '~/remoteBuildDir';

% Set the |GenerateExampleMain| property to generate an example CUDA C++ main 
% function and compile it. This example does not require modifications to 
% the generated main files.    
cfg.GenerateExampleMain = 'GenerateCodeAndCompile';

之后利用codegen生成代码:

%% 
% To generate CUDA code, use the <matlab:doc('codegen') codegen> function 
% and pass the GPU code configuration along with
% |fog_rectification| entry-point function. After the  code generation takes place on 
% the host, the generated files are copied over and built on the target.
codegen('-config ',cfg,'cardetect','-report');

这需要一段时间。运行成功后会得到

这两个文件。同时,在NVIDIA TX2中也生成了对应文件,在Home\remoteBuildDir路径下可以查看到。之后继续在MATLAB命令行运行:

%% Copy Video File on the Target
% Move the video file to the target.
hwobj.putFile('highway_lanechange.mp4', hwobj.workspaceDir);

将待检测视频也放入TX2中生成代码的同路径下。

最后一步:MATLAB命令行运行

 pid = runApplication(hwobj,'cardetection');

这一句是运行TX2中的cardetection.elf可执行文件,运行后稍等一会儿,在TX2中可以看到如下的运行结果:

挑了效果相对好一点的两帧展示了出来,至此完成了MATLAB下训练的深度学习目标检测模型在NVIDIA Jetson TX2中的部署。花了整整一周的时间完成刷机,CUDA代码生成、嵌入式部署以及验证。中间踩了一些坑,同时在TX2安装USB摄像头实现实时检测的思路还没调通(TX2显示相机分辨率不匹配,尚未解决,希望大神点播)。

 

总体写的比较仓促,很多细节还未完善,后续继续补充,如果中间碰到了问题或者是我没写清楚的地方欢迎私信留言一同探讨!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将MATLAB环境下深度学习目标检测模型部署在Jetson TX2开发板 的相关文章

  • Vue简单示例——weex跨平台解决方案

    简单介绍 Weex的出现主要解决了Web开发的应用频繁发布版本和多端研发两个问题 同时解决了前端语言性能差异和显示效果受限的问题 什么是weex Weex是使用流行的Web开发体验来开发高性能原生应用框架 使开发者可以用JS语言和前端开发经
  • H264/AVC-帧内预测

    I宏块使用帧内预测编码压缩数据 根据相邻宏块数据恢复当前宏块信息 值得注意的一点是 帧内预测所参考的相邻宏块数据是deblocking之前的像素值 因为上一宏块的deblocking依赖当前宏块像素值 但当前宏块数据还未重建 1 帧内预测类
  • Python 综合面试题(附参考答案)

    Python 综合面试题 第一部分 Python 基础 如何理解 python 中的深度拷贝和浅拷贝 浅拷贝旨在减少内存的占用 深拷贝可以在做数据的清洗 修改或者入库 的时候 对原数据进行复制一份 以防数据修改之后 找不到原数据 深浅拷 贝

随机推荐

  • PID算法与PID自整定算法

    本文是由于研发恒温槽项目故需要了解PID控制算法和PID自整定算法 为方便本人日后需要故作此记录 直接粘贴代码吧 这是PID位置式控温算法 函数名 void Pid positional float speed 用途 PID输出 说明 参数
  • 手撕代码:判断二进制串除以3的余数

    题目描述 给定一个长二进制串 求其除以3的余数 思路分析 这里涉及到状态机 由于除以三的余数只可能是0 1 2 所以状态机就有三个状态 现在逐个遍历二进制串 初始余数为0 当遇到1时 状态转到1 遇到0时状态仍为0 对于状态1 判断分别遇到
  • win8 java 32位_java8离线安装包32位 官方最新版

    java8电脑版安装包是一款全新的java编程软件 该软件有着良好的操作性 支持多语种编程 当然也包括中文编程 支持winxp win7 win8 win10等基本微软系统进行操作 全面升级现有Java编程模式 带来一项协同开发的JVM J
  • Opencv.js+Hbuilder快速打造一个图像处理App

    一 开发工具简介 1 Opencv js Opencv 是一个常见的图像处理库 通常使用C 和python去调这个库对图像 视频流进行处理 而js版的opencv可以进一步丰富前端对于图像的处理 目前opencv js版映入了与其他版本基本
  • 安信实验室教你如何实现Windows自动安装!

    用户接入硬件后 Windows 自动下载安装或更新厂商的驱动软件 特点 1 产品的驱动程序及软件已放入微软官方驱动程序库 全世界用户都可以很快捷和方便地自动安装厂商自定义的软件 驱动通过微软官方认证 最佳安全性保障和信用背书 应用软件可以自
  • adb shell dumpsys activity activities调用信息简析

    活动栈 通过执行上面命令 可以得到类似如下格式的信息 Stack 45 type standard mode fullscreen isSleeping false mBounds Rect 0 0 0 0 Stack 0 type hom
  • Python 重命名文件或目录(os.rename)

    文章目录 1 概述 2 语法 os rename 2 1 相对路径 2 2 绝对路径 3 扩展 3 1 os 模块详解 1 概述 mermaid svg 9u1Lg7aqBXqPfILR label font family trebuche
  • Python面试常见的30个问题及答案

    Python面试问题 问题1 Python的主要功能是什么 python特性如下 解释型 动态类型 面向对象 简洁明了 免费自由 有一个庞大的社区 Q 2 区分深层和浅层拷贝 深拷贝将对象复制到另一个对象中 这意味着如果您对对象的副本进行更
  • vue-resource的$http.jsonp方法例子

    div class box div
  • svn版本回退

    SVN版本回退 当一不小心把文件改错了或者误删除了文件并提交到了服务器 我们要取消这些修改的话 首先就是将这个文件还原到上一个修订的版本的内容 revert to this rebision 然后将这个文件重新提交 那么服务器上的这个文件就
  • 集成开发工具使用

    集成开发工具使用 Intellij IDEA介绍 下载 安装 IDEA开发Java项目 IDEA快捷键 IDEA常见配置和操作的学习 1 IDEA 1 1 IDEA概述 IDEA全称Intellij IDEA 是用于Java语言开发的集成环
  • Windows Server 2016-OU组织单位日常操作

    技术无所谓贵贱 既然曾经做过就总该是要留下点什么 毕竟做技术这些年给我们留下太多太多的成长经历 总有人问这些已经很皮毛了为什么还要写 其实没那么多花哨理由 就是想着做或者不做这一块总是要对过往做个简单归总 习惯已成自然 虽然因为种种原因频繁
  • 使用http动词篡改的认证旁路

    文章目录 一 漏洞描述 二 解决建议 三 解决方法 Springboot 配置文件增加配置 编写配置类 编写过滤器 提示 以下是本篇文章正文内容 下面案例可供参考 一 漏洞描述 可能会升级用户特权并通过 Web 应用程序获取管理许可权可能会
  • C++小坑:问号表达式的输出

    文章目录 发现问题 解决方案 发现问题 本来只是想写这样一个测试是否连接成功的判断 std cout lt lt Result gt lt lt Avaliable hey you got it hell suck it lt lt std
  • DSView源码阅读笔记(持续更新中···)

    一 DSView源码阅读笔记 主线任务 将源码成功编译运行 提取示波器功能代码 添加示波器通道数量 找到接收数据部分源码 在win平台上使用qt开发环境进行代码重构 支线任务 以下笔记内容部分是猜测内容 DSView pv mainwind
  • RMS正则化 和 STD正则化 的一些见解

    研究styleganv2过程中 记录下它使用的正则化方法的一些见解 RMS 方均根 STD 标准差 stylegan 中的 pixel norm 是 RMS正则化 常见的BN层 IN层 用的是STD 在不减均值的情况下 RMS正则化公式 t
  • 针对于QT5下找不到QApplication头文件的问题界解决

    感谢前辈的总结 这里用了CTRL C CTRL V进行操作 原地址 http bbs csdn net topics 380130389 老版本 C C code 1 2 include
  • 【计算机网络】数据通信的基础知识

    通信系统的一般模型 数据通信系统的组成部分 源点 信源 产生数据 如从键盘输入 产生数字比特流 发送器 对数字比特流进行编码 如调制器 信道 是信号传输的通道 可能是一条简易的传输线路 也可能是一个复杂的网络 接收器 设备的功能与发送设备相
  • 保姆式教学-实现天空盒旋转

    目录 一 天空盒材质设置 1 在菜单栏window gt Rendering gt lighting 2 设置天空盒子材质 替换默认材质 3 认识Rotation变量 二 代码实现让天空盒转起来 在一个小Unity项目中 需要将天空盒旋转
  • 将MATLAB环境下深度学习目标检测模型部署在Jetson TX2开发板

    摘要 在MATLAB2019b环境下训练深度学习目标检测模型 利用MATLABcoder和GPUcoder生成c 代码和CUDA代码 并部署在NVIDIA Jetson TX2开发板上运行 1 利用NVIDIA SDK manager对TX