模型推理引擎理解
模型推理库引擎
一、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 标准推理五步法
-
创建环境 + 加载模型
-
获取输入输出信息
-
图像预处理
-
Run () 推理
-
后处理解析结果
ONNX Runtime 推理流程固定为五步:初始化 → 取信息 → 预处理 → 推理 → 后处理;
ONNX Runtime 本身不依赖 OpenCV,OpenCV 只是用来做图像处理;虽然两者往往一同出现
ONNX Runtime 是专业推理引擎,OpenCV DNN 只是轻量辅助工具,速度与功能差距巨大;
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)