金属表面缺陷检测(基于YOLOv5、OpenCV、半监督)

0 阅读3分钟

1. 基于YOLOv5金属表面缺陷检测

1.1 数据集介绍

ed134f21-830a-4db0-9977-12a02bb2b33e.png

NEU数据集由东北大学宋克臣团队制作,专注于钢材表面缺陷的检测与识别。数据集包含了1800张灰度图像,涵盖了六种常见的钢材表面缺陷类型,数据标签为xml格式。

  1. Crazing(裂纹)
  2. Inclusion(夹杂物)
  3. Patches(斑点)
  4. Pitted Surface(麻面)
  5. Rolled-in Scale(轧入氧化皮)
  6. Scratches(划痕)

NEU数据集

数据集主要分为两个部分:

  • ANNOTATIONS:包含每张图片对应的标签信息,用于标注缺陷的类型和位置。
  • IMAGES:包含1800张钢材表面缺陷的图片,每张图片都对应一个特定的缺陷类型。

图片格式:所有图片均为标准图像格式,适合用于计算机视觉任务。 标签格式:标签文件详细描述了每张图片中的缺陷类型及其位置信息,便于进行目标检测和分类任务。

1.2 数据集划分和标签配置

train包括images和labels,所有类别放在一个文件夹里:训练集1770张

标签格式必须为.txt,四个参数:类别,x,y,w,h

数据配置文件data.yaml:

image.png

原数据集标签格式为xml格式,所以需要转换为YOLO的txt格式

1.3 训练参数配置

  1. 数据配置文件(根据数据集路径类别修改)
  2. 网络配置文件()
  3. 预训练权重文件(默认)
  4. 批次大小(根据硬件显存修改)

1.4 训练结果

image.png

image.png

f67cd93f-cf68-4b98-9508-6fab5899e0e7.png

image.png

问题: 同样是训练200epoch,其他所以参数都一样,一种是训练到100epoch时电脑进入了睡眠模式,隔一段时间继续训练完,一种是一直保持最佳性能训练,这样有区别吗?

  1. 学习率调度被打乱(最重要影响)
  2. 优化器状态丢失(如果未正确保存)

检测detect.py参数配置:

--weights runs\exp32\weights\best.pt(自己训练的模型权重) --source ..\NEU-DET\valid\images\inclusion_1.jpg(检测数据路径) --output ..\NEU-DET\output(检测结果输出路径) --conf-thres 0.4(置信度)

cf3703f0-8f16-4f83-9601-6651ed2943e1.png

2. 半监督异常检测

论文《Semi-supervised Anomaly Detection using AutoEncoders-2020》中,提出了一种卷积自编码器架构,用于异常检测,仅在无缺陷(正常)实例上进行训练。对于测试图像,通过从自编码器输出中减去原始图像获得的残差掩码被阈值化,以获得缺陷分割掩码

  • 优点:仅在无缺陷(正常)实例上进行训练
  • 缺点:该方法对阈值的选择比较敏感。甚至连光照的变化也被该方法视为不可取的异常。

3. 传统方法OPenCV

4. 缺陷检测常见问题和难点总结

一、数据相关难点

(1)大图像中的小缺陷检测:图像切片(推理时大图切分成多个小图)、增加小目标检测层(减小感受野)、使用更密集的检测框(减小检测框)

(2)缺陷样本极度不平衡:缺陷样本数据增强(针对专门缺陷)、重采样(过采样缺陷/欠采样正常)

(3)缺陷形态多变与未知缺陷:GAN生成缺陷样本

(4)数据标注成本高、 subjectivity强:弱监督学习(使用图像级标签(有无缺陷)代替边界框标注)、半监督学习(使用卷积自编码器仅在无缺陷(正常)实例上进行训练进行异常检测)

二、模型与算法难点

(1)复杂背景与缺陷混淆:背景抑制( 通过预处理技术突出缺陷区域)、注意力机制( 让模型聚焦于关键区域)

(2)检测速度与精度的权衡