You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 opencv crate,指定系统中4.6.0的OpenCV路径:
    OPENCV_PREFIX=/usr/local cargo build
    
    (若OpenCV安装在默认路径,可省略OPENCV_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:05:24