基于Nvidia Jetson orin nx的 YoloV7 tensorRt加速

本文讲述了如何在NvidiaJetson上安装JetPack,配置CUDA、cuDNN环境,并使用TensorRT部署YOLOv7,涉及环境设置和常见问题解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备环境

安装jetPack组件

Jetpack 是 Nvidia为 Jetson系列开发板开发的一款软件开发包,常用的开发工具基本都包括了,并在在安装 Jetpack的时候,会自动的将匹配版本的CUDA、cuDNN、TensorRT等。官方提供套件中默认已经安装,可以通过以下命令查看jetPack是否已经安装。

官网指导链接:How to Install JetPack :: NVIDIA JetPack Documentation

# 法一:需要已安装jtop
sudo jetson_release
# 法二:无需安装jtop 
sudo apt-cache show nvidia-jetack
配置cuda环境变量
# 配置cuda环境变量
sudo vim ~/.bashrc
# 在文本中末尾添加如下代码
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda
​
#使该配置生效
sorce ~/.bashrc
​
# 查看cuda 版本
nvcc -V

配置cuDNN

虽然jetpack安装了cuDNN,但并没有将对应的头文件、库文件放到cuda目录,cuDNN的头文件在:/usr/include,库文件位于:/usr/lib/aarch64-linux-gnu。将头文件与库文件复制到cuda目录下

# 复制文件到cuda目录下
cd /usr/include && sudo cp cudnn* /usr/local/cuda/include
cd /usr/lib/aarch64-linux-gnu && sudo cp libcudnn* /usr/local/cuda/lib64
​
# 修改文件权限,修改复制完的头文件与库文件的权限,所有用户都可读,可写,可执行:
sudo chmod 777 /usr/local/cuda/include/cudnn.h 
sudo chmod 777 /usr/local/cuda/lib64/libcudnn*
​
# 重新软链接,这里的8.6.0和8对应安装的cudnn版本号和首数字
cd /usr/local/cuda/lib64
​
sudo ln -sf libcudnn.so.8.6.0 libcudnn.so.8
​
sudo ln -sf libcudnn_ops_train.so.8.6.0 libcudnn_ops_train.so.8
sudo ln -sf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8
​
sudo ln -sf libcudnn_adv_train.so.8.6.0 libcudnn_adv_train.so.8
sudo ln -sf libcudnn_adv_infer.so.8.6.0 libcudnn_adv_infer.so.8
​
sudo ln -sf libcudnn_cnn_train.so.8.6.0 libcudnn_cnn_train.so.8
sudo ln -sf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8
​
sudo ldconfig
​
#测试cudnn
sudo cp -r /usr/src/cudnn_samples_v8/ ~/
cd ~/cudnn_samples_v8/mnistCUDNN
sudo chmod 777 ~/cudnn_samples_v8
sudo make clean && sudo make
./mnistCUDNN
​
可能存在问题
  1. 编译时freeImage.h文件不存在

# 执行安装命令
sudo apt-get install libfreeimage3 libfreeimage-dev
查看tensorrt版本
import tensorrt
print(tensort.__version__)

部署步骤

1. 拉取代码
#拉取 yolo-tensorRt
git clone https://github.com/Monday-Leo/YOLOv7_Tensorrt
# 拉取yolo 代码
git clone https://github.com/WongKinYiu/yolov7
#将**YOLOv7_Tensorrt**下的**EfficientNMS.py**和**export_onnx.py**复制到**yolov7**下,导出含有#EfficientNMS的onnx模型。
python3 export_onnx.py --weights ./weights/yolov7.pt
​

注:

如果遇到:EfficientNMS_TRT type is missing, so it may result in wrong shape inference for the exported graph.异常时,需要安装以下依赖

pip install onnx-simplifier pip install coremltools pip install nvidia-pyindex pip install onnx-graphsurgeon

2. 生成engine模型文件
trtexec --onnx=./yolov7.onnx --saveEngine=./yolov7_fp16.engine --fp16 --workspace=200
3. 运行代码
在YOLOv7_Tensorrt 工程项目中新增trt_model文件夹,并将转换好的yolov7_f16.engine 拷贝到 文件下,修改infer.py代码段
import cv2
import tensorrt as trt
import torch
import numpy as np
from collections import OrderedDict,namedtuple

