基於深度學習的印刷電路板瑕疵識別

說明

根據讀者反映,咱們的這個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

一點經驗

  1. 剛開始做印刷電路板的瑕疵識別是在2018年的3月,那時候經過調研,知道了有傳統方法,最簡單的是拿標準圖片和待測圖片進行pixel to pixel的XOR操作,這樣可以得到瑕疵的位置。至於瑕疵的分類,可以設計一系列的規則,如歐拉數,連通數等。
  2. 我當時畢業設計走的不是這條路,而是轉化爲了分類問題。因爲當時採集的數據庫,沒有標註瑕疵。比如說一張有瑕疵的圖,和標準圖片對比,知道可能有瑕疵的位置,然後把這個瑕疵位置摳出來,然後分類問題就比較簡單了,我用過SVM+BoW, 還用了一個簡單的CNN網絡去分類,效果還不錯。但這不是一個end-to-end的,即得到瑕疵位置和瑕疵類別是分開進行的。真心塞。。。但起碼還是順利畢業了,並且沒有打算再研究瑕疵檢測問題。
  3. 至此爲止,我能想到的創新點有:(1)在提取瑕疵位置階段,你可以設計robust feature,或similarity metric 去判斷標準圖像和待測圖像哪裏不同,這個位置就是疑似瑕疵位置;(2)在瑕疵分類階段:可以做的工作多了,在當時,將深度學習運用到工業瑕疵檢測也算一個創新點,不過現在不行了。在這個階段,你可以設計合適的網絡將深度學習運用到瑕疵檢測上,也可以設計更合理的feature提取規則。
  4. 爲什麼要用deep learning? 弱語義信息不代表沒有語義信息;PCB多種多樣,傳統方法不能適應所有的規則。
  5. 天有不測風雲,研究生入學一個月以後,boss又要求我們做PCB的瑕疵檢測。
  6. 這個階段我就開始思考,瑕疵檢測是一個目標檢測問題,即給定一張待檢測PCB圖片,要回歸出瑕疵的位置和得到瑕疵的類別。這就是大火的目標檢測問題呀。
  7. 於是我直接用Faster R-CNN去訓練了一個模型,https://github.com/smallcorgi/Faster-RCNN_TF, 效果不好,就沒一個能檢測出來的;總結原因有:圖片太大了,瑕疵又非常的小,Faster R-CNN又不適合檢測小物體;原來拍數據集的時候,亮度太暗了等等;
  8. 深度學習從低層到高層不斷去提煉高層語義信息,特徵的深入,層數的增大,細節的信息丟失得越來越多,對於缺陷檢測,細節是很重要的東西。 在這裏插入圖片描述
    從這張特徵可視化圖片看到,隨着提取特徵層數的增加,電路板的特徵越來越模糊 。(還能利用這種特徵檢測什麼?
  9. 這是一個底層視覺任務,輕語義信息,重紋理信息。
  10. 接下來查資料,發現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。

總結

這個項目還是讓我打下了一點目標檢測的基礎,好好學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章