Bob's Blog

Web开发、测试框架、自动化平台、APP开发、机器学习等

返回上页首页

pytorch转为onnx并调用时遇到的问题汇总



目前用yolov5已经生成了可用的pytorch的模型文件,后缀名为pt,加载和预测用的代码较多,打算试一下转换为onnx的类型用opencv加载,减少代码量也减少第三方包的安装。

发现没有想象中简便,有时间的时候逐步尝试并记录一下遇到的问题。

首先在用yolov5本身的export.py进行转换,然后用opencv加载onnx

import cv2

net = cv2.dnn.readNetFromONNX("./yolov5.onnx")
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)

加载时遇到类似getLayerInstance或findCommonShape的错误

# [ERROR:0@26.902] global /Users/xperience/actions-runner/_work/opencv-python/opencv-python/opencv/modules/dnn/src/onnx/onnx_importer.cpp (1021) handleNode DNN/ONNX: ERROR during processing node with 3 inputs and 1 outputs: [Range]:(onnx_node!Range_296) from domain='ai.onnx'
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# cv2.error: OpenCV(4.6.0) /Users/xperience/actions-runner/_work/opencv-python/opencv-python/opencv/modules/dnn/src/onnx/onnx_importer.cpp:1040: error: (-2:Unspecified error) in function 'handleNode'
# > Node [Range@ai.onnx]:(onnx_node!Range_296) parse error: OpenCV(4.6.0) /Users/xperience/actions-runner/_work/opencv-python/opencv-python/opencv/modules/dnn/src/layer_internals.hpp:110: error: (-2:Unspecified error) Can't create layer "onnx_node!Range_296" of type "Range" in function 'getLayerInstance'
# [ERROR:0@0.089] global onnx_importer.cpp:1034 handleNode DNN/ONNX: ERROR during processing node with 2 inputs and 1 outputs: [Mul]:(onnx_node!Mul_401) from domain='ai.onnx'
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# cv2.error: OpenCV(4.9.0) /Users/xperience/GHA-OpenCV-Python2/_work/opencv-python/opencv-python/opencv/modules/dnn/src/onnx/onnx_importer.cpp:1053: error: (-2:Unspecified error) in function 'handleNode'
# > Node [Mul@ai.onnx]:(onnx_node!Mul_401) parse error: OpenCV(4.9.0) /Users/xperience/GHA-OpenCV-Python2/_work/opencv-python/opencv-python/opencv/modules/dnn/src/layers/nary_eltwise_layers.cpp:144: error: (-215:Assertion failed) shape[i] == 1 || outShape[i] == 1 in function 'findCommonShape'

此时重新指定export的参数,比如:

python export.py --weights ./yolov5.pt --img 640 --simplify --optimize --opset 12 --include onnx

然后确认一下opencv-python的版本,我试过4.6.0.66无法加载,但换做4.9.0.80则可以。

不过加载时成功了,在推理时却报了其他错误

[ERROR:0@0.168] global net_impl.cpp:1169 getLayerShapesRecursively OPENCV/DNN: [Slice]:(onnx_node_output_0!1276): getMemoryShapes() throws exception. inputs=1 outputs=1/1 blobs=0
[ERROR:0@0.168] global net_impl.cpp:1172 getLayerShapesRecursively     input[0] = [ 1834 3456 ]
[ERROR:0@0.168] global net_impl.cpp:1176 getLayerShapesRecursively     output[0] = [ 1834 3456 ]
[ERROR:0@0.168] global net_impl.cpp:1182 getLayerShapesRecursively Exception message: OpenCV(4.9.0) /Users/xperience/GHA-OpenCV-Python2/_work/opencv-python/opencv-python/opencv/modules/dnn/src/layers/slice_layer.cpp:259: error: (-215:Assertion failed) sliceRanges_rw[i].size() <= inpShape.size() in function 'getMemoryShapes'

Traceback (most recent call last):
  File "ultralytics_yolov5/load_onnx.py", line 24, in <module>
    preds = net.forward()
cv2.error: OpenCV(4.9.0) /Users/xperience/GHA-OpenCV-Python2/_work/opencv-python/opencv-python/opencv/modules/dnn/src/layers/slice_layer.cpp:259: error: (-215:Assertion failed) sliceRanges_rw[i].size() <= inpShape.size() in function 'getMemoryShapes'

未明确原因,这部分之后来更新

 

updated 2024.3.1, 目前能用export.py和detect.py来导出onnx和用onnx来识别图片,没报错,但是没有预测的结果。。。虽然用同样的pt文件,也是使用detect.py则有预测结果。。

python export.py --weights ./yolov5.pt --img 640 --simplify --optimize --include onnx  # export
python detect.py --weights ./yolov5.onnx --source ./screenshot.png --dnn  # detect

 

 

下一篇:  记录桌面端应用的自动化的一些坑和解决方式
上一篇:  Blazor Hybrid在mac上的调试

共有0条评论

添加评论

暂无评论