基于C++和ONNX Runtime部署YOLOv10的ONNX模型,可以遵循以下步骤:
准备环境:首先,确保已经下载后指定版本opencv和onnruntime的C++库。
模型转换:按照官方源码:https://github.com/THU-MIG/yolov10 安装好yolov10环境并将YOLOv10模型转换为ONNX格式。这通常涉及使用深度学习框架(如PyTorch或TensorFlow)加载原始模型,并导出为ONNX格式。转换指令
- # End-to-End ONNX
- yolo export model=jameslahm/yolov10{n/s/m/b/l/x} format=onnx opset=13 simplify
- # Predict with ONNX
- yolo predict model=yolov10n/s/m/b/l/x.onnx
C++环境配置:在CMakeLists.txt项目中正确引用了opencv和ONNX Runtime的头文件,并链接到相应的库。这允许在C++代码中使用ONNX Runtime的功能。
加载模型:使用ONNX Runtime的API加载转换后的YOLOv10 ONNX模型。
执行推理:通过ONNX Runtime的推理引擎,将图像数据输入到模型中,并执行目标检测任务。
处理结果:解析模型输出的结果,这通常涉及将输出的张量数据转换为可理解的检测结果,如边界框坐标和类别标签。
通过这些步骤,可以在C++环境中利用ONNX Runtime高效地部署YOLOv10模型,实现实时的目标检测功能。
【测试环境】
windows10 x64
vs2019
cmake==2.24.3
onnxruntime==1.12.0
opencv==4.7.0
【使用步骤】
首先cmake生成exe文件,然后将onnxruntime.dll和onnxruntime_providers_shared.dll放到exe一起,不然会提示报错0xc000007b,这是因为系统目录也有个onnxruntime.dll引发冲突,并把car.mp4也放到exe一起。运行直接输入
yolov10.exe C:\Users\Administrator\Desktop\yolov10-onnx-cplus\models\yolov10n.onnx
注意onnx路径要是你真实路径我的onnx路径是我桌面上地址
【代码调用】
注意onnxruntime使用的cpu版本库,如需使用GPU还需要修改代码才行
- #include "YOlov10Manager.h"
- #include <iostream>
- #include <opencv2/opencv.hpp>
-
- int main(int argc, char const *argv[])
- {
- std::string model_path = argv[1];
- cv::namedWindow("yolov10", cv::WINDOW_AUTOSIZE);
- Yolov10Manager detector(model_path);
-
- cv::VideoCapture cap("car.mp4");//这个地方也可以修改成视频路径或者摄像头索引
- if (!cap.isOpened())
- {
- std::cerr << "ERROR! Unable to open camera\n";
- return -1;
- }
- cv::Mat frame;
- std::cout << "Start detect" << std::endl << "Press any key to terminate" << std::endl;
-
- for (;;)
- {
- cap.read(frame);
- if (frame.empty())
- {
- std::cerr << "ERROR! blank frame grabbed\n";
- break;
- }
-
- auto timer = cv::getTickCount();
- std::vector<Detection> detections = detector.Inference(frame);
- double fps = cv::getTickFrequency() / ((double)cv::getTickCount() - timer);
- cv::putText(frame, "FPS: " + std::to_string(fps), cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 255, 0), 2, 8);
- cv::Mat resultImg = detector.DrawImage(frame, detections);
- cv::imshow("yolov10", resultImg);
- if (cv::waitKey(5) >= 0)
- break;
- }
-
- return 0;
- }
【视频演示】
【源码下载】