[深度学习]基于C++和onnxruntime部署yolov10的onnx模型

基于C++和ONNX Runtime部署YOLOv10的ONNX模型,可以遵循以下步骤:

  1. 准备环境:首先,确保已经下载后指定版本opencv和onnruntime的C++库。

  2. 模型转换:按照官方源码: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
  3. C++环境配置:在CMakeLists.txt项目中正确引用了opencv和ONNX Runtime的头文件,并链接到相应的库。这允许在C++代码中使用ONNX Runtime的功能。

  4. 加载模型:使用ONNX Runtime的API加载转换后的YOLOv10 ONNX模型。

  5. 执行推理:通过ONNX Runtime的推理引擎,将图像数据输入到模型中,并执行目标检测任务。

  6. 处理结果:解析模型输出的结果,这通常涉及将输出的张量数据转换为可理解的检测结果,如边界框坐标和类别标签。

通过这些步骤,可以在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;
}

【视频演示】

基于C++和onnxruntime部署yolov10的onnx模型_哔哩哔哩_bilibili测试环境:windows10 x64vs2019cmake==2.24.3onnxruntime==1.12.0opencv==4.7.0使用步骤:首先cmake生成exe文件,然后将onnxruntime.dll和onnxruntime_providers_shared.dll放到exe一起,不然会提示报错0xc000007b,这是因为系统目录也有个onnxruntime.dll引发冲突,并把c, 视频播放量 4、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 1、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:易语言部署yolox的onnx模型,yolov5最新版onnx部署Android安卓ncnn,C#使用纯opencvsharp部署yolov8-onnx图像分类模型,老师可真会玩!,使用C#部署yolov8的目标检测tensorrt模型,C# winform部署yolov10的onnx模型,YOLOv8检测界面-PyQt5实现,2024年新版【YOLOV5从入门到实战教程】B站最良心的YOLOV5全套教程(适合小白)含源码!—YOLOV5、YOLOV5实战、目标检测、计算机视觉,C#使用onnxruntime部署Detic检测2万1千种类别的物体,使用纯opencv部署yolov8目标检测模型onnxicon-default.png?t=N7T8https://www.bilibili.com/video/BV1Zw4m1v7iz/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

【源码下载】

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抱歉,作为AI语言模型,我无法为您提供完整的代码。不过,我可以为您提供基于ONNX Runtime进行YOLOv5实例分割模型的推理的步骤介绍: 1. 安装ONNX Runtime。您可以参考官方文档进行安装,也可以使用以下命令: ``` pip install onnxruntime ``` 2. 加载模型。使用ONNX Runtime的API将导出的YOLOv5实例分割模型加载到内存中。 ``` const OrtApi* g_ort = OrtGetApiBase()->GetApi(ORT_API_VERSION); OrtEnv* env; g_ort->CreateEnv(ORT_LOGGING_LEVEL_WARNING, "test", &env); OrtSession* session; OrtSessionOptions* session_options; g_ort->CreateSessionOptions(&session_options); g_ort->SetIntraOpNumThreads(session_options, 1); g_ort->SetSessionGraphOptimizationLevel(session_options, ORT_ENABLE_ALL); g_ort->CreateSession(env, "yolov5s_instance_segmentation.onnx", session_options, &session); ``` 3. 准备输入数据。读取待处理的图像数据,并将其格式换为模型可以接受的形式。 ``` std::vector<float> input_data(input_size); for (int i = 0; i < input_size; i++) { input_data[i] = image_data[i] / 255.0f; } // Create a tensor from the input data std::vector<int64_t> input_shape{1, 3, input_height, input_width}; OrtValue* input_tensor; g_ort->CreateTensorWithDataAsOrtValue(env, input_shape.data(), input_shape.size(), ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT, input_data.data(), input_size * sizeof(float), ORT_DEVICE_CPU, &input_tensor); ``` 4. 进行推理。将输入数据送入模型进行推理,并得到输出结果。 ``` OrtRunOptions* run_options; g_ort->CreateRunOptions(&run_options); const char* input_name = "input"; const char* output_name = "output"; OrtValue* output_tensor = nullptr; g_ort->Run(session, run_options, input_name, input_tensor, 1, output_name, &output_tensor); // Get the output tensor shape and data const OrtTensorTypeAndShapeInfo* output_info = g_ort->GetTensorTypeAndShape(output_tensor); std::vector<int64_t> output_shape(output_info->GetShape(), output_info->GetShape() + output_info->GetDimensionsCount()); float* output_data = nullptr; g_ort->GetTensorMutableData(output_tensor, (void**)&output_data); ``` 5. 处理输出数据。将得到的输出结果进行后处理,得到实例分割的结果。 ``` // Postprocessing code // ... // cleanup g_ort->ReleaseRunOptions(run_options); g_ort->ReleaseTensor(input_tensor); g_ort->ReleaseTensor(output_tensor); g_ort->ReleaseSession(session); g_ort->ReleaseEnv(env); ``` 需要注意的是,这只是简要的步骤介绍,并且代码中需要替换的部分(如模型路径、输入输出节点名、输入数据格式、后处理代码等)也没有提供。完整的代码需要根据具体的模型和数据进行编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值