news 2026/1/31 6:38:42

PVEL-AD数据集 内部缺陷和异构背景的近红外图像检测数据集 裂纹(线状和星状)、断栅、黑芯、未对准、粗线、划痕、碎片、断角和材料缺陷 YOLOV8模型如何训练红外图像太阳能光伏缺陷检测数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PVEL-AD数据集 内部缺陷和异构背景的近红外图像检测数据集 裂纹(线状和星状)、断栅、黑芯、未对准、粗线、划痕、碎片、断角和材料缺陷 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/1/25 4:41:36

etcd分布式配置:VibeThinker生成Watch监听示例

etcd分布式配置&#xff1a;VibeThinker生成Watch监听示例 在现代云原生架构中&#xff0c;服务的动态配置管理早已不再是“有则更好”的附加功能&#xff0c;而是系统弹性和可维护性的生命线。想象这样一个场景&#xff1a;一个微服务集群正在处理数万并发请求&#xff0c;运维…

作者头像 李华
网站建设 2026/1/30 10:18:50

抽象诗歌5首:拖鞋上的猫毛

16. 拖鞋上的猫毛拖鞋上粘着猫毛&#xff0c;是橘猫掉的它昨天在我拖鞋上睡觉&#xff0c;打呼的声音像小火车——现在猫不见了猫毛还在&#xff0c;我穿着拖鞋走猫毛跟着晃&#xff0c;像橘猫在跟着我&#xff0c;我喊它的名字没回应&#xff0c;原来有些陪伴&#xff0c;是看…

作者头像 李华
网站建设 2026/1/30 14:07:13

三菱FX3U 485ADP MB与3台施耐德ATV 71变频器通讯实战

三菱FX3U 485ADP MB与3台施耐德ATV 71变频器通讯实战程序程序为原创&#xff0c;稳定可靠&#xff0c;有注释。 并附送程序&#xff0c;有接线方式&#xff0c;设置。同时实现变频器 DRIVECOM流程&#xff0c;解决施耐德ATV变频器断电重启后&#xff0c;自准备工作&#xff0c;…

作者头像 李华
网站建设 2026/1/31 2:07:40

生成可读性强的算法解释文档,VibeThinker帮你写技术博客

VibeThinker-1.5B&#xff1a;小模型如何实现高强度推理的“越级挑战” 在算法竞赛圈&#xff0c;你可能遇到过这样的场景&#xff1a;面对一道看似简单的动态规划题&#xff0c;思路卡壳、边界条件理不清&#xff0c;翻遍题解仍不得要领。而此时&#xff0c;如果有一个能像资深…

作者头像 李华
网站建设 2026/1/30 1:01:36

UE5C++(4):

&#xff08;16&#xff09; &#xff08;17&#xff09; 谢谢

作者头像 李华
网站建设 2026/1/27 11:36:33

【容器日志管理】:3种主流收集架构对比,选型不再难

第一章&#xff1a;Docker日志收集概述在容器化应用日益普及的今天&#xff0c;高效、可靠的日志管理成为保障系统可观测性的关键环节。Docker作为主流的容器运行时&#xff0c;其内置的日志驱动机制为容器输出提供了基础支持。默认情况下&#xff0c;Docker将容器的标准输出&a…

作者头像 李华