使用Rust的OpenCV绑定加载YOLOv8 ONNX模型失败求助
问题描述
系统信息
OpenCV version: 4.6.0 Operating System: ubuntu 20.04 GCC version: 9.4.0 Rust Binding Version: 0.86.1
错误详情
使用readNetFromONNX加载YOLOv8 ONNX模型时触发以下错误:
msg: Error { code: -204, message: "OpenCV(4.2.0) ../modules/dnn/include/opencv2/dnn/dnn.inl.hpp:349: error: (-204:Requested object was not found) Required argument \"split\" not found into dictionary in function 'get'\n" }
补充说明:代码基于OpenCV Rust绑定编写,但错误来自C++头文件;已尝试过ONNX Runtime。
复现代码
use opencv::dnn; let onnx_path = "/home/Projects/rust-inference-onnx/model.onnx"; let model: dnn::Net = dnn::read_net_from_onnx(onnx_path).expect("Unable to load model");
解决方法
1. 修复OpenCV版本不一致问题
错误提示显示的是OpenCV 4.2.0,但你系统安装的是4.6.0,说明Rust绑定链接到了旧版本的OpenCV库。需要确保绑定编译时使用正确版本:
- 卸载系统中残留的旧版OpenCV(如果存在)
- 重新编译Rust
opencvcrate,指定系统中4.6.0的OpenCV路径:
(若OpenCV安装在默认路径,可省略OPENCV_PREFIX=/usr/local cargo buildOPENCV_PREFIX,显式指定能避免链接错误)
2. 重新导出兼容的YOLOv8 ONNX模型
OpenCV DNN对YOLOv8的支持依赖模型导出时的opset版本,建议用opset 12或更低版本导出,同时开启模型简化:
在YOLOv8的Python环境中执行:
from ultralytics import YOLO model = YOLO("yolov8n.pt") model.export(format="onnx", opset=12, simplify=True)
3. 显式设置模型输入参数
加载模型后手动指定输入形状和预处理参数,避免自动推断时的错误:
use opencv::dnn; let onnx_path = "/home/Projects/rust-inference-onnx/model.onnx"; let mut model = dnn::read_net_from_onnx(onnx_path).expect("Unable to load model"); // 根据你的模型尺寸设置输入形状(示例为640x640) model.set_input_shape(0, &[1, 3, 640, 640]).unwrap(); // 设置输入归一化参数 model.set_input_scale(0, 1.0 / 255.0).unwrap(); model.set_input_mean(0, &[0.0, 0.0, 0.0]).unwrap(); model.set_input_swap_rb(0, true).unwrap();
4. 改用ONNX Runtime Rust绑定(备选方案)
如果OpenCV DNN仍无法解决问题,使用ONNX Runtime的Rust绑定兼容性更稳定,示例代码:
use onnxruntime::{environment::Environment, GraphOptimizationLevel, Session}; fn main() -> Result<(), Box<dyn std::error::Error>> { let env = Environment::builder() .with_name("yolov8_inference") .build()?; let session = Session::builder()? .with_optimization_level(GraphOptimizationLevel::Basic)? .with_number_threads(4)? .load_model("/home/Projects/rust-inference-onnx/model.onnx")?; // 后续可添加输入预处理、推理、输出解析逻辑 Ok(()) }
内容的提问来源于stack exchange,提问作者Nawin Raj Kumar S
相关产品推荐
相关产品推荐

