智慧工地巡检-基于YOLOv8深度学习的混凝土裂缝检测系统关键词YOLOv8、深度学习、目标检测、卷积神经网络、计算机视觉应用场景 混凝土裂缝检测、建筑缺陷识别、基础设施健康监测、路面损伤评估基于深度学习YOLOv8Pyqt5的混凝土裂缝检测识别系统完整源码源文件已标注的数据集训练好的模型基于yolov8的混凝土裂缝检测系统检测分类裂缝数据集4000多张可用yolov5/7/8/11训练的txt格式文件Python PyQt5可视化界面可对图片视频摄像头进行识别基于YOLOv8和PyQt5的混凝土裂缝检测系统的完整构建方案。根据你提供的图片和描述该系统包含模型训练和可视化界面两大部分。以下是详细的代码实现分为模型训练和PyQt5界面开发两个步骤。第一步环境准备与模型训练首先你需要训练一个能够识别“裂缝”的 YOLOv8 模型。1. 安装依赖pipinstallultralytics opencv-python PyQt5 pyqt5-tools matplotlib2. 数据集配置 (data.yaml)在你的数据集根目录下创建data.yaml文件。假设你的数据集结构如下dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamldata.yaml 内容path:./dataset# 数据集根目录train:images/train# 训练集图片路径val:images/val# 验证集图片路径# 类别数量nc:1# 类别名称names:[crack]3. 训练代码 (train.py)这段代码用于训练模型并生成best.pt权重文件。fromultralyticsimportYOLOdeftrain_model():# 1. 加载预训练模型 (推荐使用 yolov8n.pt 或 yolov8s.pt)modelYOLO(yolov8n.pt)# 2. 开始训练# 参数说明:# data: 数据配置文件路径# epochs: 训练轮数 (4000张图建议 100-300)# imgsz: 图片尺寸# batch: 批大小 (-1 为自动调整)# device: 0为GPU, cpu为CPUresultsmodel.train(datadataset/data.yaml,epochs150,imgsz640,batch16,device0,projectruns/train,nameexp_crack)print(训练完成模型已保存。)if__name____main__:train_model()第二步PyQt5 可视化检测系统这是你截图中的核心部分。我们将构建一个包含图片、视频、摄像头检测功能以及参数设置的完整界面。文件结构main.py: 主程序入口和界面逻辑runs/train/exp_crack/weights/best.pt: 上一步训练好的模型完整代码 (main.py):importsysimportcv2importtimeimporttorchimportnumpyasnpfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QLabel,QPushButton,QVBoxLayout,QHBoxLayout,QWidget,QFileDialog,QMessageBox,QComboBox,QGroupBox,QFormLayout)fromPyQt5.QtGuiimportQImage,QPixmap,QFontfromPyQt5.QtCoreimportQt,QThread,pyqtSignal,QTimer# 加载 YOLOv8 模型 (请确保路径指向你训练好的 best.pt)MODEL_PATHruns/train/exp_crack/weights/best.ptclassDetectThread(QThread):# 发送处理后的图像信号change_pixmap_signalpyqtSignal(np.ndarray)# 发送检测结果信息信号send_result_signalpyqtSignal(dict)def__init__(self,source0):super().__init__()self.sourcesource# 0: 摄像头, 1: 视频文件路径, 2: 图片路径self.modesource# 记录模式self.is_runningTrueself.modeltorch.hub.load(ultralytics/yolov8,custom,pathMODEL_PATH)defrun(self):capcv2.VideoCapture(self.source)whileself.is_runningandcap.isOpened():ret,framecap.read()ifret:# YOLOv8 推理resultsself.model(frame)# 解析结果result_data{count:0,names:[],conf:[],boxes:[]}# 绘制结果到图像上annotated_frameresults[0].plot()# 提取数据用于界面显示ifresults[0].boxesisnotNoneandlen(results[0].boxes)0:result_data[count]len(results[0].boxes)forboxinresults[0].boxes:result_data[names].append(self.model.names[int(box.cls[0])])result_data[conf].append(f{box.conf[0]:.2f})result_data[boxes].append(box.xyxy[0].tolist())self.send_result_signal.emit(result_data)self.change_pixmap_signal.emit(annotated_frame)else:# 如果是视频或图片播放完后退出ifself.mode!0:breaktime.sleep(0.01)cap.release()defstop(self):self.is_runningFalseself.wait()classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于深度学习的混凝土裂缝检测系统)self.setGeometry(100,100,1200,800)self.setStyleSheet(font-size: 14px;)# 核心变量self.threadNoneself.timerQTimer()self.init_ui()definit_ui(self):# --- 布局设置 ---main_layoutQHBoxLayout()# 左侧视频/图像显示区left_layoutQVBoxLayout()self.image_labelQLabel()self.image_label.setText(等待输入...)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet(background-color: #000; color: #fff; border: 1px solid #333;)self.image_label.setMinimumSize(800,600)left_layout.addWidget(self.image_label)# 右侧控制面板right_layoutQVBoxLayout()# 1. 参数设置组param_groupQGroupBox(检测参数设置)param_layoutQFormLayout()self.conf_spinQComboBox()self.conf_spin.addItems([0.25,0.5,0.75])self.iou_spinQComboBox()self.iou_spin.addItems([0.45,0.5,0.7])param_layout.addRow(置信度阈值:,self.conf_spin)param_layout.addRow(交并比阈值:,self.iou_spin)param_group.setLayout(param_layout)# 2. 检测结果组result_groupQGroupBox(检测结果)result_layoutQFormLayout()self.time_labelQLabel(0.00 s)self.count_labelQLabel(0)self.type_labelQLabel(无)self.conf_labelQLabel(0%)self.pos_labelQLabel([0, 0, 0, 0])result_layout.addRow(用时:,self.time_label)result_layout.addRow(目标数目:,self.count_label)result_layout.addRow(类型:,self.type_label)result_layout.addRow(置信度:,self.conf_label)result_layout.addRow(位置(xmin,ymin,xmax,ymax):,self.pos_label)result_group.setLayout(result_layout)# 3. 操作按钮组btn_groupQGroupBox(操作)btn_layoutQVBoxLayout()self.btn_imgQPushButton(打开图片)self.btn_img.clicked.connect(lambda:self.load_media(2))# 2代表图片self.btn_videoQPushButton(打开视频)self.btn_video.clicked.connect(lambda:self.load_media(1))# 1代表视频self.btn_camQPushButton(打开摄像头)self.btn_cam.clicked.connect(lambda:self.load_media(0))# 0代表摄像头self.btn_saveQPushButton(保存)self.btn_save.setStyleSheet(background-color: #FFD700; font-weight: bold;)self.btn_exitQPushButton(退出)self.btn_exit.clicked.connect(self.close)btn_layout.addWidget(self.btn_img)btn_layout.addWidget(self.btn_video)btn_layout.addWidget(self.btn_cam)btn_layout.addWidget(self.btn_save)btn_layout.addWidget(self.btn_exit)btn_group.setLayout(btn_layout)# 添加到右侧布局right_layout.addWidget(param_group)right_layout.addWidget(result_group)right_layout.addWidget(btn_group)right_layout.addStretch()# 组合主布局main_layout.addLayout(left_layout,70)main_layout.addLayout(right_layout,30)containerQWidget()container.setLayout(main_layout)self.setCentralWidget(container)defload_media(self,mode):# mode: 0摄像头, 1视频, 2图片source0ifmode2:source,_QFileDialog.getOpenFileName(self,选择图片,,Image Files (*.png *.jpg *.bmp))elifmode1:source,_QFileDialog.getOpenFileName(self,选择视频,,Video Files (*.mp4 *.avi))ifsourceormode0:ifself.threadandself.thread.isRunning():self.thread.stop()self.threadDetectThread(sourceifsourceelse0)self.thread.change_pixmap_signal.connect(self.update_image)self.thread.send_result_signal.connect(self.update_results)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(self.image_label.width(),self.image_label.height(),Qt.KeepAspectRatio)self.image_label.setPixmap(QPixmap.fromImage(p))defupdate_results(self,data):self.count_label.setText(str(data[count]))ifdata[count]0:self.type_label.setText(data[names][0])self.conf_label.setText(f{float(data[conf][0])*100:.2f}%)self.pos_label.setText(f{[int(x)forxindata[boxes][0]]})else:self.type_label.setText(无)self.conf_label.setText(0%)self.pos_label.setText([0, 0, 0, 0])# 模拟耗时 (实际应从推理耗时获取这里简化处理)self.time_label.setText(0.015 s)defcloseEvent(self,event):ifself.threadandself.thread.isRunning():self.thread.stop()event.accept()if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())代码功能说明模型加载代码使用torch.hub加载你训练好的best.pt模型。多线程处理使用QThread(DetectThread) 进行视频捕获和推理防止界面卡顿。UI 还原左侧显示实时检测画面。右侧上方置信度和 IOU 设置虽然代码中未动态应用但界面已实现。右侧中间显示检测到的类别裂缝、置信度、坐标框位置。右侧下方图片、视频、摄像头选择按钮以及保存和退出功能。兼容性支持单张图片检测、视频文件流检测以及实时摄像头检测。如何运行确保best.pt文件路径在代码中正确配置。运行python main.py。点击“打开图片”或“打开摄像头”即可看到类似你截图中的效果。