印刷电路板(PCB)瑕疵识别

时间:2024-03-19 21:07:21

一点心路历程,供需要做瑕疵识别的同学参考。
PCB瑕疵识别是毕业设计的题目,要求能够定位印刷电路板上面的瑕疵位置和瑕疵类别。为了完成毕业设计,我们实验室同一级的6个小伙伴对这个印刷电路板瑕疵识别进行了一系列探索。

PCB数据集

现在几乎没有开源的PCB数据集,可以用于深度学习训练的PCB瑕疵数据集,所以我们实验室的wepon同学重点是制作了一个简单的PCB瑕疵数据集,包括拍摄PCB图像,瑕疵是PS的(因为工厂生产出来的很少有缺陷样本),标注数据集。需要注意的是:我们处理的PCB是裸板,也不是多层的。

你可以从这里下载数据集:http://robotics.pkusz.edu.cn/resources/dataset/

瑕疵包括六种:missing hole, mouse bite, open circuit, short, spur, spurious copper. 整个数据集有693张图片,一张图片上有3-5个瑕疵,并提供了相应的annotation_file。

数据集示例:
印刷电路板(PCB)瑕疵识别
数据集里的图片是上图这样的,分辨率比较高。而且数据集比较小,所以我进行了一系列的data augmentation操作,包括裁剪,改变亮度等。
印刷电路板(PCB)瑕疵识别
我实际跑实验的数据集如上图所示,600*600大小的图片,而且亮度也比原来的图片更高。

一点经验

  1. 刚开始做印刷电路板的瑕疵识别是在2018年的3月,那时候经过调研,知道了有传统方法,最简单的是拿标准图片和待测图片进行pixel to pixel的XOR操作,这样可以得到瑕疵的位置。至于瑕疵的分类,可以设计一系列的规则,如欧拉数,连通数等。
  2. 我当时毕业设计走的不是这条路,而是转化为了分类问题。因为当时采集的数据库,没有标注瑕疵。比如说一张有瑕疵的图,和标准图片对比,知道可能有瑕疵的位置,然后把这个瑕疵位置抠出来,然后分类问题就比较简单了,我用过SVM+BoW, 还用了一个简单的CNN网络去分类,效果还不错。但这不是一个end-to-end的,即得到瑕疵位置和瑕疵类别是分开进行的。真心塞。。。但起码还是顺利毕业了,并且没有打算再研究瑕疵检测问题。
  3. 至此为止,我能想到的创新点有:(1)在提取瑕疵位置阶段,你可以设计robust feature,或similarity metric 去判断标准图像和待测图像哪里不同,这个位置就是疑似瑕疵位置;(2)在瑕疵分类阶段:可以做的工作多了,在当时,将深度学习运用到工业瑕疵检测也算一个创新点,不过现在不行了。在这个阶段,你可以设计合适的网络将深度学习运用到瑕疵检测上,也可以设计更合理的feature提取规则。
  4. 天有不测风云,研究生入学一个月以后,boss又要求我们做PCB的瑕疵检测。
  5. 这个阶段我就开始思考,瑕疵检测是一个目标检测问题,即这个阶段我就开始思考,瑕疵检测是一个目标检测问题,即给定一张待检测PCB图片,要回归出瑕疵的位置和得到瑕疵的类别。这就是大火的目标检测问题呀。
  6. 于是我直接用Faster R-CNN去训练了一个模型,https://github.com/smallcorgi/Faster-RCNN_TF, 效果不好,就没一个能检测出来的;总结原因有:图片太大了,瑕疵又非常的小,Faster R-CNN又不适合检测小物体;原来拍数据集的时候,亮度太暗了等等;
  7. 接下来查资料,诶,发现FPN适用于多尺度检测问题,最后我也是采用这个解决方案。说一下我的流程吧:
    (1) 扩充数据集,最终的数据集有10668张,可训练的瑕疵有21664个。
    (2)设计合理的anchor;
    (3)不同尺度的特征融合,参考FPN;重点就是这个multi-scale feature fusion,提升小目标检测的关键;
    (4)一些策略吧:roi align,ohem, soft nms
    总结:设计合适的网络是关键,各种tricks都可以试一下,当然,数据集的质量也特别重要。
    放一些我检测PCB瑕疵的效果图:
    印刷电路板(PCB)瑕疵识别
    这是检测短路,是的,这是毕设时候P的瑕疵,好假。
    印刷电路板(PCB)瑕疵识别
    这是检测的断路。这是入学以后P的瑕疵了,同学P的瑕疵还可以。
    印刷电路板(PCB)瑕疵识别
    这是检测鼠咬,其中把P的那个圈圈也检测成missing_hole了,不过这种工业检测更担心的是漏检率,也就是recall。

总结

这个项目还是让我打下了一点目标检测的基础,好好学习。