当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/204355/

相关文章:

  • Terraform基础设施即代码:VibeThinker构建AWS VPC模块
  • 2026年西安可靠的自建房建设直销厂家口碑推荐榜单,重钢/床/轻钢/自建房建设/木饰面,自建房建设源头厂家推荐榜单 - 品牌推荐师
  • 实战演示:输入一道欧几里得几何题,看VibeThinker如何作答
  • 2026年五金制品行业优质供应商推荐:宝强五金质量怎么样? - myqiye
  • 如何判断一个问题是否适合交给VibeThinker处理
  • 【高级开发必备技能】:基于Docker的Git工作树隔离架构设计与落地实操
  • Shell命令生成:VibeThinker也能写出高效Linux指令
  • 高频滤波器生产厂选哪家好?TOP5技术强定制能力突出厂商推荐 - 工业品牌热点
  • Vault密钥管理:VibeThinker生成Dynamic Database Credentials
  • 中百超市卡回收平台及如何规避风险 - 京回收小程序
  • 【2026实测】降ai率,论文降aigc一篇搞定(含免费降ai率工具) - 晨晨_分享AI
  • 还在手动切换分支?自动化Git工作树隔离方案(Docker+CI/CD集成秘籍)
  • 2026年专业的家庭医疗器械,专业医疗器械,临床医疗器械公司采购参考名录 - 品牌鉴赏师
  • 京东e卡回收避坑宝典,让闲置变现金不踩雷! - 京顺回收
  • 二次函数最值问题(25年广州二模)
  • Docker Rollout配置实战(从入门到精通的3大核心要点)
  • 2025垂类模型AI开发推荐榜:云端高科聚焦物体/动作/瑜伽/医疗/法律模型研发 - 品牌推荐官
  • UE5C++(4):
  • 【高可用架构必备】:Docker健康检查脚本设计全解析
  • 2026供暖工程必备:钢套钢保温钢管厂家怎么选更靠谱 - 栗子测评
  • 创客匠人:多智能体协作重构 IP 业务流水线 —— 具身智能落地的知识变现新范式
  • Docker跨平台构建全流程拆解(企业级CI/CD集成方案曝光)
  • 2025年碳酸镁生产厂家综合实力,有实力的碳酸镁口碑推荐解决方案与实力解析 - 品牌推荐师
  • 导师推荐9个AI论文工具,专科生轻松搞定毕业论文!
  • open-ebs
  • FPGA教程系列-Vivado AXI串口仿真测试
  • 【专家私藏】Docker性能监控的8个秘密武器,运维人必看!
  • 容器CPU飙升却找不到原因?Docker性能监控必须关注的7个信号
  • 河南赛福德医院家具护士站工作台:专业之选,品质保障 - 工业品牌热点
  • 如何实时监控Docker容器性能?3步搭建企业级监控体系