Yolov5 OpenCV 错误:(-215:断言失败)同时使用 .onnx

Posted

技术标签:

【中文标题】Yolov5 OpenCV 错误:(-215:断言失败)同时使用 .onnx【英文标题】:Yolov5 OpenCV error: (-215:Assertion failed) whilst using .onnx 【发布时间】:2022-01-14 12:54:08 【问题描述】:

我刚刚创建了一个 yolov5 模型,并将其导出为 onnx 格式,以便与 opencv 一起使用 但我不断收到错误:

[ERROR:0] 全局 D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\dnn.cpp (3554) cv::dnn::dnn4_v20211004::Net::Impl: :getLayerShapesRecursively OPENCV/DNN: [Reshape]:(466): getMemoryShapes() 抛出异常。输入=1 输出=1/1 blobs=0 [ERROR:0] 全局 D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\dnn.cpp (3557) cv::dnn::dnn4_v20211004::Net::Impl::getLayerShapes递归输入[0] = [1 24 52 52] [ERROR:0] 全局 D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\dnn.cpp (3561) cv::dnn::dnn4_v20211004::Net::Impl::getLayerShapes递归输出[0] = [] [错误:0] 全局 D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\dnn.cpp (3567) cv::dnn::dnn4_v20211004::Net::Impl::getLayerShapesRecursively 异常消息:OpenCV(4.5.4) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\reshape_layer.cpp:106:错误:(-215:断言失败)总计(srcShape, srcRange.start, srcRange.end) == maskTotal in function 'cv::dnn::computeShapeByReshapeMask'

代码如下:

onnx_model = onnx.load('best.onnx')
onnx.checker.check_model(onnx_model)
net = cv.dnn.readNetFromONNX('best.onnx')


classes = []

with open("coco-dataset.labels", "r") as f:
    classes = [line.strip() for line in f.readlines()]

layerNames = net.getLayerNames()
outputLayers=[]
for i in net.getUnconnectedOutLayers():
    outputLayers.append(layerNames[i-1])




bounding_box = 'top': 0, 'left': 0, 'width': 1920, 'height': 1080
sct = mss()

while True:
    screenShot = sct.grab(bounding_box)
    img_np = np.array(screenShot)
    frame = cv.cvtColor(img_np, cv.COLOR_RGBA2RGB)
    frame_id += 1
    height, width, channels= frame.shape


    blob = cv.dnn.blobFromImage(frame, 0.0039216, (416, 416), (0, 0, 0), True, crop=False)


    cv.imshow("Image", frame)

    net.setInput(blob)

(这是错误行)

    outs = net.forward(outputLayers)

我不确定这是否只是我对 onnx 的理解,或者是否有我没有掌握的修复方法。

感谢任何帮助!

【问题讨论】:

【参考方案1】:

直到现在最新版本的OpenCV(4.5.4),OpenCV在没有简化操作的情况下无法加载onnx文件。 您已使用以下命令将 yolov5 pt 文件导出到 onnx 文件。

 python export.py --weights .\best.pt

尝试使用以下命令将 pt 文件导出到 onnx 文件。

对于 Ubuntu:

python export.py --weights .\yolov5s.pt --include onnx --simplify

适用于 Windows

pip install onnx
pip install onnx-simplifier 
python export.py --weights .\yolov5s.pt --include onnx --simplify

然后使用 OpenCV 加载创建的 onnx 文件,OpenCV 将成功读取该 onnx。

还在 blobfromimage 函数中将模型大小更改为 (640,640)。

【讨论】:

感谢您的帮助!可悲的是它仍然产生同样的错误,我已经尝试降级和升级,但我仍然无法让它工作。 如果这行[net = cv.dnn.readNetFromONNX('best.onnx') ]没有报错,说明模型读取成功。 另外,你的模型尺寸是多少? 640 还是 416? 我刚刚回滚了opencv的版本,它正在产生一个新的错误“错误:(-204:未找到请求的对象)在函数'cv :: dnn的const blobs中找不到Blob ::dnn4_v20191202::ONNXImporter::getBlob'",在 [net = cv.dnn.readNetFromONNX('best.onnx') ] 行中。 我的模型尺寸是 640。

以上是关于Yolov5 OpenCV 错误:(-215:断言失败)同时使用 .onnx的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV(4.5.2)/tmp/pip-req-build-sl2aelck/opencv/modules/imgproc/src/color.cpp:182:错误:(-215:断言失败)!_sr

尝试检测人脸时断言失败 215 错误

OpenCV 断言失败:(-215:断言失败)npoints >= 0 &&(深度 == CV_32F || 深度 == CV_32S)

错误:(-215:断言失败)!函数'cv :: CascadeClassifier :: detectMultiScale'中的empty()

如何解决函数'resize'中的错误(-215:断言失败)!ssize.empty()?

CV2 图像错误:错误:(-215:断言失败)!ssize.empty() in function 'cv::resize'