全套項(xiàng)目文檔(YOLOv11n + PyQt5可視化界面)YOLO模型如何訓(xùn)練x光PCB板缺陷檢測(cè)數(shù)據(jù)集)
X光PCB缺陷檢測(cè)全套項(xiàng)目文檔YOLOv11n PyQt5可視化界面一、數(shù)據(jù)集完整參數(shù)統(tǒng)計(jì)表項(xiàng)目參數(shù)詳細(xì)信息數(shù)據(jù)集名稱X光PCB電路板缺陷檢測(cè)數(shù)據(jù)集總圖像數(shù)量5955張單圖尺寸640×640數(shù)據(jù)劃分訓(xùn)練集4170張驗(yàn)證集1192張測(cè)試集593張標(biāo)注格式Y(jié)OLO(txt)、VOC(xml)、COCO(json) 三格式全覆蓋缺陷總類別7類PCB工藝/元器件缺陷7類缺陷樣本標(biāo)注數(shù)量明細(xì)類別序號(hào)英文類別名中文名稱含該缺陷圖片數(shù)缺陷標(biāo)注框總數(shù)0Damaged components元器件損壞406884641Pin short circuit引腳短路288460352Miscellaneous tin雜錫2492633Missing components元器件缺失5284358644Chip scratches芯片劃痕304146335Substrate scratches基板劃痕368068226Solder joint burrs焊點(diǎn)毛刺251258數(shù)據(jù)集特點(diǎn)樣本不均衡元器件缺失樣本最多雜錫、焊點(diǎn)毛刺屬于小樣本缺陷X光透視成像可檢測(cè)電路板內(nèi)部隱藏缺陷肉眼可見光無(wú)法識(shí)別三種標(biāo)注格式可自由轉(zhuǎn)換適配各類檢測(cè)框架圖像統(tǒng)一裁剪640×640無(wú)需預(yù)處理縮放直接適配YOLO輸入尺寸。二、運(yùn)行環(huán)境配置環(huán)境版本清單Python3.8深度學(xué)習(xí)框架torch、torchvision圖像處理opencv-pythonUI界面PyQt5檢測(cè)框架ultralytics(YOLOv11)系統(tǒng)兼容Windows / Linux 雙系統(tǒng)通用一鍵安裝依賴命令pipinstalltorch1.11.0torchvision0.12.0 ultralytics opencv-python PyQt5 numpy pillow三、項(xiàng)目文件整體目錄結(jié)構(gòu)PCB_Xray_Detect/ ├── dataset/ # 完整數(shù)據(jù)集 │ ├── images/ │ │ ├── train/ # 訓(xùn)練圖片 │ │ ├── val/ # 驗(yàn)證圖片 │ │ └── test/ # 測(cè)試圖片 │ ├── labels/ │ │ ├── train/ # YOLO txt標(biāo)注 │ │ ├── val/ │ │ └── test/ │ ├── voc_annotations/ # VOC xml標(biāo)注文件 │ ├── coco_annotations/ # COCO json標(biāo)注文件 │ └── pcb_defect.yaml # YOLO數(shù)據(jù)集配置文件 ├── weights/ │ └── best.pt # 訓(xùn)練80輪后最優(yōu)權(quán)重 ├── train.py # 模型訓(xùn)練源碼 ├── test_eval.py # 模型測(cè)試精度評(píng)估源碼 ├── ui/ │ ├── main.ui # Qt界面設(shè)計(jì)文件 │ ├── resource.qrc # 圖標(biāo)資源文件 │ ├── resource_rc.py # qrc編譯后的python資源文件 │ └── icons/ # 界面圖標(biāo)素材 ├── pcb_gui.py # PyQt5主界面運(yùn)行源碼 └── 使用說(shuō)明文檔.md四、數(shù)據(jù)集yaml配置文件pcb_defect.yamlpath:./datasettrain:images/trainval:images/valtest:images/testnc:7names:0:Damaged components1:Pin short circuit2:Miscellaneous tin3:Missing components4:Chip scratches5:Substrate scratches6:Solder joint burrs五、訓(xùn)練代碼 train.pyfromultralyticsimportYOLO# 加載YOLOv11n輕量化網(wǎng)絡(luò)modelYOLO(yolov11n.yaml)# 訓(xùn)練參數(shù)設(shè)置train_resultmodel.train(data./dataset/pcb_defect.yaml,epochs80,imgsz640,batch16,device0,# 有GPU填0無(wú)GPU改為cpuworkers4,patience12,iou0.45,conf0.25,mosaic0.8,mixup0.1,saveTrue,projectPCB_Xray_Result,nameyolov11n_80epoch)print(訓(xùn)練結(jié)束最優(yōu)權(quán)重保存在 runs/PCB_Xray_Result/yolov11n_80epoch/weights/best.pt)六、測(cè)試評(píng)估代碼 test_eval.pyfromultralyticsimportYOLO# 載入訓(xùn)練完成的最優(yōu)權(quán)重modelYOLO(./weights/best.pt)# 驗(yàn)證集精度計(jì)算metricsmodel.val(data./dataset/pcb_defect.yaml,imgsz640,conf0.25,iou0.45)# 打印核心精度指標(biāo)print(fmAP0.5:{metrics.box.map50:.4f})print(fPrecision:{metrics.box.p:.4f})print(fRecall:{metrics.box.r:.4f})# 單張圖片測(cè)試推理model.predict(source./dataset/images/test,saveTrue,save_txtTrue,save_confTrue)print(測(cè)試圖片推理完成結(jié)果已保存)七、PyQt5可視化界面全套源碼1、資源文件編譯說(shuō)明resource.qrc 存放圖標(biāo)使用命令編譯pyrcc5 resource.qrc-oresource_rc.py2、主界面運(yùn)行代碼 pcb_gui.pyimportsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QFileDialog,QMessageBox)fromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QTimerfromultralyticsimportYOLOfromuiimportUi_MainWindowimportresource_rcclassPCB_Detect_Window(QMainWindow,Ui_MainWindow):def__init__(self):super().__init__()self.setupUi(self)# 加載訓(xùn)練好的PCB缺陷模型self.modelYOLO(./weights/best.pt)self.capNoneself.timerQTimer()self.timer.timeout.connect(self.camera_frame)self.save_result_list[]# 按鈕綁定事件self.btn_img.clicked.connect(self.image_detect)self.btn_video.clicked.connect(self.video_detect)self.btn_camera.clicked.connect(self.camera_open)self.btn_save.clicked.connect(self.save_all_result)self.btn_exit.clicked.connect(self.close)# 圖片檢測(cè)defimage_detect(self):file_path,_QFileDialog.getOpenFileName(self,選擇X光PCB圖片,,圖片文件(*.jpg *.png *.jpeg))ifnotfile_path:returnresultsself.model(file_path,conf0.3)self.show_result(results[0])# 視頻檢測(cè)defvideo_detect(self):video_path,_QFileDialog.getOpenFileName(self,選擇視頻文件,,視頻(*.mp4 *.avi))ifnotvideo_path:returnself.capcv2.VideoCapture(video_path)self.timer.start(30)# 攝像頭實(shí)時(shí)檢測(cè)defcamera_open(self):ifself.timer.isActive():self.timer.stop()self.cap.release()returnself.capcv2.VideoCapture(0)self.timer.start(30)# 讀取畫面幀推理defcamera_frame(self):ret,frameself.cap.read()ifnotret:self.timer.stop()returnresultsself.model(frame,conf0.3)self.show_result(results[0])# 渲染檢測(cè)畫面數(shù)據(jù)展示defshow_result(self,res):imgres.plot()h,w,cimg.shape bytes_per_linec*w q_imgQImage(img.data,w,h,bytes_per_line,QImage.Format_RGB888).rgbSwapped()self.label_display.setPixmap(QPixmap.fromImage(q_img).scaled(self.label_display.size(),Qt.KeepAspectRatio))# 統(tǒng)計(jì)缺陷總數(shù)、坐標(biāo)、置信度boxesres.boxes total_numlen(boxes)self.label_total.setText(f缺陷總數(shù)量{total_num})self.table_result.setRowCount(total_num)self.save_result_list.clear()foridx,boxinenumerate(boxes):cls_idxint(box.cls)cls_nameself.model.names[cls_idx]conffloat(box.conf)x1,y1,x2,y2map(int,box.xyxy[0])self.save_result_list.append([cls_name,round(conf,3),x1,y1,x2,y2])self.table_result.setItem(idx,0,QtWidgets.QTableWidgetItem(str(idx1)))self.table_result.setItem(idx,1,QtWidgets.QTableWidgetItem(cls_name))self.table_result.setItem(idx,2,QtWidgets.QTableWidgetItem(f{conf:.2f}))self.table_result.setItem(idx,3,QtWidgets.QTableWidgetItem(f({x1},{y1})-({x2},{y2})))# 導(dǎo)出檢測(cè)結(jié)果defsave_all_result(self):iflen(self.save_result_list)0:QMessageBox.information(self,提示,暫無(wú)檢測(cè)數(shù)據(jù))returnsave_path,_QFileDialog.getSaveFileName(self,保存檢測(cè)報(bào)告,pcb缺陷檢測(cè)結(jié)果.txt,txt文件(*.txt))withopen(save_path,w,encodingutf-8)asf:f.write(序號(hào)\t缺陷類型\t置信度\t坐標(biāo)x1,y1,x2,y2\n)forlineinself.save_result_list:f.write(f{line[0]}\t{line[1]}\t{line[2]},{line[3]},{line[4]},{line[5]}\n)QMessageBox.information(self,完成,檢測(cè)結(jié)果保存成功)if__name____main__:appQApplication(sys.argv)windowPCB_Detect_Window()window.show()sys.exit(app.exec_())八、UI界面功能詳情核心功能圖片檢測(cè)本地單張X光PCB圖片導(dǎo)入推理繪制缺陷框視頻檢測(cè)PCB巡檢視頻逐幀識(shí)別缺陷攝像頭實(shí)時(shí)檢測(cè)外接工業(yè)相機(jī)在線實(shí)時(shí)X光PCB檢測(cè)數(shù)據(jù)實(shí)時(shí)展示缺陷總數(shù)量每類缺陷置信度缺陷框像素坐標(biāo)(xmin,ymin,xmax,ymax)結(jié)果導(dǎo)出txt文檔批量保存全部檢測(cè)記錄啟停切換一鍵關(guān)閉攝像頭/視頻流九、運(yùn)行操作步驟Windows系統(tǒng)安裝Python3.8配置環(huán)境變量執(zhí)行依賴安裝命令解壓完整項(xiàng)目文件夾確保路徑無(wú)中文運(yùn)行訓(xùn)練python train.py80輪訓(xùn)練完成后自動(dòng)生成best.pt權(quán)重啟動(dòng)可視化界面python pcb_gui.py選擇圖片/視頻/攝像頭進(jìn)行缺陷檢測(cè)可導(dǎo)出檢測(cè)報(bào)表Linux系統(tǒng)搭建python3.8虛擬環(huán)境pip安裝依賴包賦予文件執(zhí)行權(quán)限訓(xùn)練、界面啟動(dòng)命令和Windows一致十、補(bǔ)充說(shuō)明針對(duì)雜錫、焊點(diǎn)毛刺小樣本缺陷可通過復(fù)制增強(qiáng)、自適應(yīng)縮放提升召回率模型推理速度快適配工業(yè)PCB產(chǎn)線在線質(zhì)檢場(chǎng)景界面無(wú)需輸入命令行純鼠標(biāo)可視化操作訓(xùn)練完成后可導(dǎo)出ONNX模型部署嵌入式工業(yè)設(shè)備。