YOLOv8转换到kmodel时出现undefined symbol错误

Viewed 64

重现步骤

使用yolo v8训练视觉检测模型,使用yolov8版本为8.3.159,训练完后在windows使用ultralytics中的函数导出.pt文件为.onnx文件,然后在WSL Ubuntu22.04中使用nncase工具链转换onnx为kmodel

期待结果和实际结果

正常结果应该会生成.kmodel文件并提示转换成功,但实际提示报错如下:

ImportError: /home/silence/miniconda3/envs/yolo2kmodel/lib/python3.9/site-packages/onnx/../../../libprotobuf.so.29.3.0: undefined symbol: _ZN4absl12lts_202501275MutexD1Ev

软硬件版本信息

训练时的相关版本信息:
yolo v8版本:v8.3.159,使用yolov8n模型

Linux中的主要软件包版本如下:
nncase:2.9.0
nncase-kpu:2.9.0
onnx:1.18.0
onnxruntime:1.19.2
onnxsim:0.4.36
错误日志

Traceback (most recent call last):
  File "/home/silence/models/to_kmodel.py", line 5, in <module>
    import onnxsim
  File "/home/silence/miniconda3/envs/yolo2kmodel/lib/python3.9/site-packages/onnxsim/__init__.py", line 1, in <module>
    from onnxsim.onnx_simplifier import simplify, main
  File "/home/silence/miniconda3/envs/yolo2kmodel/lib/python3.9/site-packages/onnxsim/onnx_simplifier.py", line 13, in <module>
    import onnx  # type: ignore
  File "/home/silence/miniconda3/envs/yolo2kmodel/lib/python3.9/site-packages/onnx/__init__.py", line 84, in <module>
    from onnx.onnx_cpp2py_export import ONNX_ML
ImportError: /home/silence/miniconda3/envs/yolo2kmodel/lib/python3.9/site-packages/onnx/../../../libprotobuf.so.29.3.0: undefined symbol: _ZN4absl12lts_202501275MutexD1Ev

尝试解决过程

1.重新生成onnx文件,生成onnx文件代码如下:

from ultralytics import YOLO
model = YOLO('E:/yolov8/ultralytics-v8.3.159/ultralytics-main/runs\detect/train/weights/best.pt')  
model.export(format='onnx')

代码生成过程中出现了警告如下:

PyTorch: starting from 'E:\yolov8\ultralytics-v8.3.159\ultralytics-main\runs\detect\train\weights\best.pt' with input shape (1, 3, 640, 640) BCHW and output shape(s) (1, 14, 8400) (17.6 MB)
requirements: Ultralytics requirements ['onnxslim>=0.1.56', 'onnxruntime'] not found, attempting AutoUpdate...
WARNING requirements:  AutoUpdate skipped (offline)

ONNX: starting export with onnx 1.17.0 opset 19...
WARNING ONNX: simplifier failure: No module named 'onnxslim'
ONNX: export success  1.3s, saved as 'E:\yolov8\ultralytics-v8.3.159\ultralytics-main\runs\detect\train\weights\best.onnx' (11.7 MB)

但onnx文件仍然生成成功了,再次转换仍出现undefined symbol错误

2.升级onnx
使用conda upgrade指令升级onnx,conda提示已经安装了相关包(应该已经是当前状态下最新)仍出现该报错

3.升级 Protobuf
使用sudo apt install重新安装libprotobuf-dev protobuf-compiler,安装程序正常完成,但报错仍在,使用ldd libprotobuf.so提示 No such file or directory(不太清楚为什么)
图片.png
补充材料

使用的转换代码程序为
https://kendryte-download.canaan-creative.com/developer/k230/yolo_files/test_yolov8.zip
中的to_kmodel.py

1 Answers

有可能是版本冲突的问题,你可以试着把onnx切成1.16,onnxruntime 1.19.2, onnxsim 0.4.36,protobuf 5.28.2, numpy 1.26.4,试一下,最好不要直接安装最新版本。

成功了!感谢大佬!