YOLOv5自定义训练模型转ONNX后OpenCV加载报错求助
问题:YOLOv5转ONNX后OpenCV加载失败
我使用YOLOv5自定义训练数据集,生成的best.pt文件检测与评估均正常,但转换为ONNX模型后,用OpenCV加载时出现报错。
报错信息
C:\Users\admin\.conda\envs\yolov5\python.exe D:\Demo\yolov5\test_onnx.py [ERROR:0@0.012] global onnx_importer.cpp:1054 cv::dnn::dnn4_v20221220::ONNXImporter::handleNode DNN/ONNX: ERROR during processing node with 3 inputs and 1 outputs: [Conv]:(onnx_node!/model.2/m/m.0/cv1/conv/Conv) from domain='ai.onnx' Traceback (most recent call last): File "D:\Demo\yolov5\test_onnx.py", line 2, in <module> net = cv2.dnn.readNetFromONNX('runs/train/exp8/weights/best.onnx') cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\onnx\onnx_importer.cpp:1073: error: (-2:Unspecified error) in function 'cv::dnn::dnn4_v20221220::ONNXImporter::handleNode' > Node [Conv@ai.onnx]:(onnx_node!/model.2/m/m.0/cv1/conv/Conv) parse error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:394: error: (-215:Assertion failed) !hasBias() || blobs[1].total() == (size_t)weightShape[0] in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'
解决办法
- 指定低版本ONNX算子集转换:转换时添加
--opset 12参数,OpenCV的DNN模块对高版本ONNX算子支持有限。执行命令:python export.py --weights runs/train/exp8/weights/best.pt --include onnx --opset 12 - 升级OpenCV版本:当前使用的OpenCV 4.7.0对部分ONNX算子兼容性不足,升级到4.8.0及以上版本可改善适配问题。
- 禁用动态维度转换:转换ONNX时添加
--dynamic False参数,避免动态轴导致OpenCV解析卷积层时出错。 - 验证ONNX模型有效性:用
onnxruntime测试模型是否正常,代码示例:
如果能正常输出形状,说明模型本身无问题,问题出在OpenCV的DNN模块适配。import onnxruntime as rt sess = rt.InferenceSession('runs/train/exp8/weights/best.onnx') print("输入形状:", sess.get_inputs()[0].shape) print("输出形状:", sess.get_outputs()[0].shape)
内容的提问来源于stack exchange,提问作者user21499510
相关产品推荐
相关产品推荐

