QtGUI+YOLOv4+VS2017 《图形界面+目标检测 cpu版本&gpu版本》

该博客详细介绍了如何在Windows 10环境下,结合VS2017、Qt 5.9.x和YOLOv4进行目标检测应用的开发。内容涵盖环境配置、Qt与VS的集成、YOLOv4的编译、动态链接库的加载以及GPU和CPU版本的实现。最后提供了项目源码和运行截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、运行环境

  • win 10
  • vs 2017(若是vs 2019,则需要安装更高版本的qt,可自行百度安装配置即可)
  • qt 5.9.x
  • opencv >= 3.0  (optional)
  • cuda >= 10.0(optional)
  • cudnn >= 7.0 for cuda 10(optional)

     黑体为必要的运行环境。

二、下载安装Qt 5.9.x

  • 下载地址:Qt 5.9.x。笔者下载的是5.9.6版本(只要是5.9系列均可),点击“...x86-5.9.6.exe”文件进行下载:

  • 下载完成后双击qt安装包,进入安装页面:
qt安装页面
step 1 点击“next”
step 2 “注册”-->“邮箱验证”-->“登陆”
step 3 “下一步”
step 4 选择“安装路径”,自定义,选择空文件夹,点击“next”
step 5

点击展开 Qt 5.9.6,勾选如下三项(vs版本不同则勾选版本对应的三项)

tools组件按默认设置,无操作

点击“下一步”

step 6 接受“协议”,点击“下一步”
step 7

点击“下一步”,完成“安装”

三、VS2017安装Qt vs tools

  • 打开VS2017,选择工具 -> 拓展和更新:

  • 选择联机->搜索qt->下载qt vs tools:
### 铁路轨道障碍物检测项目的实现 要使用 Python、YOLOv5 和 PyQt5 实现铁路轨道障碍物检测项目,可以按照以下方法设计并开发完整的解决方案。此方案涵盖了数据集准备、模型训练、推理部署以及图形界面的设计。 --- #### 1. 数据集准备 为了训练 YOLOv5 模型用于铁路轨道障碍物检测,需要准备好标注好的数据集。假设已有类似于引用中的道路坑洞和裂纹的数据集结构[^1],则需将其转换为适合 YOLO 的格式: - **数据集划分**: 将数据划分为训练集、验证集和测试集。 - **标签格式转换**: 如果原始标注文件为 VOC XML 格式,则需要将其转换为 YOLO 支持的 `.txt` 文件格式。每行表示一个目标框,格式如下: ``` <class_id> <x_center> <y_center> <width> <height> ``` 可以编写脚本完成这一过程。例如: ```python import xml.etree.ElementTree as ET from pathlib import Path def convert_voc_to_yolo(xml_file, output_dir): tree = ET.parse(xml_file) root = tree.getroot() image_width = int(root.find('size/width').text) image_height = int(root.find('size/height').text) with open(output_dir / (xml_file.stem + '.txt'), 'w') as f: for obj in root.findall('object'): class_name = obj.find('name').text bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) xmax = float(bbox.find('xmax').text) ymin = float(bbox.find('ymin').text) ymax = float(bbox.find('ymax').text) x_center = ((xmin + xmax) / 2) / image_width y_center = ((ymin + ymax) / 2) / image_height width = (xmax - xmin) / image_width height = (ymax - ymin) / image_height f.write(f"{class_dict[class_name]} {x_center} {y_center} {width} {height}\n") # 假设类别字典已定义好 class_dict = {'obstacle': 0} ``` --- #### 2. 训练 YOLOv5 模型 安装 YOLOv5 并配置环境后,可以通过命令行或自定义脚本启动训练流程。以下是基本步骤: - 下载预训练权重(如 `yolov5s.pt`),或者从头开始训练。 - 编写 YAML 文件描述数据集路径和类别信息: ```yaml train: ./data/train/images/ val: ./data/val/images/ nc: 1 # 类别数量 names: ['obstacle'] # 类别名称列表 ``` - 使用以下命令启动训练: ```bash python train.py --img 640 --batch 16 --epochs 50 --data data.yaml --weights yolov5s.pt --cache ``` 训练完成后会生成最优权重文件(`.pt`)供后续推理使用。 --- #### 3. 推理模块集成 利用训练好的模型,在 PyQt5 图形界面上实现实时推理功能。具体逻辑包括加载模型、读取摄像头帧或图片输入,并显示预测结果。 ##### 加载模型 ```python import torch from models.experimental import attempt_load def load_model(weights_path='best.pt', device='cuda' if torch.cuda.is_available() else 'cpu'): model = attempt_load(weights_path, map_location=device) model.eval() return model ``` ##### 单张图像推理 ```python from utils.general import non_max_suppression, scale_coords from PIL import ImageDraw def detect_obstacles(model, img, conf_thres=0.4, iou_thres=0.5): results = [] # 转换到 PyTorch 张量 img_tensor = preprocess_image(img).unsqueeze(0).to(device) # 进行推理 pred = model(img_tensor)[0] det = non_max_suppression(pred, conf_thres, iou_thres)[0] if det is not None and len(det): det[:, :4] = scale_coords(img_tensor.shape[2:], det[:, :4], img.size[::-1]).round() draw = ImageDraw.Draw(img) for *xyxy, conf, cls in reversed(det): label = f'{conf:.2f}' draw.rectangle(xyxy, outline=(255, 0, 0), width=2) draw.text((int(xyxy[0]), int(xyxy[1]) - 10), label, fill=(255, 0, 0)) return img ``` --- #### 4. PyQt5 GUI 设计 创建一个简单的窗口应用程序来展示实时检测效果。主要组件包括按钮触发推理操作、画布区域显示结果等。 ##### 主窗体布局 ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget from PyQt5.QtGui import QPixmap from PIL.ImageQt import ImageQt class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("Railway Obstacle Detection") layout = QVBoxLayout() self.label = QLabel(self) self.button = QPushButton("Detect", self) self.button.clicked.connect(self.on_button_click) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) layout.addWidget(self.label) layout.addWidget(self.button) def on_button_click(self): input_img = ... # 获取输入图像 result_img = detect_obstacles(model, input_img) qt_img = ImageQt(result_img.convert("RGB")) pixmap = QPixmap.fromImage(qt_img) self.label.setPixmap(pixmap.scaledToWidth(800)) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` --- #### 性能优化建议 如果希望进一步提升性能,可以选择更高效的版本YOLOv8 或者调整超参数[^3]。对于 GPU 用户而言,确保显卡驱动程序兼容 CUDA 版本能够显著加速计算效率。 --- ###
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值