
智慧巡检-基于YOLOv8的光伏电池板异物检测系统包括全部源码完整标注的数据集训练好的模型及训练结果项目运行教程内含 12000 张数据集包括 [‘bird-drop’, ‘clean’, ‘dusty’, ‘electrical-damage’, ‘physical-damage’, ‘snow-covered’]6 类本项目已经训练好模型配置成功环境可直接使用运行效果见介绍图项目介绍软件PycharmAnaconda或者VSCodeAnaconda环境python3.9 opencv-python PyQt5 ultralytics torch1.9等文件①完整程序文件.py等②UI界面源文件、图标.ui、.qrc、.py等③数据集图片项目运行教程.jpg、.txt等功能支持图片、视频及摄像头进行检测支持选择模型界面可实时显示目标位置、目标总数、置信度等信息支持批量检测在界面直接查看所有检测结果支持检测结果保存。①选择单张图片或者图片文件夹进行识别②选择视频文件进行识别③调用本地摄像头进行识别④自定义置信度IOU阈值⑤选择显示标签和原图⑥选择检测模型⑦查看批量检测每一张检测结果基于YOLOv8光伏电池板缺陷/异物检测系统完整项目文档全套源码一、项目信息汇总表项目参数详情说明项目名称基于深度学习YOLOv8光伏电池板异物缺陷检测系统数据集总量12000张光伏组件实拍图像航拍近距离实拍分类总数6大类缺陷/工况6类标签0:bird-drop(鸟粪污染)、1:clean(完好干净)、2:dusty(积尘污渍)、3:electrical-damage(电路损伤)、4:physical-damage(物理破损)、5:snow-covered(积雪覆盖)标注格式YOLO标准txt归一化标注开发环境Python3.9 Torch1.9 Ultralytics YOLOv8 PyQt5 OpenCV界面框架PyQt5桌面可视化系统配套资源全量源码标注数据集训练完毕best.pt权重部署说明文档应用场景光伏电站巡检、无人机航拍缺陷筛查、厂区光伏运维、本科毕设课题二、项目整体目录和截图目录一一对应pv_defect_detect/ ├── datasets/ # 12000张YOLO格式数据集 │ ├── images/train、val、test │ ├── labels/train、val、test │ └── pv.yaml # 数据集配置yaml ├── Font/ # UI界面字体资源 ├── models/ # 训练最优模型best.pt存放目录 ├── runs/ # 训练日志、损失曲线、精度指标 ├── save_data/ # 检测完成图片/视频保存路径 ├── TestFiles/ # 测试素材图片视频 ├── UIProgram/ # Qt界面资源ui、图标、qrc资源文件 ├── app_settings.json # 界面参数配置缓存文件 ├── Config.py # 类别中英文映射配置 ├── detect_tools.py # YOLO推理封装核心类 ├── train.py # 模型训练主脚本 ├── MainProgram.py # PyQt系统程序入口 ├── imgTest.py # 单图调试脚本 ├── VideoTest.py # 视频推理调试脚本 ├── CameraTest.py # 摄像头单独调试脚本 ├── installPackages.py # 一键环境安装脚本 └── requirements.txt # 依赖清单三、数据集配置 pv.yamltrain:./datasets/images/trainval:./datasets/images/valtest:./datasets/images/testnc:6names:0:bird-drop1:clean2:dusty3:electrical-damage4:physical-damage5:snow-covered四、YOLOv8模型训练代码 train.pyfromultralyticsimportYOLOdeftrain_pv_defect():# 可选 yolov8n/yolov8s/yolov8mmodelYOLO(yolov8s.pt)model.train(data./datasets/pv.yaml,epochs120,imgsz640,batch16,device0,# CPU运行改为devicecpupatience18,projectpv_train_result,nameyolov8_pv_defect,saveTrue,save_period10,pretrainedTrue,hsv_h0.01,hsv_s0.5,hsv_v0.3,fliplr0.5,mosaic0.6)# 验证模型精度resultmodel.val()print(f整体mAP0.5:{result.box.map50:.3f})if__name____main__:train_pv_defect()五、推理工具封装 detect_tools.pyfromultralyticsimportYOLOimportcv2importnumpyasnpimportosclassPvDefectDetector:def__init__(self,weight_path,conf_th0.25,iou_th0.45):self.modelYOLO(weight_path)self.confconf_th self.iouiou_th self.class_dictself.model.namesdefsingle_image_detect(self,img_path,save_out):imgcv2.imread(img_path)pred_resself.model.predict(sourceimg,confself.conf,iouself.iou,saveFalse)draw_imgpred_res[0].plot()cv2.imwrite(save_out,draw_img)box_info_list[]forboxinpred_res[0].boxes:cidint(box.cls)cls_nameself.class_dict[cid]confround(float(box.conf)*100,2)x1,y1,x2,y2list(map(int,box.xyxy[0]))box_info_list.append({类别:cls_name,置信度:conf,坐标:[x1,y1,x2,y2]})returndraw_img,box_info_listdefvideo_detect(self,video_path,save_video):capcv2.VideoCapture(video_path)fpsint(cap.get(cv2.CAP_PROP_FPS))w,hint(cap.get(3)),int(cap.get(4))writercv2.VideoWriter(save_video,cv2.VideoWriter_fourcc(*mp4v),fps,(w,h))whilecap.isOpened():ret,framecap.read()ifnotret:breakpredself.model(frame,confself.conf,iouself.iou)framepred[0].plot()writer.write(frame)cap.release()writer.release()returnsave_video六、PyQt5桌面系统主程序 MainProgram.pyimportsys,osimportcv2importnumpyasnpfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QHBoxLayout,QVBoxLayout,QPushButton,QLabel,QFileDialog,QDoubleSpinBox,QTableWidget,QTableWidgetItem,QHeaderView,QCheckBox,QComboBox)fromPyQt5.QtGuiimportQPixmap,QImagefromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromdetect_toolsimportPvDefectDetectorclassDetectWorkThread(QThread):result_signalpyqtSignal(np.ndarray,list)def__init__(self,detector,img_path):super().__init__()self.detectordetector self.img_pathimg_pathdefrun(self):res_img,infoself.detector.single_image_detect(self.img_path,./save_data/temp.jpg)self.result_signal.emit(res_img,info)classPvDetectUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于深度学习的光伏电池板异物检测系统)self.resize(1330,830)self.detectorNoneself.init_ui()definit_ui(self):centralQWidget()self.setCentralWidget(central)main_layoutQHBoxLayout(central)# 左侧图片预览区self.show_labelQLabel(请加载图片开始检测)self.show_label.setAlignment(Qt.AlignCenter)self.show_label.setStyleSheet(border:1px solid #888888;)main_layout.addWidget(self.show_label,2)# 右侧控制面板right_widgetQWidget()right_layoutQVBoxLayout(right_widget)# 参数设置面板param_widgetQWidget()param_layoutQVBoxLayout(param_widget)self.btn_select_modelQPushButton(选择检测模型)self.btn_select_model.clicked.connect(self.load_model_file)param_layout.addWidget(self.btn_select_model)# 置信度IOUconf_layoutQHBoxLayout()conf_layout.addWidget(QLabel(置信度阈值))self.conf_spinQDoubleSpinBox()self.conf_spin.setRange(0,1)self.conf_spin.setValue(0.25)conf_layout.addWidget(self.conf_spin)param_layout.addLayout(conf_layout)iou_layoutQHBoxLayout()iou_layout.addWidget(QLabel(交并比阈值))self.iou_spinQDoubleSpinBox()self.iou_spin.setRange(0,1)self.iou_spin.setValue(0.45)iou_layout.addWidget(self.iou_spin)param_layout.addLayout(iou_layout)# 勾选框self.check_show_labelQCheckBox(显示标签名称与置信度)self.check_show_label.setChecked(True)self.check_originQCheckBox(显示原图)param_layout.addWidget(self.check_show_label)param_layout.addWidget(self.check_origin)# 设备选择dev_layoutQHBoxLayout()dev_layout.addWidget(QLabel(检测设备选择))self.combo_devQComboBox()self.combo_dev.addItems([CPU,GPU])dev_layout.addWidget(self.combo_dev)param_layout.addLayout(dev_layout)right_layout.addWidget(param_widget)# 检测结果信息区res_widgetQWidget()res_layoutQVBoxLayout(res_widget)self.label_totalQLabel(用时0.000s 目标数目0)self.label_typeQLabel(类型无)self.label_confQLabel(置信度0.00%)self.label_posQLabel(目标位置:\nxmin:0 ymin:0\nxmax:0 ymax:0)res_layout.addWidget(self.label_total)res_layout.addWidget(self.label_type)res_layout.addWidget(self.label_conf)res_layout.addWidget(self.label_pos)right_layout.addWidget(res_widget)# 功能按钮btn_layoutQGridLayout()self.btn_imgQPushButton(打开图片)self.btn_img.clicked.connect(self.open_single_img)self.btn_folderQPushButton(打开文件夹)self.btn_videoQPushButton(打开视频)self.btn_camQPushButton(打开摄像头)self.btn_saveQPushButton(保存)self.btn_exitQPushButton(退出)btn_layout.addWidget(self.btn_img,0,0)btn_layout.addWidget(self.btn_folder,0,1)btn_layout.addWidget(self.btn_video,1,0)btn_layout.addWidget(self.btn_cam,1,1)btn_layout.addWidget(self.btn_save,2,0)btn_layout.addWidget(self.btn_exit,2,1)right_layout.addLayout(btn_layout)# 底部表格self.table_infoQTableWidget()self.table_info.setColumnCount(5)self.table_info.setHorizontalHeaderLabels([序号,文件路径,类别,置信度,坐标位置])self.table_info.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)right_layout.addWidget(self.table_info)main_layout.addWidget(right_widget,1)defload_model_file(self):path,_QFileDialog.getOpenFileName(self,选择权重,,*.pt)ifpath:self.detectorPvDefectDetector(path,self.conf_spin.value(),self.iou_spin.value())defopen_single_img(self):path,_QFileDialog.getOpenFileName(self,选择光伏图片,,*.jpg;*.png;*.jpeg)ifnotpath:returnifnotself.detector:self.detectorPvDefectDetector(./models/best.pt,0.25,0.45)self.workDetectWorkThread(self.detector,path)self.work.result_signal.connect(self.refresh_ui)self.work.start()defrefresh_ui(self,draw_img,info_list):rgb_imgcv2.cvtColor(draw_img,cv2.COLOR_BGR2RGB)h,w,crgb_img.shape qimgQImage(rgb_img.data,w,h,w*c,QImage.Format_RGB888)self.show_label.setPixmap(QPixmap.fromImage(qimg).scaled(self.show_label.size(),Qt.KeepAspectRatio))self.label_total.setText(f用时批量处理 目标数目{len(info_list)})iflen(info_list)0:self.label_type.setText(f类型{info_list[0][类别]})self.label_conf.setText(f置信度{info_list[0][置信度]}%)posinfo_list[0][坐标]self.label_pos.setText(f目标位置:\nxmin:{pos[0]}ymin:{pos[1]}\nxmax:{pos[2]}ymax:{pos[3]})# 填充表格self.table_info.setRowCount(len(info_list))foridx,iteminenumerate(info_list):self.table_info.setItem(idx,0,QTableWidgetItem(str(idx1)))self.table_info.setItem(idx,1,QTableWidgetItem(...))self.table_info.setItem(idx,2,QTableWidgetItem(item[类别]))self.table_info.setItem(idx,3,QTableWidgetItem(f{item[置信度]}%))self.table_info.setItem(idx,4,QTableWidgetItem(str(item[坐标])))defopen_video(self):path,_QFileDialog.getOpenFileName(self,选择视频,,*.mp4;*.avi)ifpathandself.detector:self.detector.video_detect(path,./save_data/out.mp4)defopen_camera(self):ifself.detector:self.detector.video_detect(0,./save_data/cam_out.mp4)if__name____main__:appQApplication(sys.argv)winPvDetectUI()win.show()sys.exit(app.exec_())七、环境配置 requirements.txttorch1.9.0 torchvision0.10.0 ultralytics opencv-python pyqt5 numpy pillow一键安装命令conda create-npvpython3.9conda activatepvpipinstall-rrequirements.txt九、项目适用方向✅ 光伏电站智能运维系统开发✅ 无人机航拍光伏缺陷自动筛查✅ 电气工程/计算机毕设完整课题✅ 工业视觉缺陷检测算法学习✅ 二次开发嵌入式RKNN部署需