YOLOv10部署教程,使用tensorRT部署,有转化和推理代码

YOLOv10部署教程,使用tensorRT部署,有转化和推理代码

  • 一、使用平台
    • 1. 转化onnx模型
    • 转化trt模型
  • 模型推理
  • 全部的代码

论文题目:YOLOv10: Real-Time End-to-End Object Detection
研究单位:清华大学
论文链接:http://arxiv.org/abs/2405.14458
代码链接:https://github.com/THU-MIG/yolov10

作者提供的模型性能评价图,如下:
在这里插入图片描述
YOLOv10-N:https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10n.pt
YOLOv10-S:https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10s.pt
YOLOv10-M:https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10m.pt
YOLOv10-B:https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10b.pt
YOLOv10-L:https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10l.pt
YOLOv10-X:https://github.com/jameslahm/yolov10/releases/download/v1.0/yolov10x.pt
推理时间速度很快,最主要是不需要后处理,就是网络比较难训练,有spa多占用了几g显存,并且收敛较慢

一、使用平台

win10、TensorRT=8.6.1

1. 转化onnx模型

git clone https://github.com/THU-MIG/yolov10.git
conda create -n YOLO python=3.9
conda activate YOLO
cd yolov10
pip install -r requirements.txt

下载pt模型
用下面代码转化

# -*- coding: utf-8 -*-
# @Time    : 2024/6/13 10:54
# @Site    : 
# @File    : export.py
# @Comment :
from ultralytics import YOLOv10# Load a model
model = YOLOv10(r"yolov10s.pt")  # load an official model# Export the model
model.export(format="onnx",device='0',batch=2,opset=12, half=True)"""
Argument	Type	Default	Description
format	str	'torchscript'	Target format for the exported model, such as 'onnx', 'torchscript', 'tensorflow', or others, defining compatibility with various deployment environments.
imgsz	int or tuple	640	Desired image size for the model input. Can be an integer for square images or a tuple (height, width) for specific dimensions.
keras	bool	False	Enables export to Keras format for TensorFlow SavedModel, providing compatibility with TensorFlow serving and APIs.
optimize	bool	False	Applies optimization for mobile devices when exporting to TorchScript, potentially reducing model size and improving performance.
half	bool	False	Enables FP16 (half-precision) quantization, reducing model size and potentially speeding up inference on supported hardware.
int8	bool	False	Activates INT8 quantization, further compressing the model and speeding up inference with minimal accuracy loss, primarily for edge devices.
dynamic	bool	False	Allows dynamic input sizes for ONNX and TensorRT exports, enhancing flexibility in handling varying image dimensions.
simplify	bool	False	Simplifies the model graph for ONNX exports with onnxslim, potentially improving performance and compatibility.
opset	int	None	Specifies the ONNX opset version for compatibility with different ONNX parsers and runtimes. If not set, uses the latest supported version.
workspace	float	4.0	Sets the maximum workspace size in GiB for TensorRT optimizations, balancing memory usage and performance.
nms	bool	False	Adds Non-Maximum Suppression (NMS) to the CoreML export, essential for accurate and efficient detection post-processing.
batch	int	1	Specifies export model batch inference size or the max number of images the exported model will process concurrently in predict mode.
"""

转化trt模型

