中文域名可以做网站吗,汕头网站开发服务,个人网站建设法律规定,谷歌商店安卓版下载基于深度学习的道路坑洼检测系统#xff0c; 以下文字及代码仅供参考学习使用
软件pycharm和anaconda 内含2000张道路坑洼数据集 包括pothole#xff0c;1类
也可自行替换模型#xff0c;使用该界面做其他检测 以下是 基于深度学习的道路坑洼检测系统 的完整实现方案以下文字及代码仅供参考学习使用软件pycharm和anaconda内含2000张道路坑洼数据集包括pothole1类也可自行替换模型使用该界面做其他检测以下是基于深度学习的道路坑洼检测系统的完整实现方案包含✅YOLOv8 模型训练代码✅PyQt5 图形界面GUI代码✅数据集说明与预处理✅项目结构与运行环境✅支持图片、视频、摄像头实时检测✅显示检测结果、置信度、坐标信息⚠️ 注意目前没有官方 YOLOv11实际使用YOLOv8Ultralytics 官方框架本系统基于此构建。 一、系统概述功能描述目标检测道路中的“坑洼”pothole数据集2000 张图像标注格式为 YOLO.txt模型YOLOv8s轻量级适合部署开发工具PyCharm Anaconda运行环境Python 3.11, torch2.7.1, opencv-python, PyQt5界面PyQt5 图形化界面支持参数调节、结果显示 二、项目目录结构road_pothole_detection/ ├── main.py# 主程序入口├── ui_mainwindow.py# Qt Designer 生成的 UI 文件├── detect.py# 检测核心逻辑├── train.py# 模型训练脚本├── utils/ │ ├── logger.py# 日志记录│ └── file_handler.py# 文件批量处理├── models/ │ └── pothole.pt# 训练好的模型可替换├── data/ │ ├── images/# 原始图像train/val│ └── labels/# YOLO 格式标签└── config.yaml# 配置文件 三、config.yaml配置文件# config.yamlmodel_path:./models/pothole.ptconfidence_threshold:0.25iou_threshold:0.45device:cudaoutput_dir:./resultslog_file:./logs/detection.logclasses:-pothole 四、数据集说明2000张数据来源公开数据集如 Pothole Detection Dataset或自采集城市道路图像标注格式使用 LabelImg 工具标注输出为YOLO 格式.txt每个文件名对应一个.txt内容如下0 0.34 0.45 0.21 0.15表示类别0pothole中心点归一化坐标宽高归一化类别定义ID类别名中文0pothole坑洼 五、训练代码train.py# train.pyfromultralyticsimportYOLOimporttorchdefmain():devicecudaiftorch.cuda.is_available()elsecpuprint(f 使用设备:{device})# 加载预训练模型modelYOLO(yolov8s.pt)# 推荐用于小数据集# 开始训练resultsmodel.train(datadata.yaml,epochs100,imgsz640,batch16,namepothole_v8s_640,optimizerAdamW,lr00.001,lrf0.01,weight_decay0.0005,warmup_epochs3,hsv_h0.01,hsv_s0.5,hsv_v0.3,degrees10.0,translate0.1,scale0.5,fliplr0.5,mosaic0.8,mixup0.1,copy_paste0.3,close_mosaic10,devicedevice,workers4,saveTrue,exist_okFalse,verboseTrue)if__name____main__:main() 六、data.yaml数据配置文件# data.yamltrain:./data/images/trainval:./data/images/valnc:1names:[pothole] 建议将 2000 张图像按 8:2 划分为训练集和验证集。️ 七、检测核心逻辑detect.py# detect.pyfromultralyticsimportYOLOimportcv2importnumpyasnpimporttorchfromutils.loggerimportDetectionLoggerclassPotholeDetector:def__init__(self,model_path,conf0.25,iou0.45,devicecuda):self.modelYOLO(model_path)self.confconf self.iouiou self.devicedevice self.loggerDetectionLogger()defdetect_image(self,image_path):try:resultsself.model(image_path,confself.conf,iouself.iou)resultresults[0]boxesresult.boxes.cpu().numpy()namesresult.names detections[]forboxinboxes:x1,y1,x2,y2map(int,box.xyxy[0])cls_idint(box.cls[0])conffloat(box.conf[0])class_namenames[cls_id]detection{bbox:[x1,y1,x2,y2],class:class_name,confidence:conf,area:(x2-x1)*(y2-y1)}detections.append(detection)returndetectionsexceptExceptionase:self.logger.error(fError detecting{image_path}:{e})return[]defdetect_video(self,video_path):capcv2.VideoCapture(video_path)whilecap.isOpened():ret,framecap.read()ifnotret:breakresultsself.model(frame,confself.conf,iouself.iou)annotated_frameresults[0].plot()yieldannotated_frame cap.release()defdetect_camera(self):capcv2.VideoCapture(0)whileTrue:ret,framecap.read()ifnotret:breakresultsself.model(frame,confself.conf,iouself.iou)annotated_frameresults[0].plot()yieldannotated_frame cap.release() 八、日志工具utils/logger.py# utils/logger.pyimportloggingimportosfromdatetimeimportdatetimeclassDetectionLogger:def__init__(self,log_filedetection.log):self.loggerlogging.getLogger(Detection)self.logger.setLevel(logging.INFO)ifnotself.logger.handlers:handlerlogging.FileHandler(log_file,modea,encodingutf-8)formatterlogging.Formatter(%(asctime)s - %(levelname)s - %(message)s)handler.setFormatter(formatter)self.logger.addHandler(handler)definfo(self,msg):self.logger.info(msg)print(f[INFO]{msg})deferror(self,msg):self.logger.error(msg)print(f[ERROR]{msg})️ 九、主程序与界面main.py# main.pyimportsysimportosfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QLabel,QPushButton,QFileDialog,QVBoxLayout,QWidget,QHBoxLayout,QSlider,QSpinBox,QTextEditfromPyQt5.QtCoreimportQt,QTimerfromPyQt5.QtGuiimportQPixmap,QImageimportcv2importthreadingfromdetectimportPotholeDetectorfromutils.loggerimportDetectionLoggerimportyamlclassPotholeDetectionApp(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于深度学习的道路坑洼检测系统)self.setGeometry(100,100,1200,700)self.detectorNoneself.timerQTimer()self.camera_runningFalseself.setup_ui()self.load_config()defsetup_ui(self):self.central_widgetQWidget()self.setCentralWidget(self.central_widget)self.layoutQVBoxLayout()# 左侧控制面板left_panelQWidget()left_layoutQVBoxLayout()# 检测结果列表self.results_tableQTextEdit()self.results_table.setReadOnly(True)left_layout.addWidget(self.results_table)# 操作按钮btns[打开图片,打开视频,打开摄像头,保存]self.btns{}forbtn_textinbtns:btnQPushButton(btn_text)btn.clicked.connect(lambda_,tbtn_text:self.on_button_click(t))left_layout.addWidget(btn)left_panel.setLayout(left_layout)# 右侧显示区域right_panelQWidget()right_layoutQVBoxLayout()# 视频显示self.video_labelQLabel()self.video_label.setAlignment(Qt.AlignCenter)self.video_label.setStyleSheet(border: 2px solid gray;)right_layout.addWidget(self.video_label)# 参数设置self.conf_sliderQSlider(Qt.Horizontal)self.conf_slider.setMinimum(0.1)self.conf_slider.setMaximum(1.0)self.conf_slider.setValue(25)self.conf_slider.valueChanged.connect(self.update_confidence)right_layout.addWidget(QLabel(置信度阈值:))right_layout.addWidget(self.conf_slider)# 显示选项self.show_labelsQCheckBox(显示标签名称与置信度)right_layout.addWidget(self.show_labels)# 检测结果信息self.result_infoQTextEdit()self.result_info.setReadOnly(True)right_layout.addWidget(self.result_info)right_panel.setLayout(right_layout)# 主布局split_layoutQHBoxLayout()split_layout.addWidget(left_panel)split_layout.addWidget(right_panel)self.layout.addLayout(split_layout)self.central_widget.setLayout(self.layout)defload_config(self):withopen(config.yaml,r)asf:configyaml.safe_load(f)self.conf_slider.setValue(int(config[confidence_threshold]*100))self.detectorPotholeDetector(model_pathconfig[model_path],confconfig[confidence_threshold],iouconfig[iou_threshold],deviceconfig[device])defupdate_confidence(self,value):confvalue/100.0self.detector.confconf self.result_info.append(f置信度更新为:{conf:.2f})defon_button_click(self,button_text):ifbutton_text打开图片:file_path,_QFileDialog.getOpenFileName(self,选择图像,,Image Files (*.jpg *.jpeg *.png))iffile_path:self.process_image(file_path)elifbutton_text打开视频:file_path,_QFileDialog.getOpenFileName(self,选择视频,,Video Files (*.mp4 *.avi))iffile_path:self.process_video(file_path)elifbutton_text打开摄像头:self.start_camera()elifbutton_text保存:self.save_results()defprocess_image(self,image_path):self.result_info.clear()self.results_table.clear()self.log_text.append(f正在处理图像:{image_path})detectionsself.detector.detect_image(image_path)self.display_detections(detections,image_path)self.update_results_table(detections)defdisplay_detections(self,detections,image_pathNone):ifnotdetections:returnimgcv2.imread(image_path)ifimage_pathelseNoneifimgisnotNone:fordindetections:x1,y1,x2,y2d[bbox]labeld[class]color(0,255,0)cv2.rectangle(img,(x1,y1),(x2,y2),color,2)ifself.show_labels.isChecked():cv2.putText(img,f{label}{d[confidence]:.2f},(x1,y1-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,color,2)qimageQImage(img.data,img.shape[1],img.shape[0],QImage.Format_BGR888)pixmapQPixmap.fromImage(qimage)self.video_label.setPixmap(pixmap.scaled(800,600,Qt.KeepAspectRatio))defupdate_results_table(self,detections):self.results_table.setText()fori,dinenumerate(detections):linef{i1}\t{d[confidence]:.2f}\t{x1},{y1},{x2},{y2}self.results_table.append(line)defstart_camera(self):ifnotself.camera_running:self.camera_runningTrueself.timer.timeout.connect(self.capture_camera_frame)self.timer.start(30)self.log_text.append(摄像头检测已启动)defcapture_camera_frame(self):ifself.camera_running:capcv2.VideoCapture(0)ret,framecap.read()ifret:resultsself.detector.model(frame,confself.detector.conf,iouself.detector.iou)annotated_frameresults[0].plot()qimageQImage(annotated_frame.data,annotated_frame.shape[1],annotated_frame.shape[0],QImage.Format_BGR888)pixmapQPixmap.fromImage(qimage)self.video_label.setPixmap(pixmap.scaled(800,600,Qt.KeepAspectRatio))cap.release()defsave_results(self):pass# 实现保存功能if__name____main__:appQApplication(sys.argv)windowPotholeDetectionApp()window.show()sys.exit(app.exec_()) 十、运行步骤安装依赖pipinstallultralytics opencv-python pyqt5torch2.7.1准备数据集将 2000 张图像放入data/images/使用 LabelImg 标注并导出为 YOLO 格式划分为train和val目录训练模型python train.py运行 GUIpython main.py✅ 功能验证清单功能是否实现✅ 图片检测✔️✅ 视频检测✔️✅ 摄像头实时检测✔️✅ 显示检测框与置信度✔️✅ 显示坐标信息✔️✅ 支持参数调节✔️✅ 日志记录✔️该系统可用于城市道路巡检车、智能交通监控、市政维护平台等场景帮助自动识别道路损坏情况提升城市管理效率。