基於深度學習的智慧PCB板缺陷檢測系統(Python+清新介面+資料集)

2023-03-22 06:01:52

摘要:智慧PCB板缺陷檢測系統用於智慧檢測工業印刷電路板(PCB)常見缺陷,自動化標註、記錄和儲存缺陷位置和型別,以輔助電路板的質檢。本文詳細介紹智慧PCB板缺陷檢測系統,在介紹演演算法原理的同時,給出Python的實現程式碼以及PyQt的UI介面和訓練資料集。在介面中可以選擇各種圖片、視訊進行檢測識別;可對影象中存在的多種缺陷進行識別分類,檢測速度快、識別精度高。博文提供了完整的Python程式碼和使用教學,適合新入門的朋友參考,完整程式碼資原始檔請轉至文末的下載連結。本博文目錄如下:

➷點選跳轉至文末所有涉及的完整程式碼檔案下載頁☇

完整程式碼下載:https://mbd.pub/o/bread/ZJaXlZhw

參考視訊演示:https://www.bilibili.com/video/av310992529/

離線依賴庫下載https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取碼:oy4n )


前言

        隨著社會的發展和工業產業的快速發展,工業電子產業隨之快速發展。其中PCB板是我們經常用到,但是PCB電路板經常會有一定的缺陷率。PCB電路板常見的缺陷檢測技術有自動光學檢測技術、計算機視覺檢測技術等。工廠車間操作人員需藉助電子顯微鏡或放大鏡,根據現場作業操作人員主觀經驗及視覺測量來確定PCB的合格率,這種傳統的檢測方式準確率低,缺陷檢測效率低,資料集合分析難度大。PCB板缺陷檢測機器視覺識別系統應運而生。

        基於深度學習的智慧PCB板缺陷檢測系統是近年來計算機視覺領域的研究熱點,同時也是目標檢測領域中的難點。其目的是識別和定點陣影象中存在的各種缺陷,在許多領域中都有廣泛的應用。本系統採用登入註冊進行使用者管理,對於圖片、視訊和攝像頭捕獲的實時畫面,系統可檢測PCB電路板,系統支援結果記錄、展示和儲存,每次檢測的結果記錄在表格中。對此這裡給出博主設計的介面,同款的簡約風,功能也可以滿足圖片、視訊和攝像頭的識別檢測,希望大家可以喜歡,初始介面如下圖:

        檢測類別時的介面截圖(點選圖片可放大)如下圖,可識別畫面中存在的多個類別,也可開啟攝像頭或視訊檢測:

         詳細的功能演示效果參見博主的B站視訊或下一節的動圖演示,覺得不錯的朋友敬請點贊、關注加收藏!系統UI介面的設計工作量較大,介面美化更需仔細雕琢,大家有任何建議或意見和可在下方評論交流。


1. 效果演示

        日常使用的軟體顏值非常重要,首先我們還是通過動圖看一下識別的效果,系統主要實現的功能是對圖片、視訊和攝像頭畫面中的線路進行識別,識別的結果視覺化顯示在介面和影象中,另外提供多個缺陷處的顯示選擇功能,演示效果如下。本系統介面上顯示的所有文字、圖示、圖片均可自行修改,修改方式可見上面的視訊介紹。

(一)系統介紹

        智慧PCB板缺陷檢測系統主要用於印刷電路板(PCB)缺陷的智慧檢測,利用相機採集的PCB影象,基於深度學習技術識別包括漏孔、鼠牙洞、毛刺等6種常見的缺陷型別,輸出缺陷處的標記框和對應類別,以輔助自動化PCB質量檢測;軟體提供登入註冊功能,可進行使用者管理;軟體能有效識別相機採集的圖片、視訊等檔案形式,檢測PCB表面缺陷情況,並記錄識別結果在介面表格中方便檢視;可開啟攝像頭實時監測和統計流水線上的PCB產品以檢測其缺陷,支援結果記錄、展示和儲存。

