news 2026/5/12 6:01:43

深度学习框架基于YOLOv8➕pyqt5工程机械检测系统,YOLOV8模型如何训练工程机械检测数据集识别检测挖掘机‘, ‘自卸卡车‘, ‘轮式装载机

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习框架基于YOLOv8➕pyqt5工程机械检测系统,YOLOV8模型如何训练工程机械检测数据集识别检测挖掘机‘, ‘自卸卡车‘, ‘轮式装载机

深度学习框架基于YOLOv8➕pyqt5工程机械检测系统,

2655张工程机械数据集
包括[‘挖掘机’, ‘自卸卡车’, ‘轮式装载机’],3类

也可自行替换模型,使用该界面做其他检测

以下是完整的基于 YOLOv8 + PyQt5 的工程机械检测系统,支持:

  • 3 类目标检测:挖掘机自卸卡车轮式装载机
  • 图像 / 视频 / 摄像头实时检测
  • 可视化检测框、类别(中文)、置信度、坐标
  • 支持替换任意 YOLOv8 模型(如best.pt
  • 保存检测结果为文本报告
  • 界面简洁、功能完整、代码可直接运行

✅ 一、环境依赖

pipinstallultralytics pyqt5 opencv-python numpy
  • ultralytics:官方 YOLOv8 库
  • PyQt5:图形界面
  • OpenCV:图像/视频处理

✅ 二、数据集说明(供训练参考)

属性内容
数据集名称Construction Machinery Detection Dataset
图像总数2655 张
类别数量3 类
类别名称挖掘机自卸卡车轮式装载机
标注格式YOLO(.txt
推荐划分train: ~2100, val: ~400, test: ~155

📂 示例结构:

construction_dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/

✅ 三、完整系统代码:construction_detection.py

# construction_detection.pyimportsysimportosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QHBoxLayout,QWidget,QFileDialog,QTextEdit,QSpinBox)fromPyQt5.QtCoreimportQt,QTimerfromPyQt5.QtGuiimportQPixmap,QImageimportcv2importnumpyasnpfromultralyticsimportYOLOclassConstructionMachineryDetectionApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于YOLOv8的工程机械检测系统")self.setGeometry(100,100,1200,700)# 加载模型(可替换为你的 best.pt)self.model=Noneself.load_model()# 初始化 UIself.init_ui()# 摄像头/视频控制self.cap=Noneself.timer=QTimer()self.timer.timeout.connect(self.update_frame)defload_model(self):"""加载 YOLOv8 模型"""try:# 替换为你训练好的模型路径,例如 'runs/detect/train/weights/best.pt'self.model=YOLO('yolov8n.pt')# 默认使用 yolov8n,可改为 best.ptprint("✅ 模型加载成功!")exceptExceptionase:print(f"❌ 模型加载失败:{e}")definit_ui(self):central_widget=QWidget()self.setCentralWidget(central_widget)layout=QVBoxLayout()# 标题title=QLabel("<h2>工程机械智能检测系统</h2>")title.setAlignment(Qt.AlignCenter)layout.addWidget(title)# 主体区域main_layout=QHBoxLayout()# 左侧:图像显示区self.image_label=QLabel("点击“打开图片”上传图像")self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet("border: 2px solid #ccc; background-color: #f9f9f9;")self.image_label.setMinimumSize(600,400)main_layout.addWidget(self.image_label)# 右侧:控制面板right_panel=QVBoxLayout()# 参数设置right_panel.addWidget(QLabel("检测参数"))self.conf_spin=QSpinBox()self.conf_spin.setValue(25)self.conf_spin.setSuffix("%")self.conf_spin.setMaximum(100)right_panel.addWidget(QLabel("置信度阈值"))right_panel.addWidget(self.conf_spin)self.iou_spin=QSpinBox()self.iou_spin.setValue(45)self.iou_spin.setSuffix("%")self.iou_spin.setMaximum(100)right_panel.addWidget(QLabel("IoU 阈值"))right_panel.addWidget(self.iou_spin)# 操作按钮btn_layout=QHBoxLayout()self.btn_image=QPushButton("打开图片")self.btn_video=QPushButton("打开视频")self.btn_camera=QPushButton("打开摄像头")self.btn_save=QPushButton("保存结果")self.btn_exit=QPushButton("退出")self.btn_image.clicked.connect(self.open_image)self.btn_video.clicked.connect(self.open_video)self.btn_camera.clicked.connect(self.open_camera)self.btn_save.clicked.connect(self.save_results)self.btn_exit.clicked.connect(self.close)btn_layout.addWidget(self.btn_image)btn_layout.addWidget(self.btn_video)btn_layout.addWidget(self.btn_camera)btn_layout.addWidget(self.btn_save)btn_layout.addWidget(self.btn_exit)right_panel.addLayout(btn_layout)# 检测结果显示right_panel.addWidget(QLabel("检测信息"))self.result_text=QTextEdit()self.result_text.setReadOnly(True)self.result_text.setMaximumHeight(150)right_panel.addWidget(self.result_text)main_layout.addLayout(right_panel)layout.addLayout(main_layout)# 结果表格(下方)layout.addWidget(QLabel("检测结果明细"))self.table_text=QTextEdit()self.table_text.setReadOnly(True)layout.addWidget(self.table_text)central_widget.setLayout(layout)defopen_image(self):file_name,_=QFileDialog.getOpenFileName(self,"选择图像","","Image Files (*.jpg *.png *.jpeg)")iffile_name:self.detect_and_show(file_name,is_video=False)defopen_video(self):file_name,_=QFileDialog.getOpenFileName(self,"选择视频","","Video Files (*.mp4 *.avi)")iffile_name:self.cap=cv2.VideoCapture(file_name)self.timer.start(30)self.result_text.setText("正在播放视频...")defopen_camera(self):ifself.cap:self.cap.release()self.cap=cv2.VideoCapture(0)self.timer.start(30)self.result_text.setText("正在使用摄像头...")defdetect_and_show(self,source,is_video=False):ifself.modelisNone:self.result_text.setText("❌ 模型未加载!")returnimg=cv2.imread(source)ifnotis_videoelsesourceifimgisNone:self.result_text.setText("❌ 图像读取失败!")returnconf=self.conf_spin.value()/100.0iou=self.iou_spin.value()/100.0results=self.model(img,conf=conf,iou=iou)annotated_img=results[0].plot()# 显示图像self.display_image(annotated_img)# 显示结果self.show_results(results[0],source)defupdate_frame(self):ifself.capisNone:returnret,frame=self.cap.read()ifnotret:self.timer.stop()self.result_text.setText("❌ 视频/摄像头结束!")returnself.detect_and_show(frame,is_video=True)defdisplay_image(self,img):h,w,ch=img.shape bytes_per_line=ch*w q_img=QImage(img.data,w,h,bytes_per_line,QImage.Format_BGR888)pixmap=QPixmap.fromImage(q_img)self.image_label.setPixmap(pixmap.scaled(600,400,Qt.KeepAspectRatio))defshow_results(self,result,source_path):boxes=result.boxes.cpu().numpy()class_names=['挖掘机','自卸卡车','轮式装载机']# 中文映射(按训练时类别顺序)iflen(boxes)==0:self.result_text.setText("🔍 未检测到工程机械。")self.table_text.setText("")return# 构建文本text=f"🎯 检测完成!共{len(boxes)}个目标\n"table_lines=["序号\t类别\t置信度\t坐标 [x1,y1,x2,y2]"]fori,boxinenumerate(boxes):cls_id=int(box.cls[0])conf=float(box.conf[0])xyxy=box.xyxy[0].astype(int)label=class_names[cls_id]ifcls_id<len(class_names)elsef"未知类({cls_id})"conf_str=f"{conf*100:.2f}%"coord_str=f"[{xyxy[0]},{xyxy[1]},{xyxy[2]},{xyxy[3]}]"text+=f"•{label}({conf_str})\n"table_lines.append(f"{i+1}\t{label}\t{conf_str}\t{coord_str}")self.result_text.setText(text)self.table_text.setText("\n".join(table_lines))defsave_results(self):content=self.result_text.toPlainText()+"\n\n"+self.table_text.toPlainText()ifnotcontent.strip():self.result_text.setText("❌ 无结果可保存!")returnfile_path,_=QFileDialog.getSaveFileName(self,"保存检测结果","","Text Files (*.txt)")iffile_path:withopen(file_path,'w',encoding='utf-8')asf:f.write(content)self.result_text.setText("✅ 结果已保存!")defcloseEvent(self,event):ifself.cap:self.cap.release()self.timer.stop()event.accept()defmain():app=QApplication(sys.argv)window=ConstructionMachineryDetectionApp()window.show()sys.exit(app.exec_())if__name__=="__main__":main()

✅ 四、如何使用?

1. 替换为你自己的模型

将以下行:

self.model=YOLO('yolov8n.pt')

改为:

self.model=YOLO('path/to/your/best.pt')

⚠️ 注意:best.pt必须是在相同类别顺序下训练的(即:0=挖掘机, 1=自卸卡车, 2=轮式装载机)

2. 运行程序

python construction_detection.py

✅ 五、训练建议(如需训练)

data.yaml配置文件:

train:./dataset/images/trainval:./dataset/images/valnc:3names:['excavator','dump_truck','wheel_loader']

训练时使用英文名,推理时在 GUI 中映射为中文。

训练命令:

yolo detect traindata=data.yamlmodel=yolov8s.ptepochs=100imgsz=640batch=16

✅ 六、扩展能力

  • 通用性:只需修改class_names和模型路径,即可用于其他检测任务(如车辆、动物、缺陷等)
  • 部署友好:可打包为.exe(使用 PyInstaller)
  • 多语言支持:轻松添加英文/其他语言标签

💡提示:若你的模型输出是英文类别(如'excavator'),可在show_results()中加入映射字典:

en_to_cn={'excavator':'挖掘机','dump_truck':'自卸卡车','wheel_loader':'轮式装载机'}label=en_to_cn.get(predicted_name,predicted_name)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/12 6:00:55

基于Packet Tracer的网络协议教学:图解说明常见通信过程

用Packet Tracer讲透网络协议&#xff1a;从ARP到TCP的可视化教学实战你有没有试过在课堂上讲完“三次握手”&#xff0c;学生还一脸茫然地问&#xff1a;“那为什么不能两次&#xff1f;”或者刚解释完DNS的作用&#xff0c;转头就有学生困惑&#xff1a;“既然IP能访问&#…

作者头像 李华
网站建设 2026/5/11 17:15:54

Arduino ESP32下载失败终极解决方案:完整修复指南

Arduino ESP32下载失败终极解决方案&#xff1a;完整修复指南 【免费下载链接】arduino-esp32 Arduino core for the ESP32 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 当您满怀期待地在Arduino IDE中尝试安装ESP32开发板时&#xff0c;却遭遇了令…

作者头像 李华
网站建设 2026/5/10 20:27:39

【开题答辩全过程】以 高校人才培养方案管理系统的设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/5/11 1:23:48

腾讯云COS对接IndexTTS 2.0实现高可用备份

腾讯云COS对接IndexTTS 2.0实现高可用备份 在AIGC浪潮席卷内容创作领域的今天&#xff0c;语音合成已不再是简单的“文字转声音”工具&#xff0c;而是演变为一种具备高度个性化、情感表达与精准控制能力的创作媒介。B站开源的 IndexTTS 2.0 正是这一趋势下的代表性成果——仅凭…

作者头像 李华
网站建设 2026/5/7 14:37:06

打造个性化知识管理神器:Trilium Notes插件全攻略

打造个性化知识管理神器&#xff1a;Trilium Notes插件全攻略 【免费下载链接】awesome-trilium A collection of interesting Trilium Notes extensions. Including themes, widgets, scripts, API extensions, etc. 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-t…

作者头像 李华
网站建设 2026/5/11 23:46:09

使用 `clamp()` 实现流畅的响应式字体缩放

使用 clamp() 实现流畅的响应式字体缩放 在响应式网页设计中&#xff0c;字体大小的动态适配是提升用户体验的关键要素。传统方法如媒体查询&#xff08;Media Queries&#xff09;或视口单位&#xff08;如 vw&#xff09;虽能实现响应式效果&#xff0c;但存在断点跳跃、维护…

作者头像 李华