QT+Yolov8 推理部署,ONNX模型 ,实例分割+目标检测

QT+Yolov8 实例分割、目标检测推理。QT源码。

程序准备/版本:QT creator QT6.8 编译器:MSVC2022 opencv:4.7 onnxruntime:1.16.0 cpu版本

QT+yolo推理部署

程序部分源码:

#include "aitoolinterface.h"
#include "ui_aitoolinterface.h"
#include <QDebug>
#include <QDateTime>
#include <QFileInfo>

AIToolInterface::AIToolInterface(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::AIToolInterface)
    , m_yoloModel(nullptr)
    , m_modelLoaded(false)
    , m_yoloModel2(nullptr)
    , m_modelLoaded2(false)
{
   
   
    ui->setupUi(this);

    // 初始化状态
    ui->label_status->setText("状态: 未加载模型");
    ui->label_status->setStyleSheet("color: red;");

    // 禁用测试按钮,直到模型加载
    ui->pushButton_test->setEnabled(false);
    ui->pushButton_test_2->setEnabled(false);
    logMessage("AI分割检测工具已启动");
}

AIToolInterface::~AIToolInterface()
{
   
   
    if (m_yoloModel) {
   
   
        delete m_yoloModel;
        m_yoloModel = nullptr;
    }
    if (m_yoloModel2) {
   
   
        delete m_yoloModel2;
        m_yoloModel2 = nullptr;
    }
    delete ui;
}

void AIToolInterface::on_pushButton_browseModel_clicked()
{
   
   
    QString modelPath = QFileDialog::getOpenFileName(this,
                                                     "选择ONNX模型文件",
                                                     "./Bin/x64/Models/",
                                                     "ONNX Files (*.onnx);;All Files (*)");

    if (!modelPath.isEmpty()) {
   
   
        ui->lineEdit_modelPath->setText(modelPath);
        logMessage("已选择模型文件: " + modelPath);
    }
}

void AIToolInterface::on_pushButton_loadModel_clicked()
{
   
   
    QString modelPath = ui->lineEdit_modelPath->text();
    if (modelPath.isEmpty()) {
   
   
        QMessageBox::warning(this, "警告", "请先选择模型文件路径");
        return;
    }

    // 检查文件是否存在
    QFileInfo fileInfo(modelPath);
    if (!fileInfo.exists()) {
   
   
        QMessageBox::critical(this, "错误", "模型文件不存在: " + modelPath);
        return;
    }

    try {
   
   
        // 创建YOLO模型实例
        if (m_yoloModel) {
   
   
            delete m_yoloModel;
        }

        m_yoloModel = new Yolov8SegOnnx();

        // 加载模型
        logMessage("正在加载模型...");
        bool success = m_yoloModel->ReadModel(modelPath.toStdString(), false, 0, false);

        if (success) {
   
   
            m_modelLoaded = true;
            ui->label_status->setText("状态: 模型已加载");
            ui->label_status->setStyleSheet("color: green;");
            ui->pushButton_test->setEnabled(true);
            logMessage("模型加载成功!");
        } else {
   
   
            m_modelLoaded = false;
            ui->label_status->setText("状态: 模型加载失败");
            ui->label_status->setStyleSheet("color: red;");
            ui->pushButton_test->setEnabled(false);
            logMessage("模型加载失败!");
            delete m_yoloModel;
            m_yoloModel = nullptr;
        }
    } catch (const std::exception& e) {
   
   
        m_modelLoaded = false;
        ui->label_status->setText("状态: 模型加载异常");
        ui->label_status->setStyleSheet("color: red;");
        ui->pushButton_test->setEnabled(false);
        logMessage("模型加载异常: " + QString(e.what()));
        if (m_yoloModel) {
   
   
            delete m_yoloModel;
            m_yoloModel = nullptr;
        }
    }
}

void AIToolInterface::on_pushButton_browseImage_clicked()
{
   
   
    QString imagePath = QFileDialog::getOpenFileName(this,
                                                     "选择图片文件",
                                                     "./Bin/x64/Pic/",
                                                     "Image Files (*.jpg *.jpeg *.png *.bmp);;All Files (*)");

    if (!imagePath.isEmpty()) {
   
   
        ui->lineEdit_imagePath->setText(imagePath);
        m_currentImagePath = imagePath;

        // 加载并显示图片
        m_currentImage = cv::imread(imagePath.toStdString());
        if (m_currentImage.empty()) {
   
   
            QMessageBox::warning(this, "警告", "无法
QT项目中部署ONNX格式的YOLOv8模型以实现图像分割功能,需要完成以下几个关键步骤: ### 1. 准备YOLOv8 ONNX模型文件 首先确保已经将YOLOv8模型导出为ONNX格式。YOLOv8支持直接导出为ONNX模型,可以使用官方提供的工具或脚本进行转换。例如,使用Ultralytics的`export.py`脚本将YOLOv8权重文件(如`.pt`)转换为ONNX模型[^2]。 ```bash python export.py --weights yolov8s.pt --include onnx ``` 此命令会生成一个名为`yolov8s.onnx`的文件,该文件可以直接用于推理。 --- ### 2. 在QT项目中加载ONNX模型 QT项目可以通过OpenCV的`dnn`模块来加载和运行ONNX模型。以下是一个基本的代码示例,展示如何在QT环境中加载并运行YOLOv8ONNX模型进行图像分割。 #### 2.1 引入必要的头文件 ```cpp #include <opencv2/opencv.hpp> #include <opencv2/dnn.hpp> #include <QImage> #include <QDebug> ``` #### 2.2 加载ONNX模型 ```cpp cv::dnn::Net net = cv::dnn::readNetFromONNX("path/to/yolov8s.onnx"); if (net.empty()) { qDebug() << "Failed to load ONNX model."; return; } ``` #### 2.3 图像预处理 YOLOv8通常要求输入图像为固定大小(如640x640),并且需要进行归一化处理。 ```cpp cv::Mat inputBlob = cv::dnn::blobFromImage(image, 1.0, cv::Size(640, 640), cv::Scalar(), true, false); net.setInput(inputBlob); ``` #### 2.4 推理与后处理 执行推理并解析输出结果: ```cpp cv::Mat outputs; net.forward(outputs); // 解析输出结果(具体解析方式取决于模型输出结构) // 对于YOLOv8实例分割任务,输出通常包括边界框、类别、掩码等信息 ``` #### 2.5 显示图像分割结果 将分割结果叠加到原始图像上,并通过QT界面显示: ```cpp QImage qimg(image.data, image.cols, image.rows, QImage::Format_BGR888); ui->label->setPixmap(QPixmap::fromImage(qimg).scaled(ui->label->size(), Qt::KeepAspectRatio)); ``` --- ### 3. 部署优化建议 - **性能优化**:对于实时性要求较高的场景,可以考虑使用更高效的推理框架,如TensorRT或NCNN。NCNN是腾讯开源的轻量级推理框架,特别适合移动端部署[^3]。 - **内存管理**:确保在QT项目中合理管理内存,避免因频繁创建和销毁OpenCV对象导致性能下降。 - **多线程处理**:将模型推理部分放在子线程中执行,避免阻塞UI主线程,提升用户体验。 --- ### 4. 调试与验证 在实际部署过程中,建议先使用OpenCV的`imshow`函数调试模型输出结果,确认分割效果符合预期后再集成到QT界面中。同时,可以使用`cv::imwrite`保存中间结果,便于分析和优化。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值