使用Yolov5、OpenCV与ONNX时触发(-215:Assertion failed)错误的解决求助
错误原因分析
这个断言错误的核心是输入张量的格式/参数与ONNX模型的要求不匹配,导致OpenCV的DNN模块在执行reshape操作时无法匹配张量形状。具体来说,代码存在两个关键问题:
- Yolov5训练时使用RGB格式图像,且输入张量需要归一化到
[0,1]范围,但你用cv2.dnn.blobFromImage时没有做通道转换和正确归一化,输入的BGR格式、未归一化的张量和模型预期不符。 - 手动resize图像后,
blobFromImage的参数设置未对齐模型输入要求,进一步加剧了张量形状/格式的不匹配。
修复方案
直接修改blobFromImage的参数,并调整冗余操作,具体代码修改如下:
import cv2 import numpy as np onnx_model_path = 'C:/Users/182947/Downloads/best.onnx' net = cv2.dnn.readNetFromONNX(onnx_model_path) if net.empty(): print('Network load failed.') exit() class_labels = ['R_eye_open', 'L_eye_open', 'R_eye_close', 'L_eye_close'] camera = cv2.VideoCapture(0) while True: ret, frame = camera.read() if not ret: break # 移除手动resize,让blobFromImage自动处理尺寸转换 # 关键修改:添加归一化、通道转换参数,匹配Yolov5训练时的输入格式 input_blob = cv2.dnn.blobFromImage( frame, scalefactor=1/255.0, # 将像素值归一化到[0,1]范围 size=(320, 320), # 严格匹配模型输入尺寸 swapRB=True, # 将OpenCV默认的BGR格式转为RGB,对齐训练数据格式 crop=False, mean=[0, 0, 0] # Yolov5无需额外减均值,仅做归一化即可 ) net.setInput(input_blob) output = net.forward() # 遍历检测结果(若模型输出维度不符,可先打印output.shape确认) for detection in output[0, 0]: score = float(detection[2]) class_id = int(detection[1]) if score > 0.5: left = int(detection[3] * frame.shape[1]) top = int(detection[4] * frame.shape[0]) right = int(detection[5] * frame.shape[1]) bottom = int(detection[6] * frame.shape[0]) cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), thickness=2) class_label = class_labels[class_id] cv2.putText(frame, f'{class_label}: {score:.2f}', (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) cv2.imshow("Frame", frame) if cv2.waitKey(1) & 0xFF == ord('q'): break camera.release() cv2.destroyAllWindows()
额外验证步骤
- 运行前可打印模型输入形状,确认和设置匹配:
print(net.getLayer(0).inputShape)
正常输出应为(1, 3, 320, 320),表示输入是1个batch、3通道、320x320的张量,和blobFromImage生成的形状一致。
2. 若仍有问题,检查ONNX模型导出过程:确保使用Yolov5官方export.py导出,参数--imgsz设置为320,避免导出时的输入尺寸和代码不一致。
内容的提问来源于stack exchange,提问作者CW K
相关产品推荐
相关产品推荐