(二)主要特點

         (1)YOLOv5演演算法實現,模型一鍵切換更新;
         (2)攝像頭實時檢測PCB,展示、記錄和儲存缺陷情況;
         (3)檢測圖片、視訊等影象中的PCB缺陷;
         (4)支援使用者登入、註冊,檢測結果視覺化功能;
         (5)提供資料集和訓練程式碼可重新訓練;

(三)選擇圖片識別

        系統允許選擇圖片檔案進行識別,點選圖片選擇按鈕圖示選擇圖片後,顯示所有識別的結果,可通過下拉選框檢視單個結果,以便具體判斷某一特定目標。本功能的介面展示如下圖所示:

(四)視訊識別效果展示

        很多時候我們需要識別視訊中PCB板,這裡設計了視訊選擇功能。點選視訊按鈕可選擇待檢測的視訊,系統會自動解析視訊逐幀識別多個PCB板的缺陷,並將結果記錄在下方表格中,效果如下圖所示:

(五)攝像頭檢測效果展示
        在真實場景中,我們往往利用攝像頭獲取流水線的實時畫面,對PCB板進行實時識別,因此本文考慮到此項功能。如下圖所示,點選攝像頭按鈕後系統進入準備狀態,系統顯示實時畫面並開始檢測畫面中的PCB板,識別結果展示如下圖:


2. 基於YOLOv5的缺陷檢測

(一)PCB檢查方法

        電氣測試通常測量測試點之間的阻抗特性以檢測所有連續性(即開路和短路)。視覺測試通過視覺檢查電子元件的特性和印刷電路的特性來發現缺陷。在尋找短路或開路缺陷時,電氣測試更加準確。視覺測試可以更容易地檢測導體之間的缺陷,包括漏孔、開路、毛刺、鼠牙洞等。目視檢查通常在生產過程的早期進行。嘗試發現缺陷並修復它們,以確保最高的產品良率。

(1)人工目檢PCB板

        電氣測試通常測量測試點之間的阻抗特性以檢測所有連續性(即開路和短路)。視覺測試通過視覺檢查電子元件的特性和印刷電路的特性來發現缺陷。在尋找短路或開路缺陷時,電氣測試更加準確。視覺測試可以更容易地檢測導體之間的錯誤間隙。目視檢查通常在生產過程的早期進行。嘗試發現缺陷並修復它們,以確保最高的產品良率。

(2)PCB板子線上測試

        通過電氣效能測試識別製造缺陷並測試模擬、數位和混合訊號元件電路板檢測,以確保它們符合規範。有幾種測試方法,例如針床測試儀和飛針測試儀。主要優點是每塊板的測試成本低、強大的數位和功能測試能力、快速徹底的短開放測試、可程式化韌體、高缺陷覆蓋率和易於程式設計。主要缺點是需要測試夾具、程式設計和偵錯時間、夾具製造成本高、使用困難。

(3)深度學習檢測

        PCB板缺陷檢測識別系統通過YoloV5網路深度學習技術,對現場PCB是否存在缺陷部分進行實時分析檢測,當檢測到PCB本身存在缺陷的時候,立即抓拍存檔告警方便後期針對性的進行調整改。Yolo系列演演算法是一類典型的one-stage目標檢測演演算法,其利用anchor box將分類與目標定位的迴歸問題結合起來,從而做到了高效、靈活和泛化效能好,所以在工業界也十分受歡迎,接下來我們介紹本系統的Yolo系列演演算法。

