Onnxruntime之图像分类(c++)

介绍

ONNX 是神经网络模型互操作性的开放标准格式。它还有一个ONNX Runtime,能够使用不同的执行提供程序(例如 CPU、CUDA、TensorRT 等)执行神经网络模型。虽然有很多使用 ONNX Runtime Python API 运行推理的示例,但使用的示例ONNX 运行时 C++ API 非常有限。

在这篇博文中,我想讨论如何使用 OpenCV C++ API 进行图像处理并使用 ONNX Runtime C++ API 运行推理。

环境准备

  • opencv
  • onnxruntime-gpu
  • onnxruntime-gpu-tensorrt

手动编译onnxruntime参考这里

如果不需要使用tensorrt的话,建议使用官方release的库
举个例子,当前环境为Ubuntu18.04+GPU,下载

### 部署ONNX Runtime GPU版本于Ubuntu上的C++项目 #### 安装依赖项 为了成功部署ONNX Runtime GPU版本,在Ubuntu环境中需安装必要的软件包。这包括但不限于OpenCV用于图像处理,以及特定版本的CUDA以支持GPU加速功能[^2]。 对于CUDA的支持,确保已正确安装兼容版本,如11.6,并验证环境变量`PATH`和`LD_LIBRARY_PATH`已经包含了CUDA的相关路径。此外,还需确认系统能够识别并利用NVIDIA显卡资源。 #### 下载与编译ONNX Runtime源码 获取官方发布的适用于Linux系统的预构建二进制文件可能无法满足所有需求;因此建议从GitHub仓库克隆最新稳定版源代码,并按照官方文档指导完成针对GPU特性的定制化编译过程。此过程中应启用相应的选项来激活CUDA支持: ```bash git clone https://github.com/microsoft/onnxruntime.git cd onnxruntime ./build.sh --config Release --use_cuda --cuda_home /usr/local/cuda --cudnn_home /usr/local/cuda ``` 上述命令假设CUDA工具链位于默认位置(/usr/local/cuda),如有不同则需调整相应参数值[^1]。 #### 设置CMakeLists.txt配置 创建一个新的C++工程项目时,应在项目的根目录下编写或修改`CMakeLists.txt`文件,以便集成ONNX Runtime作为外部库的一部分。具体操作如下所示: - 同样地,把链接所需的静态/动态库所在的位置指派给`${ONNXRUNTIME_LIBS}`; - 使用`include_directories()`函数引入这些定义好的路径,从而让编译器知道去哪里查找所需声明和实现[^3]。 ```cmake set(ONNXRUNTIME_INCLUDE_DIRS "/path/to/onnxruntime/include") set(ONNXRUNTIME_LIBS "/path/to/onnxruntime/lib") include_directories( ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ${ZED_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS} ${ONNXRUNTIME_INCLUDE_DIRS} ) target_link_libraries(your_target_name PRIVATE ${ONNXRUNTIME_LIBS}) ``` 请注意替换实际路径至本地安装的具体地址。 #### 编写推理程序 最后一步是在应用程序中加载训练好的YOLOv8模型(或其他任何基于ONNX格式的目标检测网络),并通过调用API执行前向传播计算获得预测结果。下面给出了一段简单的示例代码片段展示如何初始化Session对象并传入输入张量数据结构: ```cpp #include "onnxruntime_cxx_api.h" // ... other includes ... Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test"); Ort::SessionOptions session_options; session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED); std::vector<const char*> model_input_names{"images"}; std::vector<std::vector<int64_t>> input_node_dims{ {1, 3, 640, 640}}; auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, /*data_ptr=*/nullptr, /*size=*/input_size, &input_node_dims.at(0), /*dims_count=*/4); Ort::Session session(env, "./model.onnx", session_options); auto output_tensors = session.Run(Ort::RunOptions{nullptr}, &model_input_names.front(), &input_tensor, /*num_inputs=*/1, /*output_names=*/&model_output_names.front(), /*num_outputs=*/static_cast<size_t>(model_output_names.size())); ``` 这段代码展示了基本框架,但具体的细节可能会因所使用的模型而异,请参照相关资料进一步完善逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点PY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值