模型推理库引擎

一、C++模型推理最常用的加速引擎

按照工业界使用率排序

所有引擎均支持C++ 原生调用,按通用性 / 硬件适配分为三大类,你只需要关注前 3 个核心即可:

1. 通用王者(全平台兼容,90% 项目首选)

ONNX Runtime

  • 使用率最高的通用推理引擎,无硬件绑定

  • 支持 CPU/GPU/ARM/NPU 等所有硬件,模型格式为 ONNX(所有深度学习框架都能导出)

  • 你的项目AlgorithmOnYolo就是这个,API 标准化、生态最完善

2. 硬件专属加速(性能天花板,项目必选)

OpenVINO

(英特尔硬件专属)

  • 英特尔 x86 CPU、iGPU、NPU、VPU 专用加速,CPU 推理速度远超 ONNX Runtime

  • 你的项目AlgorithmOvYolo就是这个,英特尔设备必用

TensorRT

(英伟达 GPU 专属)

  • 英伟达 GPU 推理速度天花板,服务器 / 边缘 GPU 场景必备

  • 工业界 GPU 推理第一选择,和 OpenVINO 形成「英特尔 + 英伟达」双硬件标配

端侧专用

(小众场景)

  • NCNN/MNN:手机、ARM 嵌入式板卡(瑞芯微 / 高通)轻量推理

  • TFLite:谷歌生态,移动端 / 边缘设备

 

二、不要全跑demo

1. 有必要全跑一遍 demo 吗?

完全没必要!绝对不要!

  • 分支引擎再多,推理逻辑 100% 一致,只是 API 函数名不同

  • 你项目只用了 ONNX Runtime + OpenVINO,其他引擎(TensorRT/NCNN 等)项目不用就不碰

2. 吃透 ONNX Runtime,其他引擎可迁移吗?

✅ 高度可迁移!这是行业共识!

所有推理引擎的核心工作流程、设计思想、代码结构完全一致,你学会一个,其他引擎看 1 小时 API 就能上手。

 

三、为什么可迁移?统一推理 Pipeline(核心)

这是所有 C++ 推理引擎的通用固定流程,无论 ONNX Runtime/OpenVINO/TensorRT,步骤一模一样,仅 API 名称不同

// 所有推理引擎 通用6步流程
1. 加载模型 + 创建推理会话(核心对象)
2. 获取输入/输出张量信息(名称、形状、数据类型)
3. 预处理图片 → 填充输入张量
4. 执行推理(forward)
5. 获取输出张量 → 后处理(解析YOLO框)
6. 释放资源

举例对比(你的项目类结构就是最佳证明)

你的代码:

Algorithm(基类,定义统一接口:loadModel()infer()

AlgorithmOnYolo(ORT 实现)

AlgorithmOvYolo(OpenVINO 实现)

上层调用代码完全不用改,只需要切换子类对象,这就是可迁移性的工程实现

四、最优学习路径

第 1 步:死磕吃透 ONNX Runtime(1-2 天)

✅ 理由:

  • 通用无硬件限制,调试最简单

  • ONNX 格式是模型中间件,所有框架兼容

  • API 设计最标准,是所有引擎的「模板」

重点掌握:

  • 模型加载、会话创建

  • 输入输出张量操作

  • 内存分配、推理执行

  • 错误处理

第 2 步:快速上手 OpenVINO(半天)

因为流程完全一致,你只需要对照 ORT,替换对应 API 即可:

功能 ONNX Runtime OpenVINO
核心会话 Ort::Session ov::Core + ov::CompiledModel
输入张量 Ort::Value ov::Tensor
推理执行 session.Run() compiled_model()

第 3 步:按需学习其他引擎

  • 项目用英伟达 GPU → 学 TensorRT

  • 项目用嵌入式 ARM → 学 NCNN

 

 

 

库推理流程代码

ONNX Runtime

阶段1:初始化引擎(构造函数)

// 1. 创建环境    
mEnv = Ort::Env(ORT_LOGGING_LEVEL_WARNING, "YOLOV8");
​
// 2. 创建会话配置 
mSessionOptions = Ort::SessionOptioins();
mSessionOptions.SetGraphOptimizationLevel(ORT_ENABLE_BASIC);
​
// 3. 检查硬件支持 (CUDA/CPU)
std::vector<std::string> providers = Ort::GetAvaliableProviders();
​
// 4. 创建推理会话 (真正加载模型到内存) mSession谓之核心推理会话
mSession = Ort::Session(mEnv, modelPath.c_str(), mSessionOptions);

作用

  • 加载 ONNX 模型文件

  • 初始化推理引擎

  • 绑定硬件(CPU/CUDA)


阶段 2:获取模型输入输出信息(runInference 开头)

// 获取输入节点数量、名称、形状
numInputNodes = mSession.GetInputCount();
input_name = mSession.GetInputNameAllocated(...);
input_dims = [1, 3, 640, 640]  // 批大小=1,通道=3,高宽=640
​
// 获取输出节点信息
output_dims = [1, 84, 8400]    // YOLOv8 输出格式

作用

  • 自动读取模型的输入尺寸、输出维度

  • 不需要写死参数,通用性极强


阶段 3:图像预处理(核心!)

// 1. 黑边填充, 保持原图比例
cv::Mat mask = cv::Mat::zeros(最大尺寸, 最大尺寸, CV_8UC3);
image.copyTo(mask(roi));
​
// 2. 计算缩放比例 (用于后面还原检测框)
x_factor = 原图宽度 / 模型输入宽度
y_factor = 原图高度 / 模型输入高度
​
// 3. 转为 blob:归一化 + 通道转换 BGR→RGB
cv::Mat blob = cv::dnn::blobFromImage(
    mask, 1/255.0, Size(input_w, input_h),
    Scalar(0,0,0), true, false
);
​
// 4. 包装成 ONNX Runtime 张量
Ort::Value input_tensor = CreateTensor<float>(...)

作用

把一张真实图片 → 变成模型能看懂的张量数据


阶段 4:执行推理(最核心)

std::vector<Ort::Value> outputs =
    mSession.Run(
        runOptions,
        inputNames,  &input_tensor_, 1,
        outNames,    1
    );

一句话解释

把预处理好的图片喂给模型,模型跑前向传播,输出预测结果


阶段 5:后处理解析(YOLO 解码)

// 1. 获取输出指针
const float* pdata = outputs[0].GetTensorMutableData<float>();
​
// 2. 转成矩阵方便操作
cv::Mat det_output = dout.t();  // 变成 8400 行, 每行一个预测框
​
// 3. 遍历所有框,筛选置信度 > 阈值
for(8400个框) {
    取置信度
    if(置信度 > 0.5)
        解析 cx, cy, w, h
        还原到原图坐标
}
​
// 4. NMS 非极大值抑制(去掉重复框)
cv::dnn::NMSBoxes(boxes, confidences, ...);
​
// 5. 输出最终检测结果
detects.push_back(最终框)

✔ 总结:ONNX Runtime 标准推理五步法

  1. 创建环境 + 加载模型

  2. 获取输入输出信息

  3. 图像预处理

  4. Run () 推理

  5. 后处理解析结果

 

ONNX Runtime 推理流程固定为五步:初始化 → 取信息 → 预处理 → 推理 → 后处理

ONNX Runtime 本身不依赖 OpenCV,OpenCV 只是用来做图像处理;虽然两者往往一同出现

ONNX Runtime 是专业推理引擎,OpenCV DNN 只是轻量辅助工具,速度与功能差距巨大

 

 

 

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