使用cv2.dnn.readNet读取YOLOv7 ONNX文件失败,寻求解决方法
解决YOLOv7 ONNX文件无法被OpenCV dnn读取的问题
一、先验证ONNX文件有效性
- 安装ONNX官方校验工具,检查文件是否损坏或导出异常:
若输出报错,说明文件本身有问题,需要重新导出。!pip install onnx !onnxchecker yolov7.onnx - 用Netron可视化检查网络结构:
!pip install netron
打开生成的链接,查看网络节点是否完整,有无缺失层。import netron netron.start('yolov7.onnx')
二、修正YOLOv7 u5分支的导出参数
u5分支默认导出参数可能不兼容OpenCV,调整命令重新导出:
!python export.py --weights yolov7.pt --grid --end2end --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640 --opset 12
- 关键参数说明:
--simplify:简化ONNX结构,去除冗余节点--opset 12:指定opset版本为12,匹配OpenCV 4.6.0的支持范围- 不要加
--dynamic,OpenCV dnn对动态尺寸ONNX支持有限
三、检查OpenCV的ONNX支持
Colab默认的OpenCV可能未编译ONNX支持,验证并重新安装:
- 检查支持状态:
import cv2 print("ONNX支持状态:", cv2.dnn.readNetFromONNX is not None)
- 若输出为
False,重新安装带ONNX支持的版本:
!pip uninstall -y opencv-python opencv-contrib-python !pip install opencv-contrib-python==4.6.0.66
四、替代方案:用ONNX Runtime推理
若以上步骤无效,改用ONNX Runtime完成检测:
- 安装依赖:
!pip install onnxruntime-gpu
- 基础推理代码:
import onnxruntime as ort import cv2 import numpy as np # 加载模型 session = ort.InferenceSession('yolov7.onnx', providers=['CUDAExecutionProvider', 'CPUExecutionProvider']) # 图片预处理 img = cv2.imread('test.jpg') img_resized = cv2.resize(img, (640, 640)) img_rgb = cv2.cvtColor(img_resized, cv2.COLOR_BGR2RGB) input_tensor = img_rgb.transpose(2, 0, 1)[np.newaxis, ...].astype(np.float32) / 255.0 # 推理 outputs = session.run(None, {session.get_inputs()[0].name: input_tensor}) # 后处理(参考YOLOv7官方detect.py逻辑解析检测框、类别、置信度)
五、额外注意事项
- 尽量在Colab环境内直接导出ONNX,避免本地与Colab的PyTorch/ONNX版本差异导致的兼容性问题
- 重新下载预训练权重确保完整性:
!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt
内容的提问来源于stack exchange,提问作者Model Trainer
相关产品推荐
相关产品推荐

