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

Mat*_*qua 4 python opencv onnx yolov5

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

[错误: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 blob=0 [错误: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\模块\dnn\src\layers\reshape_layer.cpp:106:错误:(-215:断言失败)total(srcShape,srcRange.start,srcRange.end)== maskTotal在函数'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)
Run Code Online (Sandbox Code Playgroud)

(这是错误行)

    outs = net.forward(outputLayers)
Run Code Online (Sandbox Code Playgroud)

我不确定这是否只是我对 onnx 的理解,或者是否有我没有注意到的修复。

任何帮助表示赞赏!

Muh*_*war 6

截至目前最新版本的OpenCV(4.5.4),OpenCV无法在不进行简化操作的情况下加载onnx文件。您已使用以下命令将 yolov5 pt 文件导出到 onnx 文件。

 python export.py --weights .\best.pt
Run Code Online (Sandbox Code Playgroud)

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

对于Ubuntu:

python export.py --weights .\yolov5s.pt --include onnx --simplify
Run Code Online (Sandbox Code Playgroud)

对于 Windows

pip install onnx
pip install onnx-simplifier 
python export.py --weights .\yolov5s.pt --include onnx --simplify
Run Code Online (Sandbox Code Playgroud)

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

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