class="markdown_views prism-dracula">
一点心路历程,供需要做瑕疵识别的同学参考。
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。
数据集示例:
数据集里的图片是上图这样的,分辨率比较高。而且数据集比较小,所以我进行了一系列的data augmentation操作,包括裁剪,改变亮度等。
我实际跑实验的数据集如上图所示,600*600大小的图片,而且亮度也比原来的图片更高。
Source code :
https://github.com/Ixiaohuihuihui/Tiny-Defect-Detection-for-PCB
一点经验
- 刚开始做印刷电路板的瑕疵识别是在2018年的3月,那时候经过调研,知道了有传统方法,最简单的是拿标准图片和待测图片进行pixel to pixel的XOR操作,这样可以得到瑕疵的位置。至于瑕疵的分类,可以设计一系列的规则,如欧拉数,连通数等。
- 我当时毕业设计走的不是这条路,而是转化为了分类问题。因为当时采集的数据库,没有标注瑕疵。比如说一张有瑕疵的图,和标准图片对比,知道可能有瑕疵的位置,然后把这个瑕疵位置抠出来,然后分类问题就比较简单了,我用过SVM+BoW, 还用了一个简单的CNN网络去分类,效果还不错。但这不是一个end-to-end的,即得到瑕疵位置和瑕疵类别是分开进行的。真心塞。。。但起码还是顺利毕业了,并且没有打算再研究瑕疵检测问题。
- 至此为止,我能想到的创新点有:(1)在提取瑕疵位置阶段,你可以设计robust feature,或similarity metric 去判断标准图像和待测图像哪里不同,这个位置就是疑似瑕疵位置;(2)在瑕疵分类阶段:可以做的工作多了,在当时,将深度学习运用到工业瑕疵检测也算一个创新点,不过现在不行了。在这个阶段,你可以设计合适的网络将深度学习运用到瑕疵检测上,也可以设计更合理的feature提取规则。
- 为什么要用deep learning? 弱语义信息不代表没有语义信息;PCB多种多样,传统方法不能适应所有的规则。
- 天有不测风云,研究生入学一个月以后,boss又要求我们做PCB的瑕疵检测。
- 这个阶段我就开始思考,瑕疵检测是一个目标检测问题,即给定一张待检测PCB图片,要回归出瑕疵的位置和得到瑕疵的类别。这就是大火的目标检测问题呀。
- 于是我直接用Faster R-CNN去训练了一个模型,https://github.com/smallcorgi/Faster-RCNN_TF, 效果不好,就没一个能检测出来的;总结原因有:图片太大了,瑕疵又非常的小,Faster R-CNN又不适合检测小物体;原来拍数据集的时候,亮度太暗了等等;
- 深度学习从低层到高层不断去提炼高层语义信息,特征的深入,层数的增大,细节的信息丢失得越来越多,对于缺陷检测,细节是很重要的东西。
从这张特征可视化图片看到,随着提取特征层数的增加,电路板的特征越来越模糊 。(还能利用这种特征检测什么