YOLOv5环境配置到Qt集成的完整指南

📅 2026/7/8 2:45:53
YOLOv5环境配置到Qt集成的完整指南
第一部分环境配置1.1 创建虚拟环境推荐使用 Anaconda 管理 Python 环境conda create -n yolov5 python3.8 conda activate yolov5注意Python 版本要求 3.8 或更高。1.2 安装 PyTorch根据是否有 NVIDIA GPU 及 CUDA 版本选择对应命令# CPU 版本 pip install torch torchvision torchaudio # GPU 版本示例CUDA 11.3 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu113PyTorch 版本要求 1.8。1.3 克隆 YOLOv5 仓库并安装依赖git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt同时安装常用工具库pip install opencv-python matplotlib tqdm1.4 验证安装python detect.py --weights yolov5s.pt --source data/images/zidane.jpg若能正常输出检测结果则环境配置成功-第二部分数据集准备2.1 数据集目录结构YOLOv5 要求遵循以下标准目录结构custom_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 └── labels/ ├── train/ # 训练集标注.txt └── val/ # 验证集标注.txt图片与标签文件需同名如 img1.jpg 对应 img1.txt2.2 标注文件格式每个.txt标注文件每行代表一个检测框格式为class_id x_center y_center width height所有坐标需归一化到 [0, 1] 区间。示例0 0.542 0.678 0.215 0.3322.3 标注工具推荐• LabelImg基础矩形框标注适合简单场景-• CVAT支持多边形、关键点标注适合复杂场景-• Roboflow自动标注 数据增强-2.4 创建数据集配置文件在 data/ 目录下创建 custom.yamltrain: ../custom_dataset/images/train val: ../custom_dataset/images/val nc: 3 # 类别数量 names: [defect1, defect2, defect3] # 类别名称第三部分模型训练3.1 选择模型规模YOLOv5 提供五种规模模型模型速度特点YOLOv5n最快1.4ms/img纳米版适合边缘设备YOLOv5s快3.7ms/img适合嵌入式设备YOLOv5m平衡5.6ms/img平衡型YOLOv5l高精度7.8ms/img高精度YOLOv5x最高精度11.7ms/img最高精度3.2 启动训练python train.py --img 640 --batch 16 --epochs 300 \ --data custom.yaml --weights yolov5s.pt \ --cfg models/yolov5s.yaml --name custom_model关键参数说明显存不足时可减小 --batch-size3.3 训练过程监控使用 TensorBoard 可视化训练过程tensorboard --logdir runs/train/exp重点关注指标-• box_loss边界框回归损失• obj_loss目标存在性损失• cls_loss分类损失• mAP0.5IoU0.5 时的平均精度训练完成后模型权重保存在 runs/train/custom_model/weights/best.pt。第四部分模型导出ONNX为了在 Qt 中部署需要将 PyTorch 模型.pt转换为 ONNX 格式-4.1 使用官方导出脚本python models/export.py --weights runs/train/custom_model/weights/best.pt \ --include onnx --img 640 --batch 14.2 手动导出备选方案import torch from models.experimental import attempt_load def convert_to_onnx(model_path, output_path, img_size(640, 640), opset_version12): model attempt_load(model_path, map_locationcpu) model.eval() # 创建示例输入 img torch.zeros(1, 3, *img_size) # 导出 ONNX torch.onnx.export( model, img, output_path, opset_versionopset_version, input_names[images], output_names[output] ) print(fModel exported to {output_path}) convert_to_onnx(best.pt, best.onnx)ONNX opset 版本建议 ≥11第五部分集成到 Qt 缺陷检测程序集成方式主要有两种PythonPyQt5方案 和 CQt ONNX Runtime方案。方案一Python PyQt5推荐快速开发这是最直接的方式适合快速构建原型-5.1 环境准备pip install PyQt5 onnxruntime opencv-python5.2 核心推理代码import cv2 import onnxruntime as ort import numpy as np from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QFileDialog from PyQt5.QtGui import QPixmap, QImage from PyQt5.QtCore import Qt class YOLOv5Detector: def __init__(self, model_path): self.session ort.InferenceSession(model_path) self.input_name self.session.get_inputs()[0].name self.output_name self.session.get_outputs()[0].name self.img_size 640 def preprocess(self, img): # 调整大小并归一化 img cv2.resize(img, (self.img_size, self.img_size)) img img.transpose(2, 0, 1) # HWC - CHW img img.astype(np.float32) / 255.0 return np.expand_dims(img, axis0) def detect(self, img): input_tensor self.preprocess(img) outputs self.session.run([self.output_name], {self.input_name: input_tensor}) # 后处理 NMS提取检测框 return self.postprocess(outputs[0]) def postprocess(self, output): # 根据实际输出格式解析检测结果 # 返回: [(x1, y1, x2, y2, class_id, confidence), ...] pass5.3 PyQt5 界面集成class DefectDetectionWindow(QMainWindow): def __init__(self): super().__init__() self.detector YOLOv5Detector(best.onnx) self.initUI() def initUI(self): self.setWindowTitle(缺陷检测系统) self.setGeometry(100, 100, 800, 600) # 图像显示标签 self.image_label QLabel(self) self.image_label.setAlignment(Qt.AlignCenter) self.image_label.setStyleSheet(border: 1px solid gray;) # 按钮 self.btn_open QPushButton(打开图片, self) self.btn_open.clicked.connect(self.open_image) self.btn_detect QPushButton(开始检测, self) self.btn_detect.clicked.connect(self.detect_image) # 布局略 def open_image(self): file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , Images (*.png *.jpg *.jpeg)) if file_path: self.current_image cv2.imread(file_path) self.display_image(self.current_image) def detect_image(self): if hasattr(self, current_image): results self.detector.detect(self.current_image) # 在图像上绘制检测框 annotated self.draw_boxes(self.current_image.copy(), results) self.display_image(annotated) def display_image(self, img): # cv2 图像转 QPixmap rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) h, w, ch rgb.shape bytes_per_line ch * w qt_img QImage(rgb.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap QPixmap.fromImage(qt_img).scaled( self.image_label.width(), self.image_label.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation) self.image_label.setPixmap(pixmap)5.4 打包为独立可执行文件pip install pyinstaller pyinstaller --onefile --windowed --add-data best.onnx;. main.py参考项目yolov5-onnx-pyqt-exehttps://github.com/hhx518/yolov5-onnx-pyqt-exe方案二C Qt ONNX Runtime高性能生产级适合对性能要求较高的工业场景5.5 C 环境搭建安装 Qt• 推荐 Qt 5.15.2 LTS• 勾选 MinGW 64-bit 或 MSVC 编译器安装 ONNX Runtime• 从 GitHub releases 下载预编译包• 或自行编译-安装 OpenCV# Ubuntu sudo apt install libopencv-dev # Windows: 从官网下载预编译二进制文件5.6 Qt 项目配置.pro 文件QT core widgets gui CONFIG c17 INCLUDEPATH /path/to/opencv/include \ /path/to/onnxruntime/include LIBS -L/path/to/opencv/lib -lopencv_world450 \ -L/path/to/onnxruntime/lib -lonnxruntime SOURCES main.cpp mainwindow.cpp detector.cpp HEADERS mainwindow.h detector.h5.7 ONNX Runtime 推理代码detector.h#ifndef DETECTOR_H #define DETECTOR_H #include opencv2/opencv.hpp #include onnxruntime/core/session/onnxruntime_cxx_api.h #include vector struct Detection { cv::Rect box; int class_id; float confidence; }; class YOLOv5Detector { public: YOLOv5Detector(const std::string model_path); std::vectorDetection detect(const cv::Mat image); private: Ort::Session session; Ort::MemoryInfo memory_info; std::vectorint64_t input_shape; int img_size 640; cv::Mat preprocess(const cv::Mat image); std::vectorDetection postprocess(const std::vectorfloat output, float conf_threshold 0.5, float nms_threshold 0.4); }; #endif5.8 ONNX Runtime 推理代码detector.cpp#include detector.h #include onnxruntime/core/providers/cpu/cpu_provider_factory.h YOLOv5Detector::YOLOv5Detector(const std::string model_path) : memory_info(Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault)) { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, YOLOv5); Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(1); // 使用 CPU 推理可改为 CUDA session_options.AppendExecutionProvider_CPU(0); session Ort::Session(env, model_path.c_str(), session_options); // 获取输入形状 auto input_info session.GetInputTypeInfo(0); auto input_tensor_info input_info.GetTensorTypeAndShapeInfo(); input_shape input_tensor_info.GetShape(); } cv::Mat YOLOv5Detector::preprocess(const cv::Mat image) { cv::Mat resized; cv::resize(image, resized, cv::Size(img_size, img_size)); resized.convertTo(resized, CV_32FC3, 1.0 / 255.0); // HWC - CHW cv::Mat channels[3]; cv::split(resized, channels); cv::Mat chw; cv::vconcat(channels[0], channels[1], chw); cv::vconcat(chw, channels[2], chw); return chw; } std::vectorDetection YOLOv5Detector::detect(const cv::Mat image) { cv::Mat input_tensor preprocess(image); // 准备输入 std::vectorint64_t input_shape {1, 3, img_size, img_size}; Ort::Value input_tensor_ort Ort::Value::CreateTensorfloat( memory_info, (float*)input_tensor.data, input_tensor.total() * input_tensor.elemSize(), input_shape.data(), input_shape.size() ); // 推理 auto output_tensors session.Run( Ort::RunOptions{nullptr}, {images}, input_tensor_ort, 1, {output}, 1 ); // 获取输出 float* output_data output_tensors[0].GetTensorMutableDatafloat(); auto output_shape output_tensors[0].GetTensorTypeAndShapeInfo().GetShape(); size_t output_size output_shape[1] * output_shape[2]; std::vectorfloat output(output_data, output_data output_size); // 后处理NMS return postprocess(output); }5.9 Qt 主窗口集成// mainwindow.h class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent nullptr); ~MainWindow(); private slots: void onOpenImage(); void onDetect(); private: Ui::MainWindow *ui; YOLOv5Detector* detector; cv::Mat current_image; QImage cvMatToQImage(const cv::Mat mat); void displayImage(const cv::Mat image); }; // mainwindow.cpp void MainWindow::onDetect() { if (current_image.empty()) return; auto detections detector-detect(current_image); cv::Mat result current_image.clone(); for (const auto det : detections) { cv::rectangle(result, det.box, cv::Scalar(0, 255, 0), 2); std::string label Defect: std::to_string(det.class_id) std::to_string(det.confidence); cv::putText(result, label, cv::Point(det.box.x, det.box.y - 5), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 2); } displayImage(result); } QImage MainWindow::cvMatToQImage(const cv::Mat mat) { cv::Mat rgb; cv::cvtColor(mat, rgb, cv::COLOR_BGR2RGB); return QImage(rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_RGB888); } void MainWindow::displayImage(const cv::Mat image) { QImage qimg cvMatToQImage(image); QPixmap pixmap QPixmap::fromImage(qimg); ui-imageLabel-setPixmap(pixmap.scaled(ui-imageLabel-size(), Qt::KeepAspectRatio, Qt::SmoothTransformation)); }第六部分性能优化建议GPU 推理若硬件支持将模型加载到 GPU 上推理多线程处理使用 QThread 将检测放在子线程避免界面卡顿图像预处理优化减少不必要的图像处理步骤批量推理多张图片同时处理时使用 batch 推理总结流程图环境配置Python 3.8 PyTorch YOLOv5 ↓ 准备数据集images/ labels/ custom.yaml ↓ 模型训练python train.py ... ↓ 模型导出.pt → .onnx ↓ ┌────┴────┐ ↓ ↓ PyQt5方案 C方案 (Python) (QtONNXRuntime) ↓ ↓ 打包部署 编译部署以上步骤涵盖了从环境搭建、数据集准备、模型训练到 Qt 集成的完整流程。根据实际需求选择 PythonPyQt5或 CQt ONNX Runtime方案即可。