基于Nvidia Jetson Nano边缘计算设备使用TensorRT部署YOLOv8模型实现目标检测推理

0、背景

最近拿到一台边缘计算设备,在部署YOLO模型的过程中遇到一些问题,特此记录。
在这里插入图片描述

设备介绍信息:NVIDIA Jetson Orin Nano T201Developer Kit 开发套件

开发者套件:Jetson Orin Nano T201 8GB开发套件

使用指南文档:使用指南PDF文档

YOLO模型Ultralytics官网对Nvidia Jetson设备的部署教程:https://docs.ultralytics.com/zh/guides/nvidia-jetson/

如果你的设备型号、Jetpack版本、Pytorch、torchvision和官方提供的指南文档一致,那么恭喜你,可以很方便的将YOLO模型的pt文件转为tensorRT文件直接进行推理,TensorRT转化的模型文件engine可能会比pt模型文件推理速度块快5倍左右。所以模型部署还是要进行tensorRT转化的。下面开始。

1、NVIDIA Jetson 是什么?

NVIDIA Jetson 是一系列嵌入式计算板,旨在为边缘设备带来加速 AI(人工智能)计算。这些小巧且功能强大的设备围绕NVIDIA 的GPU 架构构建,能够直接在设备上运行复杂的人工智能算法和深度学习模型,而无需依赖云计算资源。Jetson 板通常用于机器人、自动驾驶汽车、工业自动化和其他需要在本地以低延迟和高效率执行人工智能推理的应用。此外,这些板卡基于 ARM64 架构,与传统的GPU 计算设备相比,运行功耗更低。

在这里插入图片描述

2、查看设备Jetpack版本信息

使用以下命令:

jtop

如果你没有这个命令,请参考前面的设备使用指南PDF文档进行安装。
在这里插入图片描述
根据下面提升,按7是打开info信息,在info信息页可以看到当前设备各种组件版本信息。例如我的Jetpack版本是5.1.1,Ultralytics官方给的是6.2的版本安装教程,所以我的不能用,因此花费了好大功夫去安装适配我版本的pytorch等,下面一步步介绍怎么去寻找适合自己版本的安装包。
在这里插入图片描述

3、配置Cuda环境变量信息

确保 CUDA 路径已正确配置,在 ~/.bashrc 中添加以下行:

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

生效配置:

source ~/.bashrc

如果以上环境变量设置成功的话,执行nvcc --version 查看cuda版本信息:
在这里插入图片描述

安装 CUDA 依赖库:

sudo apt-get install libopenblas-base libopenmpi-dev libjpeg-dev zlib1g-dev

4、安装Pytorch

根据以上输出信息,我的jetpack版本信息是5.1.1,cuda版本是11.4,系统是Ubuntu20.04 arm架构。如果直接安装pytorch官方版本我试 了下是不行的。因为Jetson Nano 的 ARM 架构要求必须安装 ​NVIDIA 官方预编译的 PyTorch 包,而非 PyTorch 官方源的 x86 版本

所以经过我的一番辛苦查找,终于在英伟达官方找到了适配Jetson的Pytorch版本,地址为:https://docs.nvidia.com/deeplearning/frameworks/install-pytorch-jetson-platform/index.html#overview__section_orin
在这里插入图片描述
在这里找到Jetson平台的Pytorch安装。
安装步骤如下:

1、Jetpack安装地址:

https://developer.nvidia.com/embedded/jetpack

2、Install system packages required by PyTorch

安装系统Pytorch依赖的包:

sudo apt-get -y update; 
sudo apt-get install -y  python3-pip libopenblas-dev;

3、安装Pytorch

根据以下命令安装Pytorch

export TORCH_INSTALL=https://developer.download.nvidia.cn/compute/redist/jp/v511/pytorch/torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl# 安装
python3 -m pip install --upgrade pip; python3 -m pip install numpy==’1.26.1’; python3 -m pip install --no-cache $TORCH_INSTALL

如果版本不对,可以切换版本,替换以下版本号

https://developer.download.nvidia.com/compute/redist/jp/v$JP_VERSION/pytorch/$PYT_VERSION

