You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Yolov5、OpenCV与ONNX时触发(-215:Assertion failed)错误的解决求助

错误原因分析

这个断言错误的核心是输入张量的格式/参数与ONNX模型的要求不匹配,导致OpenCV的DNN模块在执行reshape操作时无法匹配张量形状。具体来说,代码存在两个关键问题:

  1. Yolov5训练时使用RGB格式图像,且输入张量需要归一化到[0,1]范围,但你用cv2.dnn.blobFromImage时没有做通道转换和正确归一化,输入的BGR格式、未归一化的张量和模型预期不符。
  2. 手动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()
额外验证步骤
  1. 运行前可打印模型输入形状,确认和设置匹配:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 20:22:56