class TRT_engine():
    def __init__(self, weight) -> None:
        self.imgsz = [640,640]
        self.weight = weight
        self.device = torch.device('cuda:0')
        self.init_engine()

    def init_engine(self):
        # Infer TensorRT Engine
        self.Binding = namedtuple('Binding', ('name', 'dtype', 'shape', 'data', 'ptr'))
        self.logger = trt.Logger(trt.Logger.INFO)
        trt.init_libnvinfer_plugins(self.logger, namespace="")
        with open(self.weight, 'rb') as self.f, trt.Runtime(self.logger) as self.runtime:
            self.model = self.runtime.deserialize_cuda_engine(self.f.read())
        self.bindings = OrderedDict()
        self.fp16 = False
        for index in range(self.model.num_bindings):
            self.name = self.model.get_binding_name(index)
            self.dtype = trt.nptype(self.model.get_binding_dtype(index))
            self.shape = tuple(self.model.get_binding_shape(index))
            self.data = torch.from_numpy(np.empty(self.shape, dtype=np.dtype(self.dtype))).to(self.device)
            self.bindings[self.name] = self.Binding(self.name, self.dtype, self.shape, self.data, int(self.data.data_ptr()))
            if self.model.binding_is_input(index) and self.dtype == np.float16:
                self.fp16 = True
        self.binding_addrs = OrderedDict((n, d.ptr) for n, d in self.bindings.items())
        self.context = self.model.create_execution_context()

    def letterbox(self,im,color=(114, 114, 114), auto=False, scaleup=True, stride=32):
        # Resize and pad image while meeting stride-multiple constraints
        shape = im.shape[:2]  # current shape [height, width]
        new_shape = self.imgsz
        if isinstance(new_shape, int):
            new_shape = (new_shape, new_shape)
        # Scale ratio (new / old)
        self.r = min(new_shape[0] / shape[0], new_shape[1] / shape[1])
        if not scaleup:  # only scale down, do not scale up (for better val mAP)
            self.r = min(self.r, 1.0)
        # Compute padding
        new_unpad = int(round(shape[1] * self.r)), int(round(shape[0] * self.r))
        self.dw, self.dh = new_shape[1] - new_unpad[0], new_shape[0] - new_unpad[1]  # wh padding
        if auto:  # minimum rectangle
            self.dw, self.dh = np.mod(self.dw, stride), np.mod(self.dh, stride)  # wh padding
        self.dw /= 2  # divide padding into 2 sides
        self.dh /= 2
        if shape[::-1] != new_unpad:  # resize
            im = cv2.resize(im, new_unpad, interpolation=cv2.INTER_LINEAR)
        top, bottom = int(round(self.dh - 0.1)), int(round(self.dh + 0.1))
        left, right = int(round(self.dw - 0.1)), int(round(self.dw + 0.1))
        self.img = cv2.copyMakeBorder(im, top, bottom, left, right, cv2.BORDER_CONSTANT, value=color)  # add border
        return self.img,self.r,self.dw,self.dh

    def preprocess(self,image):
        self.img,self.r,self.dw,self.dh = self.letterbox(image)
        self.img = self.img.transpose((2, 0, 1))
        self.img = np.expand_dims(self.img,0)
        self.img = np.ascontiguousarray(self.img)
        self.img = torch.from_numpy(self.img).to(self.device)
        self.img = self.img.float()
        return self.img

    def predict(self,img,threshold):
        img = self.preprocess(img)
        self.binding_addrs['images'] = int(img.data_ptr())
        self.context.execute_v2(list(self.binding_addrs.values()))
        nums = self.bindings['num_dets'].data[0].tolist()
        boxes = self.bindings['det_boxes'].data[0].tolist()
        scores =self.bindings['det_scores'].data[0].tolist()
        classes = self.bindings['det_classes'].data[0].tolist()
        num = int(nums[0])
        new_bboxes = []
        for i in range(num):
            if(scores[i] < threshold):
                continue
            xmin = (boxes[i][0] - self.dw)/self.r
            ymin = (boxes[i][1] - self.dh)/self.r
            xmax = (boxes[i][2] - self.dw)/self.r
            ymax = (boxes[i][3] - self.dh)/self.r
            new_bboxes.append([classes[i],scores[i],xmin,ymin,xmax,ymax])
        return new_bboxes