import onnx
import tensorrt as trt
# import sys
# sys.setrecursionlimit(500000)def onnx_export_engine(workspace,onnx_path,trt_path):#创建构建器logger=trt.Logger(trt.Logger.WARNING)builder=trt.Builder(logger)#创建一个构建配置config=builder.create_builder_config()config.max_workspace_size=workspace*1<<30#创建网络定义flag=(1<<int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))network=builder.create_network(flag)#导入onnx模型parser=trt.OnnxParser(network,logger)if not parser.parse_from_file(str(onnx_path)):raise RuntimeError(f'failed to load ONNX file: {onnx}')inputs=[network.get_input(i) for i in range(network.num_inputs)]outputs=[network.get_output(i) for i in  range(network.num_outputs)]# network.get_input(0).setAllowedFormats(int)# network.get_input(1).setAllowedFormats(int)# for inp in inputs:#     LOGGER.info(f'{prefix}\tinput "{inp.name}" with shape {inp.shape} and dtype {inp.dtype}')# for out in outputs:#     LOGGER.info(f'{prefix}\toutput "{out.name}" with shape {out.shape} and dtype {out.dtype}')## LOGGER.info(f'{prefix} building FP{16 if builder.platform_has_fast_fp16 else 32} engine in {f}')# if builder.platform_has_fast_fp16:##     config.set_flag(trt.BuilderFlag.FP16)# config.set_flag(trt.BuilderFlag.FP16)engine_path=trt_pathwith builder.build_serialized_network(network,config) as engine:with open(engine_path,'wb') as t:# t.write(engine.serialize())t.write(engine)print('转化完成')if __name__ == '__main__':onnx_path='weights2/best.onnx'trt_path='end2end.engine'onnx_export_engine(4,onnx_path,trt_path)

模型推理

  • 定义变量
from models import TRTModule  # isort:skip
import argparse
import cv2
from numpy import ndarray
import time
import random
import numpy as np
import os
import pickle
from collections import defaultdict, namedtuple
from pathlib import Path
from typing import List, Optional, Tuple, Union
import onnx
import tensorrt as trt
import torchos.environ['CUDA_MODULE_LOADING'] = 'LAZY'
random.seed(0)# detection model classes
CLASSES = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus','train', 'truck', 'boat', 'traffic light', 'fire hydrant','stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog','horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe','backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat','baseball glove', 'skateboard', 'surfboard', 'tennis racket','bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl','banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot','hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop','mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven','toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase','scissors', 'teddy bear', 'hair drier', 'toothbrush')
# # three:
# CLASSES = (
#     'person', 'sports ball', 'car'
# )# colors for per classes
COLORS = {cls: [random.randint(0, 255) for _ in range(3)]for i, cls in enumerate(CLASSES)
}
# image suffixs
SUFFIXS = ('.bmp', '.dng', '.jpeg', '.jpg', '.mpo', '.png', '.tif', '.tiff','.webp', '.pfm')
  • 定义模型加载类
class TRTModule(torch.nn.Module):dtypeMapping = {trt.bool: torch.bool,trt.int8: torch.int8,trt.int32: torch.int32,trt.float16: torch.float16,trt.float32: torch.float32}def __init__(self, weight: Union[str, Path],device: Optional[torch.device]) -> None:super(TRTModule, self).__init__()self.weight = Path(weight) if isinstance(weight, str) else weightself.device = device if device is not None else torch.device('cuda:0')self.stream = torch.cuda.Stream(device=device)self.__init_engine()self.__init_bindings()def __init_engine(self) -> None:logger = trt.Logger(trt.Logger.WARNING)trt.init_libnvinfer_plugins(logger, namespace='')with trt.Runtime(logger) as runtime:model = runtime.deserialize_cuda_engine(self.weight.read_bytes())context = model.create_execution_context()num_bindings = model.num_bindingsnames = [model.get_binding_name(i) for i in range(num_bindings)]self.bindings: List[int] = [0] * num_bindingsnum_inputs, num_outputs = 0, 0for i in range(num_bindings):if model.binding_is_input(i):num_inputs += 1else:num_outputs += 1self.num_bindings = num_bindingsself.num_inputs = num_inputsself.num_outputs = num_outputsself.model = modelself.context = contextself.input_names = names[:num_inputs]self.output_names = names[num_inputs:]self.idx = list(range(self.num_outputs))def __init_bindings(self) -> None:idynamic = odynamic = FalseTensor = namedtuple('Tensor', ('name', 'dtype', 'shape'))inp_info = []out_info = []for i, name in enumerate(self.input_names):assert self.model.get_binding_name(i) == namedtype = self.dtypeMapping[self.model.get_binding_dtype(i)]shape = tuple(self.model.get_binding_shape(i))if -1 in shape:idynamic |= Trueinp_info.append(Tensor(name, dtype, shape))for i, name in enumerate(self.output_names):i += self.num_inputsassert self.model.get_binding_name(i) == namedtype = self.dtypeMapping[self.model.get_binding_dtype(i)]shape = tuple(self.model.get_binding_shape(i))if -1 in shape:odynamic |= Trueout_info.append(Tensor(name, dtype, shape))if not odynamic:self.output_tensor = [torch.empty(info.shape, dtype=info.dtype, device=self.device)for info in out_info]self.idynamic = idynamicself.odynamic = odynamicself.inp_info = inp_infoself.out_info 

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

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

相关文章

如何在idea安装git,使用gitee?

一、什么是git&#xff0c;git与gitee、GitHub的关系&#xff1f; 1.什么是git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于企业项目中程序员协同开发。 2.git与gitee、GitHub的关系是什么&#xff1f; git &#xff1a;Git是一种版本控制系统&#x…

Three.js相机简明教程

相机校准是 3D 计算机图形学中的一个基本概念&#xff0c;涉及设置虚拟相机以模拟真实世界相机的视角和行为。在 Three.js&#xff08;一种流行的 3D 渲染 JavaScript 库&#xff09;中&#xff0c;了解相机校准对于创建逼真且身临其境的 3D 场景至关重要。在本文中&#xff0c…

UML类图的建立过程

1. 概念层类图 概念层的类图描述的是现实世界中对问题领域的概念理解&#xff0c;类图中表达的类与现实世界的问题领域中的实际事物有着明显的对应关系&#xff0c;类之间的关系也与问题领域中实际事物之间的关系有着明显的对应关系。在概念层类图阶段很少考虑或者几乎不需要考…

07-7.5.1 散列表的基本概念

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

28.IP核理论知识(Xilinx)

&#xff08;1&#xff09;ip核是什么&#xff1f; IP&#xff08;Intellectual Property&#xff09;即知识产权&#xff0c;在半导体产业中&#xff0c;将IP核定义为“用于ASIC或FPGA中的预先设计好的电路功能模块”&#xff0c;简而言之&#xff0c;这里的IP即电路功能模块。…

Element轮播图组件切换太单调?手把手带你重写切换效果

前言&#xff1a; 最近在逛山东博物馆网站的时候&#xff0c;发现该网站主页淡入淡出的轮播图非常的优雅&#xff0c;所以就想来复刻一下&#xff0c;也算是对组件进行了二次的封装和修改 工具准备&#xff1a; Vue3Element Plus走马灯组件 注意事项&#xff1a; Element …

Python爬虫:基础爬虫架构及爬取证券之星全站行情数据!

爬虫成长之路&#xff08;一&#xff09;里我们介绍了如何爬取证券之星网站上所有A股数据&#xff0c;主要涉及网页获取和页面解析的知识。爬虫成长之路&#xff08;二&#xff09;里我们介绍了如何获取代理IP并验证&#xff0c;涉及了多线程编程和数据存储的知识。此次我们将在…

网络编程学习之tcp

按下*&#xff08;星号&#xff09;可以搜索当前光标下的单词。 Tcp编程的过程 打开网络设备 Bind&#xff1a;给服务地址把ip号和端口号连接进去 Tcp是有状态的 Listen是进入监听状态&#xff0c;看有没有客户端来连接服务器 Tcp比udp消耗过多资源 Upd类似于半双工&#…

D50SB100-ASEMI逆变焊机专用D50SB100

编辑&#xff1a;ll D50SB100-ASEMI逆变焊机专用D50SB100 型号&#xff1a;D50SB100 品牌&#xff1a;ASEMI 封装&#xff1a;DSB-5 批号&#xff1a;2024 现货&#xff1a;50000 正向电流&#xff08;Id&#xff09;&#xff1a;50A 反向耐压&#xff08;VRRM&#xf…

【AIGC】二、mac本地采用GPU启动keras运算

mac本地采用GPU启动keras运算 一、问题背景二、技术背景三、实验验证本机配置安装PlaidML安装plaidml-keras配置默认显卡 运行采用 CPU运算的代码step1 先导入keras包&#xff0c;导入数据cifar10&#xff0c;这里可能涉及外网下载&#xff0c;有问题可以参考[keras使用基础问题…

echarts中tooltip添加点击事件代码示例

echarts中tooltip添加点击事件代码示例_javascript技巧_脚本之家 点击事件无法使用this 或者 this无法使用&#xff1a;

13--memcache与redis

前言&#xff1a;数据库读取速度较慢一直是无法解决的问题&#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

ret2csu简单总结

一个比较进阶的rop利用方式。 Why ret to csu&#xff1f; 当程序给的gadget不够&#xff0c;或者输入长度受限时&#xff0c;可以考虑利用csu中的众多gadget以及一个call指令来劫持控制流。 __libc_csu_init 汇编源码: .text:0000000000400790 ; void __fastcall _libc_c…

无人直播赚钱的底层逻辑是什么?一文揭晓!

当前&#xff0c;网络直播已经成为各类商家提高曝光和引流获客的主要渠道之一&#xff0c;这在为商家带来新机遇的同时&#xff0c;也让他们因人手不足或资金匮乏等原因而陷入无人问津窘境之中。在此背景下&#xff0c;无人直播软件一经出现&#xff0c;便引起了众多商家的关注…

28V飞机库维修电源在飞机库中的作用

飞机库作为飞机停放和维护的重要场所&#xff0c;其设施的完善和电源系统的稳定运行是保证飞机正常运行的前提。随着我国航空事业的飞速发展&#xff0c;飞机维修行业面临着越来越大的挑战。在飞机维修过程中&#xff0c;电源系统作为关键组成部分&#xff0c;其稳定性和可靠性…

【笔记】从零开始做一个精灵龙女-画贴图阶段(上)

此文只是我的笔记&#xff0c;不包全看懂&#xff0c;有问题可评论 PS贴图加工 1.打开ps 拖入uv图&#xff0c;新建图层&#xff0c;设置背景色为灰色&#xff0c;改一下图层名字 2.按z缩小一下uv图层&#xff0c;拖入实体uv图片&#xff08;目的是更好上色&#xff0c;比如…

鸿蒙语言基础类库:【@ohos.util.Vector (线性容器Vector)】

线性容器Vector 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Vect…

微信小程序切换商户号

1.登录微信公众平台小程序 2.功能->微信支付 3.关联成功后会志一关联商户号列表显示 4.登录你需要切换的商户号 在下面选择你需要开通的产品服务 5.切换到账户中心的api安全里面 只需要改变当前下面的配置即可切换小程序的收款商户号 申请API证书按照官方的指引即可解…

pytorch-RNN存在的问题

这里写目录标题 1. RNN存在哪些问题呢&#xff1f;1.1 梯度弥散和梯度爆炸1.2 RNN为什么会出现梯度弥散和梯度爆炸呢&#xff1f; 2. 解决梯度爆炸方法3. Gradient Clipping的实现4. 解决梯度弥散的方法 1. RNN存在哪些问题呢&#xff1f; 1.1 梯度弥散和梯度爆炸 梯度弥散是…

【人工智能】深度学习:神经网络模型

【人工智能】深度学习&#xff1a;神经网络模型 神经网络基础知识 BP神经网络的概念 单个神经元的结构 CNN模型汇总 LeNet5 模型 AlexNet 模型 VGG模型 Inception Net&#xff08;GoogleNet&#xff09;模型 ResNet &#xff08;残差网络&#xff09; RNN模型&#x…