news 2026/5/1 9:49:02

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/5/1 7:46:40

Kubernetes Deployment配置:VibeThinker生成HPA自动伸缩策略

Kubernetes 部署 VibeThinker 模型的弹性伸缩实践 在当前 AI 推理服务大规模落地的背景下&#xff0c;如何让一个轻量级但高精度的语言模型既能快速响应突发流量&#xff0c;又能控制资源开销&#xff0c;成为工程部署中的核心难题。尤其在面向编程题解、数学推理等高强度逻辑任…

作者头像 李华
网站建设 2026/5/1 7:51:41

【专家私藏】Docker性能监控的8个秘密武器,运维人必看!

第一章&#xff1a;Docker性能监控的核心价值在现代云原生架构中&#xff0c;容器化应用的稳定性与效率直接依赖于对运行时资源的精准掌控。Docker性能监控不仅帮助开发者识别资源瓶颈&#xff0c;还能提前预警潜在的服务异常&#xff0c;保障系统的高可用性。提升系统可见性 通…

作者头像 李华
网站建设 2026/5/1 6:50:24

SGMICRO圣邦微 SGM3005XD/TR QFN 信号开关

特性 低压工作:1.8V至5.5V 低导通电阻:0.5Q(典型值) 低导通电阻平坦度 -3dB带宽:15MHz 快速开关时间吨N50ns 关断时间15纳秒 轨到轨操作 典型功耗(<0.01W) 兼容TTL/CMOS 微型封装

作者头像 李华
网站建设 2026/4/26 3:49:30

CONSONANCE如韵电子 CN3765 SSOP-10-150mil 电池管理

特性可对单节&#xff0c;多节锂电池&#xff0c;磷酸铁锂电池或钛酸锂电池完整的充电管理宽输入电压范围&#xff1a;6.6V 到 30V电池没有连接时&#xff0c;可作为恒压源使用充电电流可达 4APWM 开关频率&#xff1a;310KHz恒压充电电压由外部电阻设置恒流充电电流由外部电阻…

作者头像 李华
网站建设 2026/5/1 9:27:45

从备份到回滚:构建高可用Docker系统的7个关键步骤

第一章&#xff1a;Docker故障恢复的核心概念在容器化应用的运行过程中&#xff0c;Docker 服务或容器本身可能因资源不足、网络中断、镜像损坏等原因发生故障。理解 Docker 故障恢复的核心概念是保障系统高可用性的基础。故障检测机制 Docker 提供了内置的健康检查功能&#x…

作者头像 李华
网站建设 2026/5/1 1:24:28

还在为Docker Rollout配置发愁?这4种方法让你秒变专家

第一章&#xff1a;Docker Rollout 配置入门指南在现代持续交付流程中&#xff0c;Docker Rollout 是实现服务平滑发布的关键环节。通过合理配置 Docker 镜像部署策略&#xff0c;可有效降低上线风险并提升系统稳定性。环境准备 部署前需确保目标主机已安装 Docker 引擎&#x…

作者头像 李华