/mnnrs

mnn的rust绑定,风格与ncnn一致,非常好调用

Primary LanguageRust

MNN-RUST

mnn 的 rust 绑定,成功实现 rust 调用。

已完成

  • [✅] 加载模型
  • [✅] 参数设置
  • [✅] 推理
  • [✅] 输入、输出
  • [✅] 预处理及后处理

运行 demo

fn main() -> anyhow::Result<()> {
    let res = mnnrs::version();
    println!("mnnrs version: {}", res);
    let mut net = mnnrs::Net::new();
    net.load_model("xxx.mnn")?; // 加载模型
    let mut opt = mnnrs::SessionConfig::default();
    opt.forward_type = mnnrs::ForwardType::CPU; // CUDA, OpenCL, OpenGL, Vulkan...
    opt.num_threads = 4;
    opt.memory = mnnrs::Memory::Low;
    opt.power = mnnrs::Power::High;
    opt.precision = mnnrs::Precision::High;
    let mnn_cfg = opt.to_mnn_config();
    let ex = net.create_session(&mnn_cfg); // 创建session
                                           // 输入和输出创建
    let mut in0 = net.get_input_tensor(&ex, "image")?; // 输入
    let mut in1 = net.get_input_tensor(&ex, "mask")?; // 输入
    let mut out0 = net.get_output_tensor(&ex, "output")?; // 输出

    // 预处理
    let data = vec![1.460; 1 * 512 * 512 * 1]; // 假设有一些数据
    in1.set_data(&data);

    // 推理
    net.run_session(&ex); // 正式推理

    // 后处理
    let ptr_f32 = out0.get_data()?;
    let res = unsafe { std::slice::from_raw_parts(ptr_f32, data.len()) };
    println!("{:?}", res);

    println!("推理结束");
    Ok(())
}

使用方法

cargo add mnnrs
# 然后设置环境变量
export MNN_INCLUDE_DIR=/path/to/mnn/include

用法和我写的 ncnnrs 一样,风格也一样。MNN 的好处是几乎支持 100%的 onnx 模型转换,不像 ncnn 那样几乎 9 成新模型卡在无法转换上。

特性

  • 使用 rust 开发 MNN
  • 分离静态库,可满足跨端编译要求

ref