Skip to content

算法说明

本页按从浅到深的顺序说明项目里的算法路线。每个方法都说明它是什么、为什么需要、在本项目里怎么用、输入输出是什么,以及怎样判断结果是否正常。

缺陷检测

缺陷检测回答两个问题:缺陷在哪里,以及缺陷属于哪一类。

输入是一张光伏电池片图像。输出是一组检测框,每个框包含坐标、类别和置信度。例如模型可能输出一个裂纹框,类别是 crack,置信度是 0.91

本项目通过 Ultralytics 使用 YOLO 类检测器。YOLO 把图像划分为许多候选区域,并在一次前向推理中同时预测位置和类别。它的优点是速度快,适合做 ONNX 和 TensorRT 部署对比。

判断检测结果是否正常,不能只看一张可视化图。需要看这些指标:

  • mAP50:预测框和真实框重叠超过 0.5 时的平均精度。
  • mAP50-95:用多个重叠阈值计算平均精度,比 mAP50 更严格。
  • Recall:真实缺陷中有多少被模型找到了。
  • 每类 AP:每一种缺陷单独的检测质量。

在光伏缺陷检测中,Recall 很重要。漏检意味着缺陷片可能流入下一道流程。误检也有成本,但通常还能进入复检。

缺陷分类

缺陷分类回答的问题是:这张图整体是否异常,或者异常程度是多少。

输入是一张单体电池片图像。输出可以是类别,也可以是一个分数。例如 ELPV 数据集中,模型可以输出 normaldefect,也可以输出接近 0.66 的缺陷概率。

分类模型通常由特征提取网络和分类头组成。特征提取网络把图像变成向量,分类头把向量变成类别概率。本项目已经为 ELPV 配置了 ResNet-18 和 Swin-T baseline,分别代表卷积模型和 transformer 模型两类图像级参考。

判断分类结果是否正常,需要看混淆矩阵、F1、AUC 和各等级样本的召回率。如果模型只在正常样本上表现很好,却把轻微缺陷都分错,那么它不适合作为筛查模型。

异常检测

异常检测回答的问题是:这张图有没有不像正常样本的地方。

它和监督检测不一样。监督检测需要见过某个缺陷类别的标注框,才能学会这个类别。异常检测主要学习正常样本的纹理分布。只要某个区域偏离正常分布,模型就可以给出异常分数。

PatchCore 是正常样本路线的异常检测 baseline 方向。PatchCore 的核心思路是保存正常图像的局部特征。推理时,它会把测试图像的局部特征和正常特征库比较。如果某个局部特征离正常特征很远,这个区域就更可能是异常。

输入是正常样本训练集和待检测图像。输出是图像级异常分数和像素或区域级热力图。正常结果应该满足两个条件:正常样本的异常分数低,明显缺陷样本的异常分数高。

异常检测适合处理新缺陷和极少样本缺陷。它不能完全替代检测模型,因为它通常不能直接给出细分类别,但它可以作为初筛模块,把可疑样本交给人工或后续模型处理。

前处理

前处理是在图像进入模型前做的变换。它的目标不是让图片看起来更漂亮,而是让模型更容易看到缺陷。

EL 图像常见问题包括亮度不均、晶硅纹理干扰、栅线干扰和微裂纹对比度低。可比较的前处理候选包括 CLAHE、Gamma 校正和简单滤波。

CLAHE 是限制对比度的自适应直方图均衡。它会在局部区域增强对比度,同时限制噪声被过度放大。输入是灰度图,输出是增强后的灰度图。

判断前处理是否有效,不能只凭肉眼。要比较同一模型在同一测试集上的指标,特别是裂纹、划痕和断栅这类细小缺陷的 Recall。如果 Recall 没有提升,或者误检明显增加,就不应该把这个前处理默认打开。

部署优化

训练阶段的模型通常运行在 PyTorch 中。部署阶段更关心延迟、吞吐量和资源占用。

ONNX 是一种模型交换格式。它把 PyTorch 模型导出成更通用的计算图,方便交给 ONNX Runtime 或 TensorRT 执行。输入是训练好的权重和输入尺寸,输出是 .onnx 文件。

TensorRT 是 NVIDIA 的推理优化工具。它可以根据显卡和输入尺寸优化计算图,并使用 FP16 或 INT8 降低计算成本。输入是 ONNX 模型,输出是 .engine 文件。

判断部署结果是否正常,要同时看精度和速度。PyTorch、ONNX Runtime 和 TensorRT 应该在同一测试集、同一输入尺寸、同一硬件上比较。输出差异不能明显影响 mAP 或 Recall,速度提升才有意义。