JP_VERSION: 就是你的JetPack 版本,例如461就是JetPack 4.6.1,(原话:The major and minor version of JetPack you are using, such as 461 for JetPack 4.6.1 or 50 for JetPack 5.0.

PYT_VERSION:The released version of the PyTorch wheels, as given in the Compatibility Matrix.

其他不清楚的可以直接看官方文档。

验证Pytorch安装

运行以下代码确保 CUDA 可用:

import torch
print("PyTorch 版本:", torch.__version__)
print("CUDA 可用:", torch.cuda.is_available())
print("GPU 设备:", torch.cuda.get_device_name(0))

到这里应该CUDA就是可用状态了。

在这里插入图片描述

5、安装torchvision

安装了Pytorch之后还要安装torchvision,因为我们安装的pytorch是Nvidia官方预编译的,直接按照Pytorch官方源 的torchvision肯定不行,会报错版本不匹配。例如:
我直接安装:pip install torchvision==0.15.1,就会报错:

Couldn’t load custom C++ ops. This can happen if your PyTorch and torchvision versions are incompatible, or if you had errors while compiling torchvision from source. For further information on the compatible versions, check https://github.com/pytorch/vision#installation for the compatibility matrix. Please check your PyTorch version with torch.version and your torchvision version with torchvision.version and verify if they are compatible, and if not please reinstall torchvision so that it matches your PyTorch install.

所以还得安装指定版本的torchvision

重新安装 torchvision

由于当前版本可能存在环境污染或编译问题,重新安装:

pip uninstall torchvision -y  # 卸载现有版本
git clone --branch v0.15.1 https://github.com/pytorch/vision
cd vision
python3 setup.py install --user  # 从源码编译安装

注意事项:

使用 --user 参数避免权限问题。
确保 PyTorch 已正确安装且版本与 torchvision 0.15.1 兼容。

这个编译过程可能会有点长,耐心等待一会儿。

验证安装

检查 torchvision 版本及功能:

import torchvision
print(torchvision.__version__)  # 预期输出: 0.15.1

到此,应该就算环境安装完成了,下面就可以执行YOLO模型的转换工作了。

6、在NVIDIA Jetson 上使用TensorRT

6.1 将模型转换为TensorRT 并运行推理

PyTorch 格式的 YOLO11n 模型被转换为TensorRT ,以便使用导出的模型进行推理。

还需要先安装 pip install onnx
然后执行转换:

# Export a YOLO11n PyTorch model to TensorRT format
yolo export model=yolo11n.pt format=engine  # creates 'yolo11n.engine'# Run inference with the exported model
yolo predict model=yolo11n.engine source='https://ultralytics.com/images/bus.jpg'

NVIDIA Jetson OrinYOLO11 基准测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让人感到疑惑的const

const 关键字在不同的编程语言中有着不同的含义和限制,但通常它被用来声明一个常量或只读变量。然而,在 JavaScript 中,const 的行为有时可能会让人感到困惑,因为它并不总是意味着“不可变”(immutable)。让…

Python 列表全面解析

关于Python列表的详细教程,涵盖增删改查、切片、列表推导式及核心方法 一、 列表基础 1.1 创建列表 列表是Python中最常用的数据结构之一,支持动态存储多种类型的元素。 # 空列表 empty_list []# 初始化列表 numbers [1, 2, 3, 4] fruits ["a…

【Ratis】ReferenceCountedObject接口的作用及参考意义

Apache Ratis的项目源码里,大量用到了自定义的ReferenceCountedObject接口。 本文就来学习一下这个接口的作用,并借鉴一下它解决的问题和实现原理。 功能与作用 ReferenceCountedObject 是一个接口,用于管理对象的引用计数。它的主要功能和作用包括: 引用计数管理: 提供…

leetcode-50.Pow(x,n)

快速计算次方的方法。 首先&#xff0c;先保证n是正数。 如果n<0&#xff0c;就让x取反&#xff0c;n取绝对值。 然后考虑怎么快速乘法。 考虑 x 7 x 1 2 4 x ∗ x 2 ∗ x 4 x^7x^{124}x*x^2*x^4 x7x124x∗x2∗x4&#xff0c;可以发现&#xff0c;本来乘6次x&#xff0…

基于javaweb的SpringBoot公司日常考勤系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

游戏引擎学习第167天

回顾和今天的计划 我们不使用引擎&#xff0c;也不依赖库&#xff0c;只有我们自己和我们的小手指在敲击代码。 今天我们会继续进行一些工作。首先&#xff0c;我们会清理昨天留下的一些问题&#xff0c;这些问题我们当时没有深入探讨。除了这些&#xff0c;我觉得我们在资产…

深度学习框架PyTorch——从入门到精通(5)自动微分

使用torch.autograd自动微分 张量、函数和计算图计算梯度禁用梯度追踪关于计算图的更多信息张量梯度和雅可比乘积 在训练神经网络时&#xff0c;最常用的算法是反向传播。在该算法中&#xff0c;参数&#xff08;模型权重&#xff09;根据损失函数的梯度相对于给定参数进行调整…

以食为药:缓解老人手抖的饮食策略

手抖&#xff0c;在医学上称为震颤&#xff0c;是老年人常见的症状之一。其成因复杂&#xff0c;可能涉及神经系统病变、甲状腺功能异常、药物副作用等。除了积极就医治疗&#xff0c;合理的饮食对于缓解手抖症状、提高老人生活质量具有重要意义。 老人手抖时&#xff0c;身体能…

JUC大揭秘:从ConcurrentHashMap到线程池,玩转Java并发编程!

目录 JUC实现类 ConcurrentHashMap 回顾HashMap ConcurrentHashMap CopyOnWriteArrayList 回顾ArrayList CopyOnWriteArrayList: CopyOnWriteArraySet 辅助类 CountDownLatch 线程池 线程池 线程池优点 ThreadPoolExecutor 构造器各个参数含义&#xff1a; 线程…

C++之list类及模拟实现

目录 list的介绍 list的模拟实现 定义节点 有关遍历的重载运算符 list的操作实现 &#xff08;1&#xff09;构造函数 (2)拷贝构造函数 &#xff08;3&#xff09;赋值运算符重载函数 &#xff08;4&#xff09;析构函数和clear成员函数 &#xff08;5&#xff09;尾…

Elasticsearch 向量检索详解

文章目录 1、向量检索的用途2、适用场景2.1 自然语言处理&#xff08;NLP&#xff09;&#xff1a;2.2 图像搜索&#xff1a;2.3 推荐系统2.4 音视频搜索 3、向量检索的核心概念3.1 向量3.2 相似度计算3.3 向量索引 4、案例&#xff1a;基于文本的语义搜索5、总结 向量检索是 E…

自学软硬件第755 docker容器虚拟化技术

见字如面&#xff0c; 这里是AIGC创意人_竹相左边&#xff0c; 正在通过AI自学软硬件工程师&#xff0c;目标手搓可回收火箭玩具。 我很喜欢 《流浪地球 2》中 &#xff0c;马兆&#xff1a;没有硬件支撑&#xff0c;你破解个屁。 写作背景 今天在剪视频&#xff0c;然后看…

不可不知的分布式数据库-TiDB

不可不知的分布式数据库-TiDB 介绍TiDb架构TiDb与Mysql的区别功能特性性能表现数据可靠性运维管理成本 Docker部署TiDB1. 获取 TiDB 配置文件2. 启动 TiDB 集群3. 连接到 TiDB4. 停止和清理 TiDB 集群注意事项 实用案例TiDB实现分布式事务实现原理实现方式SQL 方式编程方式 注意…

20242817李臻《Linux⾼级编程实践》第四周

20242817李臻《Linux⾼级编程实践》第4周 一、AI对学习内容的总结 第5章 Linux进程管理 5.1 进程基本概念 进程与程序的区别 程序&#xff1a;静态的二进制文件&#xff08;如/bin/ls&#xff09;&#xff0c;存储在磁盘中&#xff0c;不占用运行资源。进程&#xff1a;程…

基于 Prometheus + Grafana 监控微服务和数据库

以下是基于 Prometheus Grafana 监控微服务和数据库的详细指南&#xff0c;包含架构设计、安装配置及验证步骤&#xff1a; 一、整体架构设计 二、监控微服务 1. 微服务指标暴露 Spring Boot 应用&#xff1a; xml <!-- 添加 Micrometer 依赖 --> <dependency>…

使用GoogleNet实现对花数据集的分类预测

使用GoogleNet实现对花数据集的分类预测 1.作者介绍2.关于理论方面的知识介绍2.1GooLeNet的知识介绍2.2CNN发展阶段2.2GooLeNet创新模块 3.关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1数据集介绍3.2实验过程3.3实验结果 1.作者介绍 王海博, 男 , 西安…

流量密码破解:eBay店铺首页改版后的黄金展示位

流量密码破解&#xff1a;eBay店铺首页改版后的黄金展示位 近年来&#xff0c;跨境电商行业竞争日趋激烈&#xff0c;流量分配机制的调整成为平台卖家最为关注的核心议题之一。作为全球领先的在线电商平台&#xff0c;eBay的每一次页面优化都可能对卖家的经营策略产生深远影响…

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文&#xff0c; 本文所使用的 Trae 免费下载链接&#xff1a; www.trae.ai/?utm_source… 前言 大家好&#xff0c;我是小Q&#xff0c;字节跳动近期推出了一款 AI IDE—— Trae&#xff0c;由国人团队开发&#xff0c;并且限时免费体…

Netty:java高性能网络编程的基石(下)

一、Netty是什么&#xff1f;为什么需要它&#xff1f; Netty是一个异步事件驱动的网络应用框架&#xff0c;基于Java NIO技术封装&#xff0c;用于快速开发高性能、高可靠性的网络服务器和客户端程序。作为当前最流行的NIO框架之一&#xff0c;支撑着Dubbo、RocketMQ、Elasti…

leetcode-47.全排列II

如何在有重复值的时候节省时间是优化重点。 基础写法肯定是按无重复值时的全排列写&#xff0c;在其中要加上防止走重复路径的分支。 能防止的也只有同层&#xff0c;如果同层走一个值&#xff0c;但是该值重复&#xff0c;且走过了&#xff0c;则放弃走该分支。所以设layer_u…