news 2026/4/16 16:37:57

深度学习框架EL2021数据集对光伏电池异常缺陷检测方法进行基准测试数据集YOLOV8模型如何训练红外光伏缺陷检测数据集 内部缺陷和异构背景的近红外图像

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深度学习框架EL2021数据集对光伏电池异常缺陷检测方法进行基准测试数据集YOLOV8模型如何训练红外光伏缺陷检测数据集 内部缺陷和异构背景的近红外图像

太阳能 光伏电池缺陷异常检测数据集PVELAD
河北工业大学、北京航空航天大学联合发布的——PVEL-AD 数据集又叫做EL2021数据集是用于对光伏电池异常缺陷检测方法进行基准测试的数据集。

PVEL-AD包含 36,543 张具有各种内部缺陷和异构背景的近红外图像,其中包含1类无异常图像和具有 12 个不同类别的异常缺陷图像,例如裂纹(线状和星状)、断栅、黑芯、未对准、粗线、划痕、碎片、断角和材料缺陷。 此外,我们为 12 种类型的缺陷提供了 40000+ 个真实标注框用于缺陷检测。


1

1

1

1

1

以下是基于 PVEL-AD 数据集的太阳能电池缺陷检测系统完整实现,包含:

✅ 36,543 张近红外图像(含 13 类)
✅ 40,000+ 真实标注框(YOLO 格式)
✅ YOLOv8 训练代码(mAP@0.5 ≥ 0.795)
✅ PyQt5 图形界面(支持实时检测)
✅ 可视化结果与精度分析


📊 一、数据集概览表

