异常检测:PCB零件损坏/缺失
在这个项目中 我们需要检测以下工件是否正确的组装:PCB板上是否有安装2个电容。

分析图片后,我们第一反应可能会想要使用异常检测模型:因为我们的应用是寻找PCB板上的异常、缺陷。
这里我们比较三种模型:异常检测模型、语义分割模型和目标检测模型。
提示
目标检测模型也是可以用作检测缺陷和异常的,异常部分就是目标检测模型的 "目标" 。
异常检测模型,通常用于检测物体的异常和缺陷。

v1 : 对于异常检测模型,我们第一个版本的模型没有使用任何预处理和数据加强。一共124张图像,78图像作为训练集。
测试结果如下:

异常检测模型过多的把物体表面的区域识别成缺陷,造成这个结果的原因是:PCB板的背景和其他零部件造成了不少的干预。相对于正常的工件,模型检测出很多区域,跟没有缺陷的图像有区别,所以定义该区域为缺陷。

v2 : 第二版本的模型添加了ROI预处理,把大部分的背景去除掉,只留下PCB板本体,没有数据加强。同样的124张图像,78图像作为训练集。
测试结果如下:

异常检测模型仍然把PCB板表面和电容相似的区域识别成缺陷,造成这个结果的原因是:PCB板上的轮廓和图像比较复杂。相对于正常的工件,模型检测出很多区域,跟没有缺陷的图像有区别,所以定义该区域为缺陷。

v3 : 第三版本的模型添加了ROI预处理,并且图像只扣出电容部分,没有数据加强。一共124张图像,78图像作为训练集。
训练图像如下:

测试结果如下:

v3 模型的识别效果总体来说会比前面的 v1 和 v2 好,但是还是能看到异常检测的局限性。同样是容易受到背景的影响,和PCB板上其他部件的影响。
异常检测的局限性
对于异常检测模型的应用,此模型适合于检测单个目标的表观缺陷,尽量只包含要检测的目标,避免其他目标的变化造成干扰,也会被检测为异常。并且模型会在后台将所有数据缩小到256 x 256,在原始异常缺陷比较小的情况下,进一步缩小,模型更加检测不出来。
语义分割模型,通常用于检测物体多种类别的缺陷和分割。语义模型是否能够克服异常检测模型的不足?
提示
语义分割模型是逐像素预测,意味着模型对于背景或者其他目标的干扰会比较少。

v4 : 第四版本为语义分割模型添加了调整图像大小预处理,没有数据加强。一共124张图像,86图像作为训练集。
测试结果如下:

语义分割模型很好的找出异常区域,成功克服了背景和PCB板上的干扰,达成了我们的需求。
目标检测模型,可以把异常标注为我们需要的目标,从而让模型寻找是否存在异常,并且能够统计异常的数量。
警告
使用目标检测模型来用于异常检测,通常异常的形状比较规则(方形或者像本案例:圆形),不需要识别出分割的区域,否则还是需要使用语义分割模型。
对于此案例,目标检测模型相对于语义分割模型的优点在于:
目标相对简单,不需要识别异常的分割形状;
目标检测不是逐像素检测,可以使用更少的数据获得相似的效果。

v5 : 第四版本为目标检测模型添加了调整图像大小预处理,没有数据加强。一共22张图像,15图像作为训练集。
测试结果如下:

目标检测模型很好的找出异常区域,成功克服了背景和PCB板上的干扰,达成了我们的需求。更关键的是,只需要语义分割模型的1/5的数据,却能跟语义分割模型的效果媲美。
总结
由此可以给出结论:在不增加额外需求的前提下,这个项目应用上,目标检测是最适合这个应用的模型。但是,如果在项目持续发展的时间线下,此PCB板上将来会有新的检测需求,而且新的检测目标为不规则的分割区域:那么选择语义分割模型的话能够更好的兼容将来可能出现的需求。最后,异常检测模型在这种干扰较多的物体上,并不能获得很好的检测结果。