說明
根據讀者反映,咱們的這個PCB素材設定的不對,應該是沒有漆,銅線等等,應該是黑白的。額,具體我也知道,但沒去過工廠,實在很難獲得這些素材。。。
是以就當是一次瑕疵識别的實踐,具體的資料集你可以自己定義。代碼在Github:
Source code : https://github.com/Ixiaohuihuihui/Tiny-Defect-Detection-for-PCB
一點心路曆程,供需要做瑕疵識别的同學參考。
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
My paper: https://digital-library.theiet.org/content/journals/10.1049/trit.2019.0019
一點經驗
- 剛開始做印刷電路闆的瑕疵識别是在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又不适合檢測小物體;原來拍資料集的時候,亮度太暗了等等;
- 深度學習從低層到高層不斷去提煉高層語義資訊,特征的深入,層數的增大,細節的資訊丢失得越來越多,對于缺陷檢測,細節是很重要的東西。 從這張特征可視化圖檔看到,随着提取特征層數的增加,電路闆的特征越來越模糊 。(還能利用這種特征檢測什麼?
基于深度學習的印刷電路闆瑕疵識别 - 這是一個底層視覺任務,輕語義資訊,重紋理資訊。
-
接下來查資料,發現FPN适用于多尺度檢測問題,最後我也是采用這個解決方案。說一下我的流程吧:
(1) 擴充資料集,最終的資料集有10668張,可訓練的瑕疵有21664個。
(2)設計合理的anchor;
(3)不同尺度的特征融合,參考FPN;重點就是這個multi-scale feature fusion,提升小目标檢測的關鍵;
(4)一些政策吧:roi align,ohem, soft nms
總結:設計合适的網絡是關鍵,各種tricks都可以試一下,當然,資料集的品質也特别重要。
放一些我檢測PCB瑕疵的效果圖:
這是檢測短路,是的,這是畢設時候P的瑕疵,好假。基于深度學習的印刷電路闆瑕疵識别 這是檢測的斷路。這是入學以後P的瑕疵了,同學P的瑕疵還可以。基于深度學習的印刷電路闆瑕疵識别 這是檢測鼠咬,其中把P的那個圈圈也檢測成missing_hole了,不過這種工業檢測更擔心的是漏檢率,也就是recall。基于深度學習的印刷電路闆瑕疵識别
總結
這個項目還是讓我打下了一點目标檢測的基礎,好好學習。