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
相关文章:

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 YO…...

码上君量化互助社群介绍
写在前面 量化投资是一个漫长的过程,一个人单打独斗会走很多弯路,所以建立一个交流沟通互助群是有必要的。 无论是加入我的这个量化互助社群,还是加入其他的社群,首先要想想自己加入社群的目的是什么,自己想从中获得…...

Qt使用小技巧之按钮动态变化
前言 最近写小demo中无意发现的,是想实现当鼠标悬停到按钮上面的时候,按钮实现动态变化,让人知道鼠标经过了按钮,效果如下 hoverDynamicPushButton 正文 首先是将按钮的边框给去掉,然后设置下它的悬停伪状态就行了 格…...
MySQL——事务与存储过程(三)存储过程的使用(1)调用存储过程
使用存储过程可以使程序执行效率更高、安全性更好,增强程序的可重用性和维护性。接下来将针对存储过程的使用进行详细的讲解。 存储过程有多种调用方法。存储过程必须使用CALL语句调用,并且存储过程和数据库相关,如果要执行其他数据库…...

基于VUE2-dataV和echarts实现的可视化大屏,百分比适配PC端
可视化平台中,数据分别通过仪表盘、环状图、柱形图、曲线图、 滚动表格等多种形式展示数据变化。 可视化平台大致分为左、中、右三部分,左侧由能耗总览、耗能 占比、库存预警构成,中间由数据总览、销售计划完成率构成,右侧 由销售…...

FastAPI模块化:为复杂应用程序提供清晰的结构
开题描述: 在现代软件开发中,随着应用程序规模的扩大和功能的增加,传统的单体架构逐渐暴露出其局限性。FastAPI,作为一款高性能的现代Web框架,通过其模块化设计提供了一种解决方案。本文将探讨FastAPI模块化如何为构建…...

【Hot100】LeetCode—215. 数组中的第K个最大元素
目录 1- 思路快速选择 2- 实现⭐215. 数组中的第K个最大元素——题解思路 3- ACM实现 原题连接:215. 数组中的第K个最大元素 1- 思路 快速选择 第 k 大的元素的数组下标: int target nums.length - k 1- 根据 partition 分割的区间来判断当前处理方式…...

pycharm如何安装selenium
在pycharm中打开一个项目后,点击Setting(ALTCtrlS快捷键) 然后点击install package完成后点击关闭这个窗口,就可以在代码中使用selenium了 成功后出现如下界面 编写一段正常可以运行操作chorme浏览器的 from selenium import webdriver # 指定ChromeDriver的路径driver we…...

css三点闪烁(可用于加载样式、标题等)
代码案例 HTML <div class"flexAlign loading"><div class"loading_item"></div><div class"loading_item"></div><div class"loading_item"></div> </div> <div class"ot…...
支持向量机 (Support Vector Machines, SVM)
支持向量机 (Support Vector Machines, SVM) 通俗易懂算法 支持向量机(SVM)是一种用于分类和回归任务的机器学习算法。在最简单的情况下,SVM是一种线性分类器,适用于二分类问题。它的基本思想是找到一个超平面(在二维…...
上海市计算机学会竞赛平台2024年8月月赛丙组调和级数
题目描述 给定一个整数 nn,记 ⌊x⌋⌊x⌋ 表示不超过实数 xx 的最大整数,请求出 ⌊n1⌋⌊n2⌋⌊n3⌋⋯⌊nn−1⌋⌊nn⌋⌊1n⌋⌊2n⌋⌊3n⌋⋯⌊n−1n⌋⌊nn⌋ 输入格式 单个整数:表示 nn 输出格式 单个整数:表示答…...

【重学 MySQL】二十、运算符的优先级
【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级(由高到低)注意事项示例 在 MySQL 中,运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…...
十种优化MySQL数据库的最佳建议
优化MySQL数据库可以提高查询性能和系统响应能力,以下是一些MySQL数据库优化的建议: 优化查询语句:避免使用SELECT *,只选择需要的字段;使用索引来加快查询速度;避免使用慢查询。 优化表结构:使…...
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…...
Ribbon 源码分析【Ribbon 负载均衡】
前言 在 Spring Cloud 2020 版本以后,移除了对 Netflix 的依赖,也就移除了负载均衡器 Ribbon,Spring Cloud 官方推荐使用 Loadbalancer 替换 Ribbon,而在 LoadBalancer 之前 Spring Cloud 一直使用的是 Ribbon 来做负载[均衡器的…...

Python | Leetcode Python题解之第385题迷你语法分析器
题目: 题解: class Solution:def deserialize(self, s: str) -> NestedInteger:if s[0] ! [:return NestedInteger(int(s))stack, num, negative [], 0, Falsefor i, c in enumerate(s):if c -:negative Trueelif c.isdigit():num num * 10 int…...

进程间通信-进程池
目录 理解 完整代码 完善代码 回收子进程: 不回收子进程: 子进程使用重定向优化 理解 #include <iostream> #include <unistd.h> #include <string> #include <vector> #include <sys/types.h>void work(int rfd) {…...

【PYTHON 基础系列-request 模块介绍】
一、requests库简介 使用requests库能快速构建 HTTP 请求,而无需深入了解底层网络协议细节。其API设计直观,使得发送请求就像调用函数一样简单,同时提供了丰富的选项以满足复杂网络交互的需求。这种设计使得无论是初学者还是经验丰富的开发者…...
springboot 实现策略模式通过id进入不同的服务类service
在Spring Boot中实现策略模式,通常是将不同的算法封装在单独的类中,并使它们可以相互替换。这些类通常都实现同一个接口。在Spring Boot应用中,你可以通过Spring的依赖注入(DI)来管理这些策略类的实例,并通…...
AUC真的什么情形下都适合吗
AUC(Area Under the ROC Curve)是一个广泛使用的性能评价指标,它衡量了分类模型在不同阈值下区分正类和负类的能力。然而,在某些情况下,AUC可能不是最准确的评价指标,以下是几种可能的情况: 数据极度不均衡:在数据极度不均衡的情况下,即使模型只预测多数类,AUC也可能…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...