采用深度学习方法进行图像缺陷检测_使用ResNet50预训练模型来对 太阳能电池板缺陷数据集 12类的缺陷类型进行检测
文章目录
- 1. 数据理解与准备
- 加载和解析XML标签文件
- 2. 数据预处理
- 图像预处理
- 3. 模型选择与训练
- 4. 模型评估与优化
- 5. 测试与推理
- 特定缺陷类型的处理
太阳能电池板缺陷数据集
crack:裂缝
finger:指状物;(常指不好的)痕迹 (具体含义需结合语境,在电子元件等领域可能指引脚等)
black core:黑心(比如材料内部出现黑色的核心部分)
thick line:粗线
star crack:星状裂纹
corner:角落;拐角处;(物体的)角
fragment:碎片;片段
scratch:划痕;刮痕
horizontal dislocation:水平错位
vertical dislocation:垂直错位
printing_error:印刷错误
short circuit:短路
文字及代码仅供参考。
4500张带标签的
4500张带标签的太阳能电池板缺陷数据集,XML格式,采用深度学习方法进行图像分类和缺陷检测。
1. 数据理解与准备
加载和解析XML标签文件
首先,我们需要加载并解析原始图像及其对应的XML标签文件,以提取出每个图像中的缺陷信息。
importosimportxml.etree.ElementTreeasETimportnumpyasnpfromPILimportImageimportmatplotlib.pyplotaspltfromsklearn.preprocessingimportLabelEncoderfromtensorflow.keras.utilsimportto_categorical# 定义函数加载图像和解析XML标签defload_images_and_parse_xml(image_folder,xml_folder):images=[]labels=[]forfilenameinos.listdir(image_folder):iffilename.endswith(".jpg")orfilename.endswith(".png"):# 根据文件类型调整img_path=os.path.join(image_folder,filename)xml_filename=os.path.splitext(filename)[0]+'.xml'xml_path=os.path.join(xml_folder,xml_filename)img=Image.open(img_path).convert('RGB')img_array=np.array(img)images.append(img_array)tree=ET.parse(xml_path)root=tree.getroot()defect_type=root.find('object').find('name').text# 假设一个图像只有一个缺陷类型labels.append(defect_type)returnnp.array(images),np.array(labels)# 加载图像和解析XML标签image_folder='path/to/images'xml_folder='path/to/xml_labels'images,labels=load_images_and_parse_xml(image_folder,xml_folder)# 查看样本图像及其标签plt.imshow(images[0])plt.title(f'Label:{labels[0]}')plt.show()# 编码标签le=LabelEncoder()encoded_labels=le.fit_transform(labels)categorical_labels=to_categorical(encoded_labels)# 显示标签映射print("Label Mapping:",dict(zip(le.classes_,range(len(le.classes_)))))2. 数据预处理
图像预处理
- 调整大小:确保所有图像都具有相同的尺寸。
- 归一化:将像素值缩放到[0, 1]范围。
- 数据增强:通过旋转、翻转、亮度调整等操作来增加数据多样性。
fromtensorflow.keras.preprocessing.imageimportImageDataGenerator# 调整大小target_size=(224,224)# 根据模型需求调整resized_images=[np.array(Image.fromarray(img).resize(target_size))forimginimages]resized_images=np.array(resized_images)# 归一化normalized_images=resized_images/255.0# 数据增强datagen=ImageDataGenerator(rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,horizontal_flip=True,brightness_range=[0.8,1.2])# 应用数据增强augmented_images=datagen.flow(normalized_images,categorical_labels,batch_size=len(normalized_images)).next()[0]# 分割数据集fromsklearn.model_selectionimporttrain_test_split X_train,X_test,y_train,y_test=train_test_split(augmented_images,categorical_labels,test_size=0.2,random_state=42)3. 模型选择与训练
我们可以使用卷积神经网络(CNN)进行分类任务。这里我们选择使用ResNet50预训练模型,并在顶部添加自定义分类层。
fromtensorflow.keras.applicationsimportResNet50fromtensorflow.keras.modelsimportSequentialfromtensorflow.keras.layersimportDense,GlobalAveragePooling2D# 创建模型base_model=ResNet50(weights='imagenet',include_top=False,input_shape=(224,224,3))model=Sequential([base_model,GlobalAveragePooling2D(),Dense(128,activation='relu'),Dense(len(le.classes_),activation='softmax')])# 冻结基础模型的层forlayerinbase_model.layers:layer.trainable=False# 编译模型model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])# 训练模型history=model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=10,batch_size=32)4. 模型评估与优化
评估模型性能,并尝试调整超参数或引入更多特征来提高模型的表现。
# 在测试集上评估模型test_loss,test_accuracy=model.evaluate(X_test,y_test)print(f'Test Loss:{test_loss}, Test Accuracy:{test_accuracy}')5. 测试与推理
在测试集上评估模型表现,并保存最佳模型用于后续的推理任务。
# 使用模型进行预测predictions=model.predict(X_test)# 将预测结果反编码回原始标签predicted_labels=le.inverse_transform(np.argmax(predictions,axis=1))# 显示预测结果foriinrange(3):# 显示前三个样本的预测结果plt.figure(figsize=(6,2))plt.subplot(1,2,1)plt.imshow(X_test[i])plt.title(f'Prediction:{predicted_labels[i]}')plt.subplot(1,2,2)plt.imshow(X_test[i])plt.title(f'Ground Truth:{le.inverse_transform([np.argmax(y_test[i])])[0]}')plt.show()注意事项 - XML标签解析
对于XML标签,以下是一些额外的建议:
多缺陷实例:如果一个图像中存在多个缺陷实例,确保正确解析每个对象的标签信息,并根据需要进行多标签分类。
边界框信息:如果XML文件包含边界框(bounding box)信息,可以在模型中加入目标检测模块(如YOLO、Faster R-CNN),以便同时进行分类和定位。
属性信息:一些XML标签可能包含额外的属性信息(如缺陷严重程度)。这些信息可以作为辅助特征,帮助提高模型的准确性。
特定缺陷类型的处理
对于特定的缺陷类型,以下是额外的建议:
裂缝 (crack)和星状裂纹 (star crack):可以通过边缘检测滤波器增强这类特征,或者使用专门的目标检测模型来识别不规则形状。
指状物 (finger):如果指的是电池板上的电极引线,注意它们的形态和位置,避免误分类。可以利用形态学操作来突出这些特征。
黑心 (black core):这种缺陷通常位于材料内部,可以通过多光谱成像技术捕捉更深层次的信息。
粗线 (thick line)和划痕 (scratch):这些缺陷通常有明显的纹理特征,可以通过纹理分析算法辅助分类。
角落 (corner)和碎片 (fragment):注意图像裁剪时保持完整性和一致性,避免因裁剪导致的误分类。
水平错位 (horizontal dislocation)和垂直错位 (vertical dislocation):可以通过几何变换增强模型对位置变化的鲁棒性。
印刷错误 (printing_error)和短路 (short circuit):这些缺陷可能涉及复杂的电路结构,确保有足够的样本覆盖所有可能的情况。