属性详情
数据集名称PVEL-AD (Photovoltaic Equipment Labeling for Anomaly Detection)
图像数量36,543 张
图像类型近红外图像(NIR)
类别总数13 类(1类正常 + 12类缺陷)
缺陷类别crack,finger,black_core,thick_line,star_crack,corner,fragment,scratch,horizontal_dislocation,vertical_dislocation,printing_error,short_circuit
标注格式YOLO 格式(.txt
标注数量>40,000 个边界框
分辨率1024×1024 / 1280×1280
背景复杂度高(异构背景、光照变化、噪声)

✅ 已划分:

  • 训练集:25,580 张(70%)
  • 验证集:7,308 张(20%)
  • 测试集:3,655 张(10%)

📂 二、目录结构

pvel_ad_system/ ├── datasets/ │ └── pvel_ad_13cls/ │ ├── train/ │ │ ├── images/ │ │ └── labels/ │ ├── val/ │ │ ├── images/ │ │ └── labels/ │ └── test/ │ ├── images/ │ └── labels/ ├── configs/ │ └── data.yaml ├── models/ │ └── yolov8s_pvel.pt ├── train_pvel.py ├── inference.py └── gui_main.py

📄 三、data.yaml配置文件

# configs/data.yamltrain:../datasets/pvel_ad_13cls/train/imagesval:../datasets/pvel_ad_13cls/val/imagestest:../datasets/pvel_ad_13cls/test/imagesnc:13names:['normal','crack','finger','black_core','thick_line','star_crack','corner','fragment','scratch','horizontal_dislocation','vertical_dislocation','printing_error','short_circuit']

🚀 四、训练代码:train_pvel.py

# train_pvel.py""" PVEL-AD 太阳能电池缺陷检测 - YOLOv8 训练脚本 - 数据集:36,543张,13类 - 目标:mAP@0.5 >= 0.795 """importosimporttorchfromultralyticsimportYOLOimportmatplotlib.pyplotaspltimportpandasaspddefmain():DATA_YAML="configs/data.yaml"MODEL_NAME="yolov8s.pt"# 小模型,适合多类小目标PROJECT_NAME="pvel_ad_detection"RUN_NAME="exp_pvel_13cls"EPOCHS=200IMG_SIZE=640# 下采样以提升速度BATCH_SIZE=16# 16GB GPU 可设为 32LR0=0.001DEVICE="cuda"iftorch.cuda.is_available()else"cpu"print(f"🚀 启动训练 | 设备:{DEVICE}| 模型:{MODEL_NAME}")model=YOLO(MODEL_NAME)results=model.train(data=DATA_YAML,epochs=EPOCHS,imgsz=IMG_SIZE,batch=BATCH_SIZE,lr0=LR0,device=DEVICE,project=PROJECT_NAME,name=RUN_NAME,patience=20,# 早停save_period=10,workers=4,# 数据增强(关键!提升鲁棒性)augment=True,mosaic=0.5,mixup=0.2,copy_paste=0.3,# 适合细线状缺陷(如裂纹)degrees=15.0,translate=0.1,scale=0.1,shear=2.0,fliplr=0.5,hsv_h=0.015,hsv_s=0.7,hsv_v=0.4,)# 验证metrics=model.val()print(f"\n✅ 训练完成!")print(f"📊 mAP@0.5:{metrics.box.map50:.4f}")print(f"📊 mAP@0.5-0.95:{metrics.box.map:.4f}")print(f"📁 最佳模型路径: runs/detect/{RUN_NAME}/weights/best.pt")# 绘制 PR 曲线(如图所示)plot_pr_curve(results)defplot_pr_curve(results):"""绘制 Precision-Recall 曲线"""df=pd.read_csv(f"{results.save_dir}/results.csv")fig,ax=plt.subplots(figsize=(12,8))# 从训练日志中提取每个类别的 PR 曲线pr_data=[]foriinrange(13):class_name=f'class{i}'pr_curve=df[f'metrics/precision(B)'].values recall_curve=df[f'metrics/recall(B)'].values pr_data.append((pr_curve,recall_curve,f'class{i}'))# 绘制所有类别colors=['blue','orange','green','red','purple','brown','pink','gray','olive','cyan','magenta','teal','coral']fori,(pr,recall,label)inenumerate(pr_data):ax.plot(recall,pr,color=colors[i],label=f'{label}')# 绘制整体曲线ax.plot(df['metrics/recall(B)'],df['metrics/precision(B)'],'b-',linewidth=2,label='all classes')ax.set_xlabel('Recall')ax.set_ylabel('Precision')ax.set_title('Precision-Recall Curve')ax.grid(True)ax.legend(bbox_to_anchor=(1.05,1),loc='upper left')plt.tight_layout()plt.savefig(f"{results.save_dir}/pr_curve.png",dpi=150)plt.show()if__name__=="__main__":main()

🔍 五、推理核心函数:inference.py

# inference.py""" PVEL-AD 推理模块 支持图片、视频、摄像头 """importcv2importnumpyasnpfromultralyticsimportYOLOimportosclassPVDefectDetector:def__init__(self,model_path):self.model=YOLO(model_path)self.class_names=['normal','crack','finger','black_core','thick_line','star_crack','corner','fragment','scratch','horizontal_dislocation','vertical_dislocation','printing_error','short_circuit']defdetect_image(self,image_path,conf_threshold=0.4,iou_threshold=0.5):frame=cv2.imread(image_path)results=self.model(frame,conf=conf_threshold,iou=iou_threshold)annotated_frame=results[0].plot()returnannotated_frame,results[0]defget_results_info(self,result):boxes=result.boxes info=[]foriinrange(len(boxes)):cls_id=int(boxes.cls[i])conf=float(boxes.conf[i])x1,y1,x2,y2=map(int,boxes.xyxy[i])info.append({'class':self.class_names[cls_id],'confidence':conf,'bbox':[x1,y1,x2,y2]})returninfo

🖥️ 六、PyQt5 主界面代码:gui_main.py

# gui_main.py""" 基于深度学习的PVEL-AD太阳能电池缺陷检测系统 使用 PyQt5 + YOLOv8 实现 支持自定义模型加载 """importsysimportosfromPyQt5.QtWidgetsimport*fromPyQt5.QtGuiimport*fromPyQt5.QtCoreimportQt,QTimerimportcv2importnumpyasnpfrominferenceimportPVDefectDetectorclassPVDefectGUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("PVEL-AD 太阳能电池缺陷检测系统")self.setGeometry(100,100,1200,800)self.detector=Noneself.current_image=Noneself.results_info=[]self.init_ui()definit_ui(self):central_widget=QWidget()self.setCentralWidget(central_widget)layout=QVBoxLayout(central_widget)title_label=QLabel("<h1>PVEL-AD 太阳能电池缺陷检测</h1>")title_label.setAlignment(Qt.AlignCenter)layout.addWidget(title_label)main_layout=QHBoxLayout()layout.addLayout(main_layout)# 左侧:图像显示区left_layout=QVBoxLayout()self.image_label=QLabel()self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet("border: 2px solid #ccc; background-color: #f0f0f0;")left_layout.addWidget(self.image_label)# 结果表格self.result_table=QTableWidget()self.result_table.setColumnCount(5)self.result_table.setHorizontalHeaderLabels(["序号","文件路径","类别","置信度","坐标位置"])self.result_table.horizontalHeader().setStretchLastSection(True)left_layout.addWidget(self.result_table)main_layout.addLayout(left_layout)# 右侧:控制面板right_layout=QVBoxLayout()self.setup_control_panel(right_layout)main_layout.addLayout(right_layout)defsetup_control_panel(self,layout):# 模型加载model_group=QGroupBox("模型设置")model_layout=QVBoxLayout()self.model_path_edit=QLineEdit()self.load_model_btn=QPushButton("加载模型")self.load_model_btn.clicked.connect(self.load_model)model_layout.addWidget(self.model_path_edit)model_layout.addWidget(self.load_model_btn)model_group.setLayout(model_layout)layout.addWidget(model_group)# 参数设置param_group=QGroupBox("检测参数设置")param_layout=QHBoxLayout()self.conf_slider=QSlider(Qt.Horizontal)self.conf_slider.setMinimum(0)self.conf_slider.setMaximum(100)self.conf_slider.setValue(45)self.conf_label=QLabel("置信度阈值: 0.45")self.conf_slider.valueChanged.connect(lambdav:self.conf_label.setText(f"置信度阈值:{v/100:.2f}"))param_layout.addWidget(self.conf_label)param_layout.addWidget(self.conf_slider)self.iou_slider=QSlider(Qt.Horizontal)self.iou_slider.setMinimum(0)self.iou_slider.setMaximum(100)self.iou_slider.setValue(45)self.iou_label=QLabel("交并比阈值: 0.45")self.iou_slider.valueChanged.connect(lambdav:self.iou_label.setText(f"交并比阈值:{v/100:.2f}"))param_layout.addWidget(self.iou_label)param_layout.addWidget(self.iou_slider)self.show_labels_cb=QCheckBox("显示标签名称与置信度")self.show_labels_cb.setChecked(True)param_layout.addWidget(self.show_labels_cb)param_group.setLayout(param_layout)layout.addWidget(param_group)# 操作按钮btn_layout=QVBoxLayout()self.open_img_btn=QPushButton("打开图片")self.open_img_btn.clicked.connect(self.open_image)self.open_video_btn=QPushButton("打开视频")self.open_video_btn.clicked.connect(self.open_video)self.open_cam_btn=QPushButton("打开摄像头")self.open_cam_btn.clicked.connect(self.open_camera)self.save_btn=QPushButton("保存")self.save_btn.clicked.connect(self.save_result)self.exit_btn=QPushButton("退出")self.exit_btn.clicked.connect(self.close)btn_layout.addWidget(self.open_img_btn)btn_layout.addWidget(self.open_video_btn)btn_layout.addWidget(self.open_cam_btn)btn_layout.addWidget(self.save_btn)btn_layout.addWidget(self.exit_btn)layout.addLayout(btn_layout)defload_model(self):path,_=QFileDialog.getOpenFileName(self,"选择模型文件","","PyTorch Model (*.pt)")ifpath:self.model_path_edit.setText(path)try:self.detector=PVDefectDetector(path)QMessageBox.information(self,"成功","模型加载成功!")exceptExceptionase:QMessageBox.critical(self,"错误",f"模型加载失败:{str(e)}")defopen_image(self):ifnotself.detector:QMessageBox.warning(self,"警告","请先加载模型!")returnpath,_=QFileDialog.getOpenFileName(self,"选择图片","","Image Files (*.jpg *.png *.bmp)")ifpath:self.detect_and_display(path)defdetect_and_display(self,image_path):conf=self.conf_slider.value()/100iou=self.iou_slider.value()/100annotated_frame,results=self.detector.detect_image(image_path,conf,iou)self.display_frame(annotated_frame)self.results_info=self.detector.get_results_info(results)self.update_table()defdisplay_frame(self,frame):rgb=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w=rgb.shape[:2]scale=min(600/w,600/h)new_w,new_h=int(w*scale),int(h*scale)resized=cv2.resize(rgb,(new_w,new_h))qimg=QImage(resized.data,new_w,new_h,new_w*3,QImage.Format_RGB888)pixmap=QPixmap.fromImage(qimg)self.image_label.setPixmap(pixmap)defupdate_table(self):self.result_table.setRowCount(len(self.results_info))fori,iteminenumerate(self.results_info):self.result_table.setItem(i,0,QTableWidgetItem(str(i+1)))self.result_table.setItem(i,1,QTableWidgetItem(item['class']))self.result_table.setItem(i,2,QTableWidgetItem(f"{item['confidence']:.2f}"))self.result_table.setItem(i,3,QTableWidgetItem(str(item['bbox'])))defsave_result(self):ifnotself.current_image:returnpath,_=QFileDialog.getSaveFileName(self,"保存检测结果","","PNG Image (*.png)")ifpath:cv2.imwrite(path,self.current_image)QMessageBox.information(self,"成功","结果已保存!")defcloseEvent(self,event):event.accept()defmain():app=QApplication(sys.argv)window=PVDefectGUI()window.show()sys.exit(app.exec_())if__name__=="__main__":main()

✅ 七、训练结果分析(PR 曲线)

缺陷类型mAP@0.5
crack0.770
finger0.911
black_core0.993
thick_line0.801
star_crack0.801
corner0.332
fragment0.995
scratch0.000
horizontal_dislocation0.955
vertical_dislocation0.990
printing_error0.995
short_circuit0.995
all classes0.795

✅ 如图所示,整体 mAP@0.5 达到0.795,满足工业级检测需求。


🧩 八、运行说明

1. 安装依赖

pipinstallultralytics PyQt5 opencv-python numpy matplotlib

2. 训练模型

python train_pvel.py

3. 运行 GUI

python gui_main.py

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

如何通过生产调度分析提升汽车制造效率与OEE?

在现代汽车制造业加速向智能化、柔性化与绿色化转型的背景下&#xff0c;生产调度分析已从传统的排产工具&#xff0c;演变为驱动整车制造效率跃升的核心决策中枢。面对多品种、小批量、快交付的市场需求&#xff0c;传统依赖人工经验与静态计划的调度方式难以应对复杂的产线协…

作者头像 李华
网站建设 2026/4/16 12:55:22

[精品]基于微信小程序的高校新生学生预注册系统 UniApp

文章目录项目介绍项目实现效果图所需技术栈文件解析微信开发者工具HBuilderXuniappmysql数据库与主流编程语言登录的业务流程的顺序是&#xff1a;毕设制作流程系统性能核心代码系统测试详细视频演示源码获取项目介绍 基于微信小程序的学生预注册系统&#xff0c;旨在简化学生…

作者头像 李华
网站建设 2026/4/15 14:32:00

2026研究生必备!10个降AI率工具测评榜单

2026研究生必备&#xff01;10个降AI率工具测评榜单 研究生必备&#xff01;2026年降AI率工具测评榜单出炉 随着学术规范日益严格&#xff0c;AI生成内容检测技术不断升级&#xff0c;越来越多的研究生在论文写作过程中面临“AI率过高”的问题。无论是初稿还是修改后的版本&am…

作者头像 李华
网站建设 2026/4/16 16:11:20

封装不同类型函数名相异的模版

这里有一个比较好的例子&#xff0c;在cuda 的复数运算中&#xff0c;复数的加法 在 float2 类型的复数&#xff0c;与double2 类型的复数&#xff0c;函数名不同&#xff0c;但是已经实现过了&#xff0c;可以直接拿过来使用。例如 加法&#xff1a;cuCaddf(cuFloatComplex a,…

作者头像 李华
网站建设 2026/4/10 4:53:06

java垃圾收集 minorgc majargc fullgc

核心概念总览 这三种 GC 类型的本质区别在于回收的堆内存区域和触发原因。GC 类型别名回收区域触发原因特点Minor GCYoung GC只回收年轻代 (Eden Survivor)Eden 区空间不足非常频繁&#xff0c;速度通常很快&#xff0c;使用复制算法Major GCOld GC只回收老年代老年代空间不足…

作者头像 李华