def visualize(img,bbox_array):
    for temp in bbox_array:
        xmin = int(temp[2])
        ymin = int(temp[3])
        xmax = int(temp[4])
        ymax = int(temp[5])
        clas = int(temp[0])
        score = temp[1]
        cv2.rectangle(img,(xmin,ymin),(xmax,ymax), (105, 237, 249), 2)
        img = cv2.putText(img, "class:"+str(clas)+" "+str(round(score,2)), (xmin,int(ymin)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (105, 237, 249), 1)
    return img

def test(path):
    import os
    out = './runs'
    images = os.listdir(path)
    engine = TRT_engine("./trt_model/video_fp32.engine")
    for item in images:
        img = cv2.imread(f'{path}/{item}')
        results = engine.predict(img,threshold=0.25)
        img = visualize(img,results)
        cv2.imwrite(f'{out}/{item}',img)

test('./pictures')
<think>好的,我现在需要回答用户关于TensorRTJetson Orin NX上的作用和功能的问题。首先,我需要回顾一下TensorRT的基本知识。TensorRTNVIDIA开发的深度学习推理优化器和运行时引擎,主要用于提高模型推理速度和效率。它通过层融合、精度校准、内核自动调整等技术优化模型,减少延迟和资源消耗。 接下来,Jetson Orin NXNVIDIA的嵌入式系统模块,属于Jetson系列,适用于边缘计算和AI应用。Orin NX拥有较强的算力,适合部署深度学习模型。结合TensorRT,可以进一步提升在边缘设备上的推理性能。 用户提供的引用中提到,Jetson Orin NX自带TensorRT,路径在/usr/src/tensorrt/下,这说明TensorRT已经预装在系统中,用户可以直接使用trtexec等工具进行模型转换和性能测试。另外,另一个引用关于Jetson Orin Nano使用YOLOv8和TensorRT加速,说明TensorRT常用于目标检测等模型的优化,这对用户可能有参考价值。 我需要将TensorRT的功能与Jetson Orin NX的特性结合起来。比如,TensorRT的优化能力如何利用Orin NX的GPU资源,或者如何通过TensorRT的INT8量化在Orin NX上实现低功耗推理。此外,可能需要提到TensorRT支持的模型格式,如ONNX,以及如何将训练好的模型转换为TensorRT引擎。 用户可能还关心实际应用场景,比如自动驾驶、机器人、工业检测等,这些场景中TensorRTOrin NX上的应用案例。同时,需要指出TensorRTOrin NX上的优势,比如减少延迟、提高吞吐量,适用于实时处理。 还要注意用户可能遇到的问题,比如如何安装或配置TensorRT,但根据引用内容,系统已经预装,所以可能不需要额外安装,但可能需要配置环境或转换模型。不过用户的问题主要集中在功能和用途,所以这部分可能不需要深入,但生成的相关问题可以涉及这些方面。 总结起来,回答的结构应该包括:TensorRT的简介、在Orin NX上的功能(优化模型、加速推理)、具体用途(应用场景)、以及结合硬件的优势。同时,按照用户的要求,生成相关问题,比如性能优化方法、配置步骤、应用案例等。 需要确保使用正确的中文术语,避免技术术语错误。另外,引用用户提供的两个引用,比如在提到预装路径时引用[^1],在提到应用案例如YOLOv8加速时引用[^2]。 现在,我需要将这些点组织成结构清晰的回答,分点说明功能和用途,并确保每个部分都准确且引用适当。同时,生成的相关问题要围绕TensorRTJetson Orin NX上的使用展开,帮助用户进一步了解。</think>### TensorRTJetson Orin NX 上的功能与用途 #### 1. **核心功能** - **模型优化与加速** TensorRTNVIDIA 专为深度学习推理设计的工具,通过以下技术显著提升模型性能: - **层融合**:合并多个计算层,减少内存访问和计算开销。 - **精度校准**:支持 FP16 或 INT8 量化,在保持精度的同时降低计算资源需求。例如,INT8 量化可减少模型体积并提升推理速度。 - **内核自动调优**:根据硬件特性自动选择最优计算内核,充分利用 Jetson Orin NX 的 GPU 算力。 - **推理运行时支持** TensorRT 生成高度优化的推理引擎(`.engine` 文件),可直接部署在 Jetson Orin NX 上,实现低延迟、高吞吐量的推理。例如,目标检测模型 YOLOv8 经 TensorRT 加速后,帧率(FPS)可提升数倍[^2]。 #### 2. **具体用途** - **边缘端高效推理** Jetson Orin NX 作为边缘计算设备,结合 TensorRT 可部署复杂模型(如目标检测、语义分割)于机器人、无人机等场景,满足实时性需求。 - **资源受限环境适配** 通过模型压缩和量化,TensorRT 使大型模型(如 ResNet、Transformer)能在 Orin NX 的有限功耗和内存下运行。例如,INT8 量化可减少 75% 的显存占用。 - **端到端部署支持** 支持从主流框架(PyTorch、TensorFlow)导出 ONNX 模型并转换为 TensorRT 引擎,简化部署流程。预置工具如 `trtexec` 可直接测试模型性能。 #### 3. **硬件协同优势** Jetson Orin NX 搭载 NVIDIA Ampere 架构 GPU,TensorRT 可充分发挥其 CUDA 核心和 Tensor Core 的计算能力。例如,在并行处理多路摄像头输入时,TensorRT 能优化任务调度,避免资源争用。 #### 4. **典型应用场景** - **工业检测**:实时缺陷检测系统,通过 TensorRT 加速实现毫秒级响应。 - **自动驾驶**:多传感器融合感知,低延迟处理激光雷达与摄像头数据。 - **智能安防**:基于视频流的实时行为分析,支持高密度计算负载。 --- ### §§ 相关问题 § 1. 如何在 Jetson Orin NX 上使用 `trtexec` 工具测试模型性能?[^1] 2. TensorRT 的 INT8 量化在 Jetson Orin NX 上如何实现? 3. 如何将 YOLOv8 模型转换为 TensorRT 引擎并部署到 Jetson Orin NX? 4. Jetson Orin NXTensorRT 环境配置有哪些注意事项? 5. TensorRT 支持哪些类型的模型优化策略?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值