太阳能光伏板航拍红外图像缺陷分类数据集

embedded/2024/9/23 7:29:01/

太阳能光伏板航拍红外图像缺陷分类数据集

一、数据集简介

太阳能光伏板的性能直接影响到光伏发电系统的效率和可靠性。随着无人机和红外成像技术的发展,通过航拍红外图像对光伏板进行缺陷检测已成为一种高效且准确的方法。本数据集包含11种不同的缺陷分类,总计20000张图像,适用于基于深度学习的缺陷分类任务。这些图像均为近红外黑白图像,经过可视化处理,以便于观察和分析。
在这里插入图片描述

二、数据集详情
1. 缺陷分类

数据集中的11种缺陷分类包括但不限于以下几类:

  1. 裂纹(Cracks):光伏板表面出现的裂痕。
  2. 热斑(Hot Spots):局部温度异常升高的区域。
  3. 阴影(Shadows):由于周围物体遮挡导致的阴影区域。
  4. 污染(Pollution):表面灰尘或污垢。
  5. 断线(Broken Cells):电池片内部的断线。
  6. 脱焊(Delamination):电池片与背板之间的分离。
  7. 烧毁(Burnt Cells):电池片因过热而烧毁。
  8. 缺失(Missing Cells):电池片缺失。
  9. 划痕(Scratches):表面划痕。
  10. 水渍(Water Stains):表面水渍。
  11. 其他(Others):未归类的其他缺陷。
2. 图像特点
  • 图像格式:近红外黑白图像。
  • 图像尺寸:统一为256x256像素。
  • 图像数量:总计20000张图像,每类缺陷大约1818张图像。
  • 图像处理:所有图像均经过可视化处理,增强了对比度和清晰度,便于观察和分析。
    在这里插入图片描述
三、数据集结构

数据集的文件结构如下:

solar_panel_defect_dataset/
│
├── train/
│   ├── cracks/
│   ├── hot_spots/
│   ├── shadows/
│   ├── pollution/
│   ├── broken_cells/
│   ├── delamination/
│   ├── burnt_cells/
│   ├── missing_cells/
│   ├── scratches/
│   ├── water_stains/
│   └── others/
│
├── val/
│   ├── cracks/
│   ├── hot_spots/
│   ├── shadows/
│   ├── pollution/
│   ├── broken_cells/
│   ├── delamination/
│   ├── burnt_cells/
│   ├── missing_cells/
│   ├── scratches/
│   ├── water_stains/
│   └── others/
│
└── test/├── cracks/├── hot_spots/├── shadows/├── pollution/├── broken_cells/├── delamination/├── burnt_cells/├── missing_cells/├── scratches/├── water_stains/└── others/
  • train/:训练集,包含18000张图像。
  • val/:验证集,包含1000张图像。
  • test/:测试集,包含1000张图像。
四、数据处理代码

以下是一个完整的Python代码示例,展示如何加载和预处理数据集,以及如何使用深度学习模型进行缺陷分类

1. 导入必要的库
import os
import numpy as np
import pandas as pd
import cv2
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
2. 加载数据集
def load_images_from_folder(folder):images = []labels = []for category in os.listdir(folder):path = os.path.join(folder, category)if not os.path.isdir(path):continuefor img in os.listdir(path):img_path = os.path.join(path, img)image = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)image = cv2.resize(image, (256, 256))images.append(image)labels.append(category)return np.array(images), np.array(labels)train_folder = 'solar_panel_defect_dataset/train'
val_folder = 'solar_panel_defect_dataset/val'
test_folder = 'solar_panel_defect_dataset/test'X_train, y_train = load_images_from_folder(train_folder)
X_val, y_val = load_images_from_folder(val_folder)
X_test, y_test = load_images_from_folder(test_folder)# 将标签编码为整数
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_train = le.fit_transform(y_train)
y_val = le.transform(y_val)
y_test = le.transform(y_test)# 归一化图像数据
X_train = X_train / 255.0
X_val = X_val / 255.0
X_test = X_test / 255.0# 扩展维度
X_train = np.expand_dims(X_train, axis=-1)
X_val = np.expand_dims(X_val, axis=-1)
X_test = np.expand_dims(X_test, axis=-1)
3. 构建深度学习模型
def build_model():model = Sequential([Conv2D(32, (3, 3), activation='relu', input_shape=(256, 256, 1)),MaxPooling2D((2, 2)),Conv2D(64, (3, 3), activation='relu'),MaxPooling2D((2, 2)),Conv2D(128, (3, 3), activation='relu'),MaxPooling2D((2, 2)),Flatten(),Dense(128, activation='relu'),Dropout(0.5),Dense(11, activation='softmax')])model.compile(optimizer=Adam(learning_rate=0.001), loss='sparse_categorical_crossentropy', metrics=['accuracy'])return modelmodel = build_model()
model.summary()
4. 训练模型
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
model_checkpoint = ModelCheckpoint('best_model.h5', monitor='val_loss', save_best_only=True)history = model.fit(X_train, y_train,epochs=50,batch_size=32,validation_data=(X_val, y_val),callbacks=[early_stopping, model_checkpoint]
)
5. 评估模型
# 加载最佳模型
model.load_weights('best_model.h5')# 评估模型
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f'Test accuracy: {test_acc:.4f}')# 绘制训练和验证的损失和准确率曲线
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.title('Loss')plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.title('Accuracy')plt.show()
6. 预测和可视化
def plot_predictions(images, true_labels, predicted_labels, n=5):fig, axes = plt.subplots(n, 2, figsize=(10, 5 * n))for i in range(n):ax = axes[i, 0]ax.imshow(images[i].squeeze(), cmap='gray')ax.set_title(f'True: {true_labels[i]}')ax.axis('off')ax = axes[i, 1]ax.imshow(images[i].squeeze(), cmap='gray')ax.set_title(f'Predicted: {predicted_labels[i]}')ax.axis('off')plt.tight_layout()plt.show()# 从测试集中随机选择一些图像进行预测
indices = np.random.choice(len(X_test), 5, replace=False)
sample_images = X_test[indices]
sample_true_labels = y_test[indices]
sample_predicted_labels = model.predict(sample_images).argmax(axis=1)plot_predictions(sample_images, sample_true_labels, sample_predicted_labels)
五、结论

本数据集提供了丰富的太阳能光伏板航拍红外图像,涵盖了11种不同的缺陷分类。通过上述代码示例,我们展示了如何加载、预处理数据集,并使用深度学习模型进行缺陷分类。该数据集和代码可以为研究人员和工程师提供一个强大的工具,用于开发和测试先进的光伏板缺陷检测系统,从而提高光伏发电系统的可靠性和效率。


http://www.ppmy.cn/embedded/113469.html

相关文章

k8s独立组件ingress,七层转发

一、K8S的Service 1、Service的作用 Service的作用体现在两个方面: 1、集群内部:不断跟踪pod的变化,更新endpoints中的pod对象,基于pod的IP地址不断变化的一种服务发现机制,也可以实现负载均衡,四层代理…

python内置模块pathlib.Path类操作目录和文件

python自带的pathlib模块提供了很多路径相关的功能,而pathlib.Path 是pathlib 模块中的一个核心类,它代表了文件系统中的一个路径,实现功能比如创建、删除、移动文件,读取和写入文件内容,遍历目录等。 Path 类跟os.pa…

Unity实战案例全解析:PVZ 植物放置分析

前篇:Unity实战案例全解析:PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物? 其实就只需要考虑两个步骤加一个后续处理: 1.点击卡牌后就实例化 需要一个植物状态枚举,因为卡牌分为拿在手上和种植下…

MySQL基于GTID同步模式搭建主从复制

系列文章目录 rpmbuild构建mysql5.7.42版本的rpm包 文章目录 系列文章目录一、mysql-5.7.42RPM包构建二、同步模式分类介绍1.异步同步模式2.半同步模式2.1.实现半同步操作流程2.2.半同步问题总结2.3.半同步一致性2.4.异步与半同步对比 3.GTID同步 三、GTID同步介绍1.gtid介绍2…

小程序面试题八

一、微信小程序如何处理页面间的数据通信? 微信小程序处理页面间的数据通信,可以采用多种方式,这些方法根据具体需求和场景的不同而有所选择。以下是几种常见的页面间数据通信方式: 1. URL 传递参数 适用场景:适用于…

Docker学习笔记(四)单主机网络

简介 Docker从容器中抽象除出了底层的主机连接网络,使得程序不用关心运行时的环境。连接到Docker网络的容器将获得唯一的地址,其他连接到同一Docker网络的容器也可以根据该IP找到目标容器并发送消息。   但是容器内运行的软件没法方便的确定主机IP地址…

【物联网】深入解析时序数据库TDengine及其Java应用实践

文章目录 一、什么是时序数据库?二、TDengine简介三、TDengine的Java应用实践(1)环境准备(2)数据插入(3)数据查询 一、什么是时序数据库? 时序数据库(Time-Series Datab…

MybatisPlus的一点了解

1.MybatisPlus使用: (1)Serializable id 这种参数要怎么传入值,对应的底层调用和数据库表格命名和实体类映射之间有什么关系 在 Java 中,Serializable 是一个标记接口,它表示一个类的实例可以被序列化&am…