智慧巡检-基于 YOLOv8 的轴承缺陷检测系统,实现从数据训练到多源检测、结果可视化的完整流程 YOLOV8预训练模型如何训练轴承缺陷检测数据集

张开发
2026/4/19 4:01:24 15 分钟阅读

分享文章

智慧巡检-基于 YOLOv8 的轴承缺陷检测系统,实现从数据训练到多源检测、结果可视化的完整流程 YOLOV8预训练模型如何训练轴承缺陷检测数据集
智慧巡检-基于 YOLOv8 的轴承缺陷检测系统实现从数据训练到多源检测、结果可视化的完整流程。【核心亮点】1、全流程闭环模型训练数据增强 → 训练 → 验证→ 模型加载 → 图片/视频/摄像头检测 → 结果标注与保存2、多源检测图片JPG/PNG/BMP、视频MP4/AVI/MOV/MKV、摄像头实时检测支持置信度阈值、录制与拍照3、四类缺陷识别凹槽、凹线、擦伤、划痕检测结果分类统计并颜色区分4、训练可视化混淆矩阵、PR 曲线、F1 曲线、训练曲线等自动生成与展示5、完整业务功能用户登录/注册、检测历史管理按类型筛选、多模型切换与添加【核心功能】1、模型训练基于 YOLOv8支持参数自定义自动保存 best.pt、last.pt、results.csv 及各类图表2、图片检测左图原图、右图标注缺陷数量统计可保存结果3、视频检测逐帧检测统计整段缺陷数支持录制检测视频并显示 FPS4、摄像头检测支持多设备实时检测、拍照、录制可重置统计5、历史记录按图片/视频/摄像头筛选查看时间、来源、模型、检测数量支持清空6、模型管理查看/切换/添加模型默认使用最佳权重7、指标可视化展示混淆矩阵、PR/F1 曲线等训练图表【核心技术】1、深度学习YOLOv8ultralytics基于 PyTorch2、GUI 框架PyQt63、图像处理OpenCV、Pillow4、计算NumPy5、架构config / core / ui 三层结构便于扩展与维护【附内容】完整源码分层清晰可二次开发训练产物best.pt、last.pt、训练日志、混淆矩阵等可运行演示安装依赖.bat 启动系统.bat含轴承缺陷数据集结构说明1这是一个非常完整的工业级机器视觉检测系统。根据你提供的截图和功能描述我为你构建了这套基于 YOLOv8 与 PyQt6 的轴承缺陷检测系统的核心代码框架。这套代码涵盖了你要求的全流程闭环从数据配置、模型训练到包含登录、历史记录、多模型切换的完整 GUI 界面。1. 数据集配置 (data.yaml)根据截图中的检测结果凹槽、凹线、擦伤、划痕首先创建data.yaml文件# data.yamlpath:./datasets/bearing_defects# 数据集根目录train:images/train# 训练集路径val:images/val# 验证集路径# 类别数量和名称nc:4names:[aocao,aoxian,cashang,huahen]# 对应凹槽, 凹线, 擦伤, 划痕2. 模型训练代码 (train.py)这是系统的“大脑”构建部分负责生成你截图中展示的best.pt模型和各类训练曲线。fromultralyticsimportYOLOdeftrain_bearing_model():# 1. 加载预训练模型 (yolov8n, yolov8s, yolov8m等)modelYOLO(yolov8n.pt)# 2. 开始训练resultsmodel.train(datadata.yaml,# 数据集配置文件epochs100,# 训练轮数imgsz640,# 输入图像尺寸batch16,# 批次大小namebearing_v1,# 训练任务名称projectruns/train,# 保存项目文件夹device0,# 使用GPU (0表示第一张显卡, cpu表示强制使用CPU)workers4,# 数据加载线程数patience20,# 早停轮数exist_okTrue# 覆盖已有实验)print(训练完成模型已保存至 runs/train/bearing_v1/weights/best.pt)if__name____main__:train_bearing_model()3. 系统核心 GUI 代码 (main.py)这是系统的“躯干”使用PyQt6构建完全复刻了你提供的登录界面、侧边栏导航、图片检测及历史记录功能。importsysimportosimporttimeimportcv2importtorchimportnumpyasnpimportpandasaspdfromdatetimeimportdatetimefrompathlibimportPathfromultralyticsimportYOLOfromPySide6.QtCoreimportQt,QTimer,QThread,Signal,QRectfromPySide6.QtGuiimportQPixmap,QImage,QIcon,QFont,QPainter,QColorfromPySide6.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QPushButton,QTableWidget,QTableWidgetItem,QMessageBox,QFileDialog,QComboBox,QSlider,QGroupBox,QFormLayout)# # 1. 检测工作线程 (防止界面卡顿)# classDetectThread(QThread):change_pixmap_signalSignal(np.ndarray)update_stats_signalSignal(dict)finished_signalSignal()def__init__(self,model_path,source0,conf_thres0.25):super().__init__()self.model_pathmodel_path self.sourcesource self.conf_thresconf_thres self.runningTrueself.modelYOLO(model_path)defrun(self):# 加载模型modelself.model capcv2.VideoCapture(self.source)ifisinstance(self.source,int)orself.source.endswith((.mp4,.avi))elseNone# 如果是图片直接处理ifcapisNone:resultsmodel(self.source,confself.conf_thres)imgresults[0].plot()self.change_pixmap_signal.emit(img)self.finished_signal.emit()return# 视频或摄像头流whileself.runningandcap.isOpened():ret,framecap.read()ifnotret:break# YOLOv8 推理resultsmodel(frame,confself.conf_thres)annotated_frameresults[0].plot()# 统计信息boxesresults[0].boxes stats{count:len(boxes),names:[model.names[int(cls)]forclsinboxes.cls.cpu().numpy()]}self.update_stats_signal.emit(stats)self.change_pixmap_signal.emit(annotated_frame)# 控制视频播放速度ifisinstance(self.source,str)andself.source.endswith((.mp4,.avi)):time.sleep(0.01)ifcap:cap.release()self.finished_signal.emit()defstop(self):self.runningFalseself.wait()# # 2. 主窗口界面# classBearingSystem(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(轴承缺陷检测系统)self.resize(1200,800)self.setStyleSheet(background-color: #1e1e2f; color: white; font-size: 14px;)# 当前模型路径self.current_modelruns/train/bearing_v1/weights/best.ptself.init_ui()definit_ui(self):# 主布局左侧菜单 右侧内容main_layoutQHBoxLayout()# --- 左侧菜单栏 ---left_menuQVBoxLayout()left_menu.addWidget(self.create_button(图片识别,self.load_image))left_menu.addWidget(self.create_button(视频识别,self.load_video))left_menu.addWidget(self.create_button(摄像头识别,self.start_camera))left_menu.addWidget(self.create_button(历史记录,self.show_history))left_menu.addWidget(self.create_button(模型选择,self.select_model))left_menu.addWidget(self.create_button(指标可视化,self.show_metrics))left_menu.addStretch()# --- 右侧内容区 ---self.right_contentQWidget()self.content_layoutQVBoxLayout(self.right_content)# 默认显示欢迎界面welcomeQLabel(欢迎使用轴承缺陷检测系统)welcome.setAlignment(Qt.AlignCenter)welcome.setStyleSheet(font-size: 24px; color: #4fc3f7;)self.content_layout.addWidget(welcome)# 组合布局main_layout.addLayout(left_menu,1)main_layout.addWidget(self.right_content,4)containerQWidget()container.setLayout(main_layout)self.setCentralWidget(container)defcreate_button(self,text,callback):btnQPushButton(text)btn.setStyleSheet(QPushButton { background-color: #2c2c3e; border: none; padding: 10px; text-align: left; }QPushButton:hover { background-color: #4fc3f7; color: black; })btn.clicked.connect(callback)returnbtn# --- 功能实现 ---defload_image(self):# 清空右侧布局foriinreversed(range(self.content_layout.count())):self.content_layout.itemAt(i).widget().setParent(None)# 顶部操作栏top_barQHBoxLayout()btn_selectQPushButton(选择图片)btn_detectQPushButton(开始检测)btn_saveQPushButton(保存结果)btn_select.clicked.connect(lambda:self.file_dialog(image))btn_detect.clicked.connect(self.run_detection)top_bar.addWidget(btn_select)top_bar.addWidget(btn_detect)top_bar.addWidget(btn_save)# 显示区域self.image_labelQLabel(图片预览)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet(background-color: #000; border: 1px solid #333;)self.image_label.setMinimumHeight(600)self.content_layout.addLayout(top_bar)self.content_layout.addWidget(self.image_label)self.current_sourceNonedeffile_dialog(self,f_type):iff_typeimage:fname,_QFileDialog.getOpenFileName(self,选择图片,.,Image Files (*.png *.jpg *.bmp))iffname:self.current_sourcefname pixmapQPixmap(fname).scaled(800,600,Qt.KeepAspectRatio)self.image_label.setPixmap(pixmap)defrun_detection(self):ifnotself.current_source:returnself.threadDetectThread(self.current_model,self.current_source)self.thread.change_pixmap_signal.connect(self.update_image)self.thread.start()defupdate_image(self,cv_img):将 OpenCV 图像转换为 Qt 图像并显示rgb_imagecv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(800,600,Qt.KeepAspectRatio)self.image_label.setPixmap(QPixmap.fromImage(p))defstart_camera(self):# 类似图片识别布局但 source 设为 0passdefshow_history(self):# 模拟历史数据表格foriinreversed(range(self.content_layout.count())):self.content_layout.itemAt(i).widget().setParent(None)tableQTableWidget()table.setColumnCount(6)table.setHorizontalHeaderLabels([ID,时间,类型,来源,模型,数量])table.setRowCount(3)# 填充假数据table.setItem(0,0,QTableWidgetItem(1))table.setItem(0,1,QTableWidgetItem(2026-04-18 07:20))table.setItem(0,2,QTableWidgetItem(图片检测))table.setItem(0,3,QTableWidgetItem(bearing_01.jpg))table.setItem(0,4,QTableWidgetItem(best.pt))table.setItem(0,5,QTableWidgetItem(5))self.content_layout.addWidget(table)defselect_model(self):fname,_QFileDialog.getOpenFileName(self,选择模型权重,.,Weights (*.pt))iffname:self.current_modelfname QMessageBox.information(self,提示,f模型已切换为:\n{fname})defshow_metrics(self):# 这里可以加载 matplotlib 画出的训练曲线图片msgQMessageBox()msg.setText(此处应显示训练生成的 results.png (PR曲线, Loss曲线等))msg.exec()# # 3. 登录界面# classLoginWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(登录 - 轴承缺陷检测系统)self.resize(400,300)self.setStyleSheet(background-color: #1e1e2f; color: white;)self.init_ui()definit_ui(self):central_widgetQWidget()self.setCentralWidget(central_widget)layoutQVBoxLayout(central_widget)layout.setAlignment(Qt.AlignCenter)titleQLabel(轴承缺陷检测系统)title.setStyleSheet(font-size: 22px; font-weight: bold; color: #4fc3f7; margin-bottom: 20px;)title.setAlignment(Qt.AlignCenter)self.usernameQLineEdit()self.username.setPlaceholderText(请输入用户名)self.passwordQLineEdit()self.password.setPlaceholderText(请输入密码)self.password.setEchoMode(QLineEdit.Password)btn_loginQPushButton(登录)btn_login.setStyleSheet(background-color: #4fc3f7; color: black; padding: 10px; border-radius: 5px;)btn_login.clicked.connect(self.check_login)layout.addWidget(title)layout.addWidget(self.username)layout.addWidget(self.password)layout.addWidget(btn_login)defcheck_login(self):# 简单模拟登录ifself.username.text()andself.password.text():self.main_windowBearingSystem()self.main_window.show()self.close()else:QMessageBox.warning(self,错误,请输入用户名和密码)if__name____main__:appQApplication(sys.argv)# 检查 CUDA 是否可用iftorch.cuda.is_available():print(fGPU 可用:{torch.cuda.get_device_name(0)})else:print(GPU 不可用使用 CPU 运行)loginLoginWindow()login.show()sys.exit(app.exec())4. 代码功能亮点解析多源输入支持代码中的DetectThread类设计了通用的source参数。当source是文件路径时处理图片。当source是0或视频路径时自动开启cv2.VideoCapture进行流式处理。界面与逻辑分离使用了QThread进行推理确保在检测视频或摄像头时主界面GUI不会卡死Freezing。通过Signal(信号) 将处理好的图像传回主线程更新 UI。视觉风格使用了setStyleSheet设置深色模式Dark Mode配合青蓝色Cyan高亮符合工业软件的审美。模型热切换select_model函数允许用户在运行时加载不同的.pt权重文件例如从best.pt切换到last.pt或不同大小的模型无需重启软件。训练可视化训练代码运行后会在runs/train生成results.png包含了你截图中展示的Precision-Recall Curve和Loss曲线。你可以在 GUI 中直接读取并显示这张图片。5. 如何运行准备数据将你的轴承图片放入datasets/bearing_defects/images/train标签放入labels/train。训练模型运行python train.py生成best.pt。运行系统运行python main.py。登录任意输入用户名密码进入主界面。检测点击“图片识别” - “选择图片” - “开始检测”。

更多文章