高分辨率影像在今天的世界中非常普遍,从卫星影像到无人机和数码单反相机都能获得。通过这些影像,我们可以捕捉到自然灾害造成的损害、制造设备的异常或者印刷电路板(PCB)或半导体上的非常小的缺陷,比如PCB或者半导体上的缺陷。使用高分辨率影像构建异常检测模型可能具有挑战性,因为现代计算机视觉模型通常会将图像调整为较低的分辨率以适应训练和运行推理时的内存需求。显著降低图像分辨率意味着与缺陷相关的视觉信息会降低或完全丧失。
解决这些挑战的一种方法是构建两阶段模型。第一阶段模型检测感兴趣区域,第二阶段模型检测剪切的感兴趣区域中的缺陷,从而保持足够的分辨率以用于小型缺陷。
在本文中,我们将介绍如何使用Amazon Rekognition自定义标签构建一个有效的两阶段缺陷检测系统,并与单阶段模型的结果进行比较。请注意,即使在较低或调整大小后的图像分辨率下,一些单阶段模型也有效,而其他模型可能会适应较大的图像批次。
解决方案概述
对于我们的用例,我们使用一个PCB图像数据集,其中包含合成生成的丢失的孔针,如下例所示。
我们使用这个数据集来证明一个单阶段方法在检测缺失的孔针缺陷时的检测性能不佳。我们倾向于采用两步模型,即首先使用Rekognition自定义标签进行目标检测以识别针脚,然后使用第二阶段模型对针脚的裁剪图像进行分类,将其分为有缺失孔和正常针脚。
Rekognition自定义标签模型的训练过程包括几个步骤,如下图所示。
首先,我们使用Amazon Simple Storage Service(Amazon S3)存储图像数据。然后在Amazon Sagemaker Jupyter笔记本中导入数据,数据科学家通常会检查图像并对其进行预处理,删除模糊图像或照明条件差的图像,调整大小或裁剪图像。然后,数据被分为训练集和测试集,并运行Amazon SageMaker Ground Truth标记作业来标记图像集并输出训练和测试的清单文件。这些清单文件将用于Rekognition自定义标签的训练。
单阶段模型方法
我们首先采用的方法是标记丢失的孔并训练一个目标检测模型以识别丢失的孔。以下是数据集中的一个示例图像。
我们使用95张图像作为训练集,20张图像作为测试集训练模型。下表总结了我们的结果。
评估结果 | |||||
F1 分数 | 平均精度 | 整体召回率 | |||
0.468 | 0.750 | 0.340 | |||
训练时间 | 训练数据集 | 测试数据集 | |||
训练耗时 1.791 小时 | 1 个标签,95 张图片 | 1 个标签,20 张图片 | |||
每个标签的表现 | |||||
标签名称 | F1 分数 | 测试图片数 | 精度 | 召回率 | 假设阈值 |
missing_hole |
0.468 | 20 | 0.750 | 0.340 | 0.053 |
生成的模型具有较高的精度但召回率较低,这意味着当我们为缺失孔洞定位一个区域时,通常是正确的,但我们错过了很多存在于 PCB 上的缺失孔洞。要构建一个有效的缺陷检测系统,我们需要提高召回率。这个模型的低性能可能是由于在这个高分辨率的 PCB 图像上,缺陷很小,所以模型没有一个健康引脚的参考。
接下来,我们尝试将图像分割成四个或六个子图,具体取决于 PCB 的大小,并标记健康引脚和缺失孔洞。以下是生成的裁剪图像的示例。
我们训练了一个模型,使用了524张图片进行训练和106张图片进行测试。我们保持了与完整板模型使用的相同 PCB 板。裁剪后的健康引脚 vs. 缺失孔洞的结果如下表所示。
评估结果 | |||||
F1 分数 | 平均精度 | 整体召回率 | |||
0.967 | 0.989 | 0.945 | |||
训练时间 | 训练数据集 | 测试数据集 | |||
训练耗时 2.118 小时 | 2 个标签,524 张图片 | 2 个标签,106 张图片 | |||
每个标签的表现 | |||||
标签名称 | F1 分数 | 测试图片数 | 精度 | 召回率 | 假设阈值 |
missing_hole |
0.949 | 42 | 0.980 | 0.920 | 0.536 |
pin |
0.984 | 106 | 0.998 | 0.970 | 0.696 |
精确度和召回率均有显著提高。使用缩放裁剪图像和针对健康引脚模型的训练有助于改进模型。然而,召回率仍然为92%,意味着我们仍然会错过8%的缺失孔并让缺陷被忽视。
接下来,我们将尝试一种两阶段模型方法来进一步提高模型性能。
两阶段模型方法
对于两阶段模型,我们训练了两个模型:一个用于检测引脚,另一个用于检测裁剪图像中的引脚是否缺失。以下是引脚检测数据集中的一张图像。
这份数据与之前的实验类似,我们将 PCB 裁剪成四张或六张图像。这次,我们标记了所有引脚,并且不区分引脚是否有缺失孔。我们使用522张图像进行模型训练,使用108张图像进行测试,保持了与之前实验相同的训练/测试分组。结果如下表所示。
评估结果 | |||||
F1 得分 | 平均精确度 | 整体召回率 | |||
1.000 | 0.999 | 1.000 | |||
训练时间 | 训练数据集 | 测试数据集 | |||
训练时长:1.581 小时 | 1个标签,522张图像 | 1个标签,108张图像 | |||
每个标签的性能 | |||||
标签名称 | F1 得分 | 测试图像 | 精确度 | 召回率 | 假定阈值 |
引脚 |
1.000 | 108 | 0.999 | 1.000 | 0.617 |
该模型在这个合成数据集上完美地检测到了引脚。
接下来,我们构建用于区分缺失孔的模型。我们使用孔的裁剪图像来训练模型的第二阶段,如下例所示。这个模型与之前的模型是分开的,因为它是一个分类模型,而且专注于确定引脚是否有缺失孔的狭窄任务。
我们在16,624张图像上对这个二阶段模型进行训练,然后在3,266张图像上进行测试,保持了与之前实验相同的训练/测试分组。以下表格总结了我们的结果。
“`html
评估结果 | |||||
F1 分数 | 平均精确度 | 总体召回率 | |||
1.000 | 1.000 | 1.000 | |||
训练时间 | 训练数据集 | 测试数据集 | |||
训练耗时 6.660 小时 | 2 个标签,16,624 张图片 | 2 个标签,3,266 张图片 | |||
每个标签性能 | |||||
标签名 | F1 分数 | 测试图片数 | 精确度 | 召回率 | 假设阈值 |
异常状态 |
1.000 | 88 | 1.000 | 1.000 | 0.960 |
正常状态 |
1.000 | 3,178 | 1.000 | 1.000 | 0.996 |
再次,在这个合成数据集上我们得到了完美的精确度和召回率。通过将之前的引脚检测模型与这个第二阶段的漏洞分类模型相结合,我们可以构建一个胜过任何单阶段模型的模型。
下表总结了我们进行的实验。
实验 | 类型 | 描述 | F1 分数 | 精确度 | 召回率 |
1 | 单阶段模型 | 用于检测全图上的缺失孔洞的对象检测模型 | 0.468 | 0.75 | 0.34 |
2 | 单阶段模型 | 用于检测裁剪图像上的健康引脚和缺失孔洞的对象检测模型 | 0.967 | 0.989 | 0.945 |
3 | 两阶段模型 | 阶段 1:对所有引脚进行对象检测 | 1.000 | 0.999 | 1.000 |
阶段 2:健康引脚或缺失孔洞的图像分类 | 1.000 | 1.000 | 1.000 | ||
端到端平均 | 1.000 | 0.9995 | 1.000 |
“`
推理管道
您可以使用以下架构来部署我们在本文中描述的一级和二级模型。涉及以下主要组件:
- Amazon API Gateway
- AWS Lambda
- Amazon Rekognition自定义端点
对于一级模型,您可以将输入图像发送到API Gateway端点,然后经过Lambda进行任何基本图像预处理,并路由到Rekognition Custom Labels训练模型端点。在我们的实验中,我们探索了能够仅检测丢失孔和丢失孔以及健康引脚的一级模型。
对于二级模型,您可以类似地将图像发送到API Gateway端点,然后经过Lambda。Lambda充当一个协调者,首先调用物体检测模型(使用Rekognition Custom Labels训练),生成感兴趣区域。然后在Lambda函数中裁剪原始图像并将其发送到另一个Rekognition Custom Labels分类模型,以检测每个裁剪图像中的缺陷。
结论
在本文中,我们使用Rekognition Custom Labels训练了一级和二级模型来检测PCB中的丢失孔。我们报告了各种模型的结果;在我们的情况下,二级模型优于其他变体。我们鼓励具有其他领域的高分辨率图像的客户使用一级和二级模型测试模型性能。此外,考虑以下扩展解决方案的方式:
- 针对实际数据集使用滑动窗口裁剪
- 在同一管道中重复使用物体检测模型
- 使用边界框预测进行预标注工作流程