Python —— Win10将Yolov5的.pt模型导出为.onnx模型

在Windows10环境下,使用conda激活Pytorch1.8.1环境,然后在Yolov5源代码目录下,修改export.py文件以适应自己的训练数据和权重文件。通过降低ONNX的opset版本解决导出失败的问题,并指定导出格式为ONNX。如果需要,可以修改设备参数以使用GPU导出模型。
部署运行你感兴趣的模型镜像
结果

在这里插入图片描述

相关文章

     Python —— Pytorch训练集指令、测试数据指令

     Python —— Windows10下配置Pytorch环境、进行训练模型并测试(完整流程,附有视频)

正文

     参考:如何在windows系统下将yolov5的pt模型导出为onnx模型

# 进入conda,进入自己的pytorch环境
conda activate pytorch1.8.1

# 进入yolov5源码目录
cd D:\Software\Anaconda\newCODE\yolov5

# 修改export.py:
		parser.add_argument('--data', type=str, default=ROOT / 'data/coco128.yaml', help='dataset.yaml path')
    改为自己训练时用的yaml:
    	parser.add_argument('--data', type=str, default=ROOT / 'data/voc-mask.yaml', help='dataset.yaml path'):
    	parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'yolov5s.pt', help='model.pt path(s)')
    改为自己训练产生的pt模型:
    	parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/base/weights/best.pt', help='model.pt path(s)')

# 生成.onnx模型。导出的.onnx会创建在.pt的同级目录下
python export.py
# 附错误问题:
	1、执行生成onnx模型指令出现错误:
		ONNX: export failure 0.0s: Unsupported ONNX opset version: 17
		解决:
			修改export.py
				将:
					parser.add_argument('--opset', type=int, default=17, help='ONNX: opset version')
    			改为:
    				parser.add_argument('--opset', type=int, default=12, help='ONNX: opset version')

	2、如果导出没有onnx只有torchscript,::
			parser.add_argument('--include',nargs='+',default=['torchscript'],help='torchscript, onnx, openvino, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs, paddle')
		改为:
			parser.add_argument('--include',nargs='+',default=['onnx'],help='torchscript, onnx, openvino, engine, coreml, saved_model, pb, tflite, edgetpu, tfjs, paddle')


#附加知识:
	1、默认使用cpu导出.onnx模型,如需要用gpu导出::
			parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
		改为:
			parser.add_argument('--device', default='0', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')

笔者

笔者 - jxd

您可能感兴趣的与本文相关的镜像

PyTorch 2.8

PyTorch 2.8

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>好的,我现在需要帮助用户了解如何使用Python加载并运行YOLOv5ONNX模型进行图像目标检测。首先,我需要回顾一下用户提供的引用内容,看看有哪些已有的信息可以利用。 根据引用[2]和引用[3],用户提到了使用OpenCV和C++的dnn模块来加载YOLOv5ONNX模型。但用户现在问的是Python的实现方法,所以可能需要调整这些信息到Python环境中。同时,引用[1]中讨论了YOLOv8的ONNX模型推理,但这里需要的是YOLOv5,不过两者可能有相似的处理步骤。 首先,用户需要安装必要的库,比如OpenCV和onnxruntime。接着,加载ONNX模型,可能需要使用cv2.dnn.readNetFromONNX或者onnxruntime的InferenceSession。不过,在Python中,OpenCV的dnn模块可能对ONNX的支持有限,特别是较新的模型,因此可能需要用onnxruntime来确保兼容性。 然后,预处理图像。YOLO模型通常需要将图像缩放到固定大小,比如640x640,并进行归一化处理。预处理步骤包括调整大小、转换为RGB格式(因为OpenCV默认是BGR)、归一化到0-1范围,并转置为通道优先的格式(CHW)。 接下来是推理过程,将处理后的图像数据输入模型,获取输出结果。YOLOv5的输出通常是多个检测框,每个框包含坐标、置信度和类别概率。需要对这些输出进行后处理,包括非极大值抑制(NMS)来过滤重叠的框。 后处理部分可能需要解析输出张量,根据置信度阈值和NMS阈值筛选出最终的检测结果。然后,将检测框绘制到原图上,并标注类别和置信度。 需要注意的是,YOLOv5ONNX模型可能有不同的输出层结构,可能需要根据具体的模型版本调整解析方式。例如,某些版本可能输出为一个张量,而另一些可能分为多个输出层。用户需要确认模型的输出格式,以确保正确解析。 此外,引用[3]提到在导出ONNX模型时需要指定opset版本为12,否则可能出错。因此,在用户准备模型时,需要确保导出设置正确,避免兼容性问题。 最后,用户可能需要一个完整的代码示例,涵盖从加载模型、预处理、推理到后处理和可视化的所有步骤。同时,要提醒用户注意路径设置、依赖库版本以及可能的常见错误,比如形状不匹配或输出解析错误。</think>### Python使用YOLOv5 ONNX模型进行图像目标检测实现方法 #### 一、环境准备 1. 安装依赖库: ```bash pip install opencv-python onnxruntime numpy ``` 2. 下载YOLOv5预训练ONNX模型文件(需确保导出时设置`--opset=12`)[^3] #### 二、核心代码实现 ```python import cv2 import numpy as np import onnxruntime as ort class YOLOv5_ONNX: def __init__(self, onnx_path, conf_thres=0.5, iou_thres=0.45): self.conf_threshold = conf_thres self.iou_threshold = iou_thres self.session = ort.InferenceSession(onnx_path) self.input_shape = self.session.get_inputs()[0].shape[2:] self.classes = ["person", "car", ...] # 根据实际类别填写 def preprocess(self, image): # 图像预处理 img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) img = cv2.resize(img, self.input_shape) img = img.astype(np.float32) / 255.0 img = np.transpose(img, (2, 0, 1)) # HWC转CHW return np.expand_dims(img, axis=0) # 添加batch维度 def postprocess(self, outputs, origin_shape): # 后处理包含NMS predictions = np.squeeze(outputs[0]).T scores = np.max(predictions[:, 4:], axis=1) predictions = predictions[scores > self.conf_threshold, :] scores = scores[scores > self.conf_threshold] # 获取类别ID class_ids = np.argmax(predictions[:, 4:], axis=1) # 解析边界框 boxes = self.rescale_boxes(predictions[:, :4], origin_shape) # NMS过滤 indices = cv2.dnn.NMSBoxes(boxes.tolist(), scores.tolist(), self.conf_threshold, self.iou_threshold) return [boxes[indices], scores[indices], class_ids[indices]] def rescale_boxes(self, boxes, origin_shape): # 将坐标映射回原始图像尺寸 input_height, input_width = self.input_shape orig_height, orig_width = origin_shape # 计算缩放比例 x_scale = orig_width / input_width y_scale = orig_height / input_height # 解算坐标 boxes[:, [0, 2]] *= x_scale boxes[:, [1, 3]] *= y_scale return boxes.astype(np.int32) def detect(self, image): origin_shape = image.shape[:2] input_tensor = self.preprocess(image) outputs = self.session.run(None, {self.session.get_inputs()[0].name: input_tensor}) return self.postprocess(outputs, origin_shape) # 使用示例 model = YOLOv5_ONNX("yolov5s.onnx") image = cv2.imread("test.jpg") boxes, scores, class_ids = model.detect(image) # 绘制检测结果 for box, score, class_id in zip(boxes, scores, class_ids): x1, y1, x2, y2 = box cv2.rectangle(image, (x1, y1), (x2, y2), (0,255,0), 2) label = f"{model.classes[class_id]}: {score:.2f}" cv2.putText(image, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2) cv2.imshow("Result", image) cv2.waitKey(0) ``` #### 三、关键点说明 1. **输入预处理**:必须保持与训练时相同的归一化方式(此处使用/255归一化) 2. **输出解析**:YOLOv5 ONNX输出格式为`[batch, 25200, 85]`,其中85维包含: - 前4维:边界框坐标(cx, cy, width, height) - 第5维:置信度 - 后80维:类别概率(COCO数据集) 3. **性能优化**:可通过`providers=['CUDAExecutionProvider']`启用GPU加速
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信必诺

嗨,支持下哥们呗。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值