(二)基於YOLOv5的缺陷識別系統

         YOLOv5的整體結構如下圖所示,和之前版本的Yolo類似,整個YoloV5可以依然可以分為三個部分,分別是Backbone,FPN以及Yolo Head。

         Backbone可以被稱作YoloV5的主幹特徵提取網路,根據它的結構以及之前Yolo主幹的叫法,我一般叫它CSPDarknet,輸入的圖片首先會在CSPDarknet裡面進行特徵提取,提取到的特徵可以被稱作特徵層,是輸入圖片的特徵集合。在主幹部分,我們獲取了三個特徵層進行下一步網路的構建,這三個特徵層我稱它為有效特徵層。

        FPN可以被稱作YoloV5的加強特徵提取網路,在主幹部分獲得的三個有效特徵層會在這一部分進行特徵融合,特徵融合的目的是結合不同尺度的特徵資訊。在FPN部分,已經獲得的有效特徵層被用於繼續提取特徵。在YoloV5裡依然使用到了Panet的結構,我們不僅會對特徵進行上取樣實現特徵融合,還會對特徵再次進行下取樣實現特徵融合。

        Yolo Head是YoloV5的分類器與迴歸器,通過CSPDarknet和FPN,我們已經可以獲得三個加強過的有效特徵層。每一個特徵層都有寬、高和通道數,此時我們可以將特徵圖看作一個又一個特徵點的集合,每一個特徵點都有通道數個特徵。Yolo Head實際上所做的工作就是對特徵點進行判斷,判斷特徵點是否有物體與其對應。與以前版本的Yolo一樣,YoloV5所用的解耦頭是一起的,也就是分類和迴歸在一個1X1折積裡實現。

        因此,整個YoloV5網路所作的工作就是 特徵提取-特徵加強-預測特徵點對應的物體情況。整個專案的實現步驟如下圖所示,首先需要設定好Python環境依賴,利用YOLOv5載入訓練資料集進行訓練,得到pt模型後用於UI介面中的PCB板缺陷檢測。

3. PCB板缺陷檢測識別

        PCB版缺陷檢測資料集的部分截圖如下所示,其中訓練集6975張圖片,驗證集1989張圖片、測試集包括997張圖片,共計9961張圖片構成。該資料集涵蓋漏孔、鼠牙洞、開路、短路、毛刺、雜銅等類別,所有缺陷處均新增標記框。

Chinese_name = {'missing_hole': "漏孔", 'mouse_bite': "鼠牙洞", 'open_circuit': "開路", 'short': "短路", 'spur': "毛刺",
                'spurious_copper': "雜銅"}

        資料集中各類標籤、圖片的情況如下圖所示,從柱狀圖的統計結果可以看出各類別樣本數目接近,釋出較均勻,適合用來進行訓練模型。

        然後我們可以執行train.py程式進行訓練。在深度學習中,我們通常通過損失函數下降的曲線來觀察模型訓練的情況。而YOLOv5訓練時主要包含三個方面的損失:矩形框損失(box_loss)、置信度損失(obj_loss)和分類損失(cls_loss),在訓練結束後,我們也可以在logs目錄下找到生成對若干訓練過程統計圖。下圖為博主訓練PCB板類識別的模型訓練曲線圖。

        一般我們會接觸到兩個指標,分別是召回率recall和精度precision,兩個指標p和r都是簡單地從一個角度來判斷模型的好壞,均是介於0到1之間的數值,其中接近於1表示模型的效能越好,接近於0表示模型的效能越差,為了綜合評價目標檢測的效能,一般採用均值平均密度map來進一步評估模型的好壞。我們通過設定不同的置信度的閾值,可以得到在模型在不同的閾值下所計算出的p值和r值,一般情況下,p值和r值是負相關的,繪製出來可以得到如下圖所示的曲線,其中曲線的面積我們稱AP,目標檢測模型中每種目標可計算出一個AP值,對所有的AP值求平均則可以得到模型的mAP值。

        以PR-curve為例,可以看到我們的模型在驗證集上的均值平均準確率為0.862。

        在訓練完成後得到最佳模型,接下來我們將幀影象輸入到這個網路進行預測,從而得到預測結果,預測方法(predict.py)部分的程式碼如下所示:

parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='./weights/pcb-best.pt',
                    help='model.pt path(s)')  # 模型路徑僅支援.pt檔案
parser.add_argument('--img-size', type=int, default=480, help='inference size (pixels)')  # 檢測影象大小,僅支援480
parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')  # 置信度閾值
parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')  # NMS閾值
# 選中執行機器的GPU或者cpu,有GPU則GPU,沒有則cpu,若想僅使用cpu,可以填cpu即可
parser.add_argument('--device', default='',
                    help='cuda device, i.e. 0 or 0,1,2,3 or cpu')
parser.add_argument('--save-dir', type=str, default='inference', help='directory to save results')  # 檔案儲存路徑
parser.add_argument('--classes', nargs='+', type=int,
                    help='filter by class: --class 0, or --class 0 2 3')  # 分開類別
parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')  # 使用NMS
opt = parser.parse_args()  # opt區域性變數,重要
out, weight, imgsz = opt.save_dir, opt.weights, opt.img_size  # 得到檔案儲存路徑,檔案權重路徑,影象尺寸
device = select_device(opt.device)  # 檢驗計算單元,gpu還是cpu
half = device.type != 'cpu'  # 如果使用gpu則進行半精度推理
 
model = attempt_load(weight, map_location=device)  # 讀取模型
imgsz = check_img_size(imgsz, s=model.stride.max())  # 檢查影象尺寸
if half:  # 如果是半精度推理
    model.half()  # 轉換模型的格式
names = model.module.names if hasattr(model, 'module') else model.names  # 得到模型訓練的類別名
 
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))]  # 給每個類別一個顏色
img = torch.zeros((1, 3, imgsz, imgsz), device=device)  # 建立一個影象進行預推理
_ = model(img.half() if half else img) if device.type != 'cpu' else None  # 預推理

        執行得到的結果如下圖所示,圖中PCB板缺陷的種類和置信度值都標註出來了,預測速度較快。基於此模型我們可以將其設計成一個帶有介面的系統,在介面上選擇圖片、視訊或攝像頭然後呼叫模型進行檢測。

        博主對整個系統進行了詳細測試,最終開發出一版流暢得到清新介面,就是博文演示部分的展示,完整的UI介面、測試圖片視訊、程式碼檔案,以及Python離線依賴包(方便安裝執行,也可自行設定環境),均已打包上傳,感興趣的朋友可以通過下載連結獲取。


下載連結

    若您想獲得博文中涉及的實現完整全部程式檔案(包括測試圖片、視訊,py, UI檔案等,如下圖),這裡已打包上傳至博主的麵包多平臺,見可參考部落格與視訊,已將所有涉及的檔案同時打包到裡面,點選即可執行,完整檔案截圖如下:

    在資料夾下的資源顯示如下,下面的連結中也給出了Python的離線依賴包,讀者可在正確安裝Anaconda和Pycharm軟體後,複製離線依賴包至專案目錄下進行安裝,離線依賴的使用詳細演示也可見本人B站視訊:win11從頭安裝軟體和設定環境執行深度學習專案Win10中使用pycharm和anaconda進行python環境設定教學

注意:該程式碼採用Pycharm+Python3.8開發,經過測試能成功執行,執行介面的主程式為runMain.py和LoginUI.py,測試圖片指令碼可執行testPicture.py,測試視訊指令碼可執行testVideo.py。為確保程式順利執行,請按照requirements.txt設定Python依賴包的版本。Python版本:3.8,請勿使用其他版本,詳見requirements.txt檔案;

完整資源中包含資料集及訓練程式碼,環境設定與介面中文字、圖片、logo等的修改方法請見視訊,專案完整檔案下載請見參考部落格文章裡面,或參考視訊的簡介處給出:➷➷➷

完整程式碼下載:https://mbd.pub/o/bread/ZJaXlZhw

參考視訊演示:https://www.bilibili.com/video/av310992529/

離線依賴庫下載https://pan.baidu.com/s/1hW9z9ofV1FRSezTSj59JSg?pwd=oy4n (提取碼:oy4n )


結束語

        由於博主能力有限,博文中提及的方法即使經過試驗,也難免會有疏漏之處。希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前。同時如果有更好的實現方法也請您不吝賜教。