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
下一篇:
记录桌面端应用的自动化的一些坑和解决方式