TensorRT-For-YOLO-Series项目:实现yolov10模型的python-tensorrt推理(对比int8与fp16推理差异)

项目地址:https://github.com/Linaom1214/TensorRT-For-YOLO-Series/tree/cuda-python
算法支持状态:
2024.6.16 Support YOLOv9, YOLOv10, changing the TensorRT version to 10.0
2023.8.15 Support cuda-python
2023.5.12 Update
2023.1.7 support YOLOv8
2022.11.29 fix some bug thanks @JiaPai12138
2022.8.13 rename reop、 public new version、 C++ for end2end
2022.8.11 nms plugin support ==> Now you can set --end2end flag while use export.py get a engine file
2022.7.8 support YOLOv7
2022.7.3 support TRT int8 post-training quantization

1、tensorrt环境安装

下载tensorrt https://developer.nvidia.com/tensorrt/download/10x
这里根据个人的系统、cuda版本进行选择。
在这里插入图片描述
解压文件,并将tensorrt的路径添加系统环境变量中,具体如下所示:在这里插入图片描述
然后安装python-tensorrt,具体如下所示
在这里插入图片描述
最后安装
pip install cuda-python

同时需要设计cuda环境变量
1、在系统环境变量path中添加 %CUDA_PATH%
在这里插入图片描述
2、在系统环境变量中添加 CUDA_PATH
在这里插入图片描述

2、onnx2trt

执行以下代码可以将pt模型导出为onnx模型

from ultralytics import YOLOmodel = YOLO("yolov10n.pt")
model.fuse()  
model.info(verbose=False)  # Print model information
model.export(format='onnx')  # TODO: 

执行以下命令可以将onnx模型转换为trt模型
python export.py -o yolov10n.onnx -e yolov10.trt --end2end --v10 -p fp32
在这里插入图片描述

3、模型推理

测试代码如下所示

python trt.py -e yolov10.trt  -i src/1.jpg -o yolov10-1.jpg --end2end

推理输出如下所示,针对640x640的输入,fps为146,基本上是6.8ms一张图。推理软硬件环境为:win10+tensorrt10.4+python3.8+cuda12.1+3060显卡

Namespace(end2end=True, engine='yolov10.trt', image='src/1.jpg', output='yolov10-1.jpg', video=None)
146.50372522347308 FPS

对应的trt.py代码如下所示

from utils.utils import preproc, vis
from utils.utils import BaseEngine
import numpy as np
import cv2
import time
import os
import argparseclass Predictor(BaseEngine):def __init__(self, engine_path):super(Predictor, self).__init__(engine_path)self.n_classes = 80  # your model classesif __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument("-e", "--engine", help="TRT engine Path")parser.add_argument("-i", "--image", help="image path")parser.add_argument("-o", "--output", help="image output path")parser.add_argument("-v", "--video",  help="video path or camera index ")parser.add_argument("--end2end", default=False, action="store_true",help="use end2end engine")args = parser.parse_args()print(args)pred = Predictor(engine_path=args.engine)pred.get_fps()img_path = args.imagevideo = args.videoif img_path:origin_img = pred.inference(img_path, conf=0.1, end2end=args.end2end)cv2.imwrite("%s" %args.output , origin_img)if video:pred.detect_video(video, conf=0.1, end2end=args.end2end) # set 0 use a webcam

4、fp16推理

导出fp16模型

python export.py -o yolov10n.onnx -e yolov10.trt --end2end --v10 -p fp16
推理模型

(base) PS D:\yolo_seq\TensorRT-For-YOLO-Series-cuda-python> 
python trt.py -e yolov10.trt  -i src/1.jpg -o yolov10-1.jpg --end2end

输出结果如下所示,可以发现fps此时接近200,5ms左右一张图


Namespace(end2end=True, engine='yolov10.trt', image='src/1.jpg', output='yolov10-1.jpg', video=None)
199.44339337776142 FPS

在这里插入图片描述

5、int8推理

导出int8模型需要设置 calib_input参数(设置校准数据的路径)

python export.py  -o yolov10n.onnx -e yolov10.int8.trt --end2end --v10 -p int8 --calib_input  D:\yolo_seq\datasets\coco128\images\train2017

然后再基于以下命令测试int8模型推理效果

python trt.py -e yolov10.int8.trt  -i src/1.jpg -o yolov10-1.jpg --end2end

此时运行输出如下

Namespace(end2end=True, engine='yolov10.int8.trt', image='src/1.jpg', output='yolov10-1.jpg', video=None)
259.70545246403356 FPS

运行效果如下,相比于fp16,似乎没有区别。
在这里插入图片描述

上点难度看一下int8与fp16推理效果

python trt.py -e yolov10.int8.trt  -i D:\yolo_seq\coco\images\val2017\000000001000.jpg -o 0-int8.jpg --end2endpython trt.py -e yolov10.trt  -i D:\yolo_seq\coco\images\val2017\000000001000.jpg -o 0-fp16.jpg --end2end

此时可以发现,转为int8的模型明显存在较多漏检
在这里插入图片描述

基于更多的数据矫正,再对比一下模型的效果差异

python export.py  -o yolov10n.onnx -e yolov10.int8-2.trt --end2end --v10 -p int8 --calib_input  D:\yolo_seq\coco\images\val2017

测试新数据,可以发现int8模型任然存在不足

python trt.py -e yolov10.int8.trt  -i D:\yolo_seq\coco\images\train2017\000000581831.jpg -o 1-int8.jpg --end2endpython trt.py -e yolov10.trt  -i D:\yolo_seq\coco\images\train2017\000000581831.jpg -o 1-fp16.jpg --end2end

在这里插入图片描述
测试校准数据中的样例,依旧可以发现int8模型存在精度损失

python trt.py -e yolov10.int8.trt  -i D:\yolo_seq\coco\images\val2017\000000001000.jpg -o 2-int8.jpg --end2endpython trt.py -e yolov10.trt  -i D:\yolo_seq\coco\images\val2017\000000001000.jpg -o 2-fp16.jpg --end2end

在这里插入图片描述

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

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

相关文章

观趋势 谋发展 2024 SSHT上海智能家居展有哪些创新呈现?

引言:大数跨境发布的《2024全球智能家居市场洞察报告》显示,智能家居市场正迎来快速增长,预计从2024年的1215.9亿美元增长至2032年的6332.0亿美元,复合年增长率为22.9%。 近年来,随着物联网、AI等底层技术的飞速进步&…

C++学习笔记(11)

四、学习要领 1)如果容器有成员函数,则使用成员函数,如果没有才考虑用 STL 的算法函数。 2)把全部的 STL 算法函数过一遍,知道大概有些什么东西。 3)如果打算采用某算法函数,一定要搞清楚它的原…

kubernetes微服务之ingress-nginx

目录 1 ingress-nginx 介绍 2 Ingress-nginx 的工作原理 3 使用 Ingress-nginx 的步骤 4 部署 ingress : 4.1 开启ipvs 模式 4.2 下载部署文件 4.3 上传镜像到harbor 4.4 修改文件中镜像地址,与harbor仓库路径保持一致 4.5 检查是否running 4.6 将ingress的命名…

轻松上手,高效产出:音频剪辑工具年度精选

不知道你有没有拍vlog记录生活的习惯,有时候视频里穿插进自己的声音能让视频更加丰富贴上自己的标签。这次我们一起探讨当下有哪些好用的在线音频剪辑工具。 1.FOXIT音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 这个工具是一款专业的音…

Java 数据类型详解:基本数据类型与引用数据类型

在 Java 编程语言中,数据类型主要分为两大类:基本数据类型和引用数据类型。理解这两种类型的区别、使用场景及其转换方式是学习 Java 的基础。本文将深入探讨这两类数据类型的特点,并展示自动类型转换、强制类型转换以及自动拆箱和封箱的使用…

虚拟现实辅助工程技术助力多学科协同评估

在当今高速发展的经济环境中,制造业面临着多重挑战,包括提高产品性能、压缩设计周期、实现轻量化设计和降低成本。为了有效应对这些挑战,多学科协同评估成为缩短研发周期和提升研制质量的关键手段。 传统的多学科评估面临着数据孤立与融合困难…

《‌黑神话:‌悟空》‌游戏攻略‌

时光荏苒,岁月如梭,不知不觉已经来到了2024年的9月份了。 ‌突然想写一篇关于《‌黑神话:‌悟空》‌的游戏攻略‌。 在《‌黑神话:‌悟空》‌这款以中国古代名著《‌西游记》‌为背景的动作角色扮演游戏中,‌玩家将扮…

LeetCode 热题 100 回顾9

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

前端页面加载由模糊到清晰的实现方案

要实现图片加载时由模糊逐渐变得清晰的效果,可以使用 CSS 和 JavaScript 的结合。这里的思路是:先让图片在加载时模糊显示,等图片完全加载完后,再去掉模糊效果。 1. 使用 CSS 实现模糊效果 我们可以使用 filter: blur() 来为图片添加模糊效果,结合 transition 属性在加载…

MongoDB Limit 与 Skip 方法

MongoDB Limit 与 Skip 方法 MongoDB 是一个流行的 NoSQL 数据库,它提供了灵活的数据存储和强大的查询功能。在处理大量数据时,我们常常需要限制返回的结果数量或者跳过一部分结果,这时就可以使用 MongoDB 的 limit 和 skip 方法。 Limit 方…

Python中差分进化differential_evolution的调用及参数说明

在场景应用中,要求我们的函数计算结果尽可能的逼近实际测量结果,可转化计算结果与测量结果的残差,通过最小化残差,便可求出最优的结果。但使用最小二乘等方法来计算时,常常会使迭代的结果显然局部最优点而导致结算错误…

【redis】redis的特性和主要应用场景

文章目录 redis 的特性在内存中存储数据可编程的扩展能力持久化集群高可用快 redis 的应用场景实时数据存储缓存消息队列 redis 的特性 redis 的一些特性(优点)成就了它 在内存中存储数据 In-memory data structures MySQL 主要是通过“表”的方式来…

JavaEE-HTTPHTTPS

目录 HTTP协议 一、概念 二、http协议格式 http请求报文 http响应报文 URL格式 三、认识方法 四、认识报头 HTTP响应中的信息 HTTPS协议 对称加密 非对称加密 中间人攻击 解决中间人攻击 HTTP协议 一、概念 HTTP (全称为 "超⽂本传输协议") 是⼀种应⽤…

WEB项目解决CORS 跨域问题

为了安全,web默认是不允许跨域访问的。不过实际项目中,会遇到不同模块之间来回跳转的情况。所以,项目内部一般会修改配置或者代码来解决CORS跨域问题。 我的后端使用的是 Jetty 服务器,所以下面就拿jetty来举例。Jetty 提供了一个…

14.2 k8s中我们都需要监控哪些组件

本节重点介绍 : k8s中关注四大块指标总结 容器基础资源指标k8s资源指标k8s服务组件指标部署在pod中业务埋点指标 k8s关注指标分析 k8s中组件复杂,我们主要专注的无外乎四大块指标: 容器基础资源指标 为何关注这些指标 我们的应用从独享一台机器上…

springboot组件使用-mybatis组件使用

文章目录 springboot使用mybatis组件1. 添加依赖2. 配置数据源3. 创建实体类4. 创建Mapper接口5. 创建Mapper XML文件6. 使用Mapper7. 启动类配置 mybtis 动态SQL1. Mapper 注解2. Select 注解3. Insert 注解4. Update 注解5. Delete 注解6. Results 注解7. Param 注解8. Cache…

Mysql中的锁机制详解

一、概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决…

一文讲懂Spring Event事件通知机制

目录 一 什么是spring event 二 怎么实现spring event 一 什么是spring event 我不会按照官方的解释来说什么是spring event,我只是按照自己的理解来解释,可能原理上会和官方有偏差,但是它的作用和功能就是这个,我更加偏向于从他…

Rust:Restful API 服务程序开发详述

0. 关于异步程序设计 0.1 对异步机制的理解 运行效率对于后端程序来讲很重要。我曾经以为,多线程机制是后端设计的终极方法,后来才发现,异步机制才是榨干 CPU 运行效率资源的关键所在。 我最初对于异步程序设计有误解,以为多线…

详解React setState调用原理和批量更新的过程

1. React setState 调用的原理 setState目录 1. React setState 调用的原理2. React setState 调用之后发生了什么?是同步还是异步?3. React中的setState批量更新的过程是什么? 具体的执行过程如下(源码级解析)&#x…