当前位置: 首页 > news >正文

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) 通俗易懂算法 支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归任务的机器学习算法。在最简单的情况下&#xff0c;SVM是一种线性分类器&#xff0c;适用于二分类问题。它的基本思想是找到一个超平面&#xff08;在二维…...

上海市计算机学会竞赛平台2024年8月月赛丙组调和级数

题目描述 给定一个整数 nn&#xff0c;记 ⌊x⌋⌊x⌋ 表示不超过实数 xx 的最大整数&#xff0c;请求出 ⌊n1⌋⌊n2⌋⌊n3⌋⋯⌊nn−1⌋⌊nn⌋⌊1n​⌋⌊2n​⌋⌊3n​⌋⋯⌊n−1n​⌋⌊nn​⌋ 输入格式 单个整数&#xff1a;表示 nn 输出格式 单个整数&#xff1a;表示答…...

【重学 MySQL】二十、运算符的优先级

【重学 MySQL】二十、运算符的优先级 MySQL 运算符的优先级&#xff08;由高到低&#xff09;注意事项示例 在 MySQL 中&#xff0c;运算符的优先级决定了在表达式中各个运算符被计算的先后顺序。了解运算符的优先级对于编写正确且高效的 SQL 语句至关重要。以下是根据高权威性…...

十种优化MySQL数据库的最佳建议

优化MySQL数据库可以提高查询性能和系统响应能力&#xff0c;以下是一些MySQL数据库优化的建议&#xff1a; 优化查询语句&#xff1a;避免使用SELECT *&#xff0c;只选择需要的字段&#xff1b;使用索引来加快查询速度&#xff1b;避免使用慢查询。 优化表结构&#xff1a;使…...

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 版本以后&#xff0c;移除了对 Netflix 的依赖&#xff0c;也就移除了负载均衡器 Ribbon&#xff0c;Spring Cloud 官方推荐使用 Loadbalancer 替换 Ribbon&#xff0c;而在 LoadBalancer 之前 Spring Cloud 一直使用的是 Ribbon 来做负载[均衡器的…...

Python | Leetcode Python题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; 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…...

进程间通信-进程池

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

【PYTHON 基础系列-request 模块介绍】

一、requests库简介 使用requests库能快速构建 HTTP 请求&#xff0c;而无需深入了解底层网络协议细节。其API设计直观&#xff0c;使得发送请求就像调用函数一样简单&#xff0c;同时提供了丰富的选项以满足复杂网络交互的需求。这种设计使得无论是初学者还是经验丰富的开发者…...

springboot 实现策略模式通过id进入不同的服务类service

在Spring Boot中实现策略模式&#xff0c;通常是将不同的算法封装在单独的类中&#xff0c;并使它们可以相互替换。这些类通常都实现同一个接口。在Spring Boot应用中&#xff0c;你可以通过Spring的依赖注入&#xff08;DI&#xff09;来管理这些策略类的实例&#xff0c;并通…...

AUC真的什么情形下都适合吗

AUC(Area Under the ROC Curve)是一个广泛使用的性能评价指标,它衡量了分类模型在不同阈值下区分正类和负类的能力。然而,在某些情况下,AUC可能不是最准确的评价指标,以下是几种可能的情况: 数据极度不均衡:在数据极度不均衡的情况下,即使模型只预测多数类,AUC也可能…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …...