焊接缺陷检测数据集8876张存在数据增强处理yolo和voc两种标注方式10类标注数量Overlap: 173 — 重叠Spatter: 2491 — 飞溅Welding_line: 10738 — 焊接线Porosity: 4023 — 孔隙Undercut: 319 — 缺口Crack: 1434 — 裂纹Overfill: 494 — 过填Weld Bead Irregularity: 433 — 焊缝不规则Burn-through: 449 — 穿透Crater: 449 — 坑洞Image num: 8876焊接缺陷检测 YOLOv11一、数据集基础信息汇总焊接缺陷检测数据集总图片数量8876张已做数据增强标注格式YOLO‑txt、VOC‑xml双格式缺陷类别10类序号类别名称中文释义标注框数量0Overlap重叠1731Spatter飞溅24912Welding_line焊接线107383Porosity孔隙40234Undercut缺口(咬边)3195Crack裂纹14346Overfill过填(余高)4947Weld Bead Irregularity焊缝不规则4338Burn‑through烧穿/穿透4499Crater弧坑/坑洞449⚠️ 类别样本不均衡提醒Overlap、Undercut标注数量很少属于小样本缺陷训练时建议开启损失权重、马赛克增强、复制粘贴增强改善效果。二、数据集划分建议总样本8876 训练集(train)7101张 80% 验证集(val)888张 10% 测试集(test)887张 10%三、YOLO配置文件 weld_defect.yamlpath:./datasets/weld_defecttrain:images/trainval:images/valtest:images/testnames:0:Overlap1:Spatter2:Welding_line3:Porosity4:Undercut5:Crack6:Overfill7:Weld_Bead_Irregularity8:Burn-through9:Crater四、训练脚本 train_weld.pyYOLOv11fromultralyticsimportYOLO# 加载YOLOv11模型可选 n/s/m/l/xmodelYOLO(yolo11s.pt)resultsmodel.train(dataweld_defect.yaml,epochs100,imgsz640,batch12,device0,workers4,patience15,mosaic1.0,mixup0.1,copy_paste0.2,# 小样本缺陷增强缓解类别不均衡projectruns/train,nameweld_defect_yolo11)五、验证测试脚本 val_weld.pyfromultralyticsimportYOLO modelYOLO(./runs/train/weld_defect_yolo11/weights/best.pt)# 在测试集上评估metricsmodel.val(splittest)print(fmAP0.5:{metrics.box.map50:.3f})print(fmAP0.5:0.95:{metrics.box.map:.3f})六、预测推理脚本 predict_weld.pyfromultralyticsimportYOLO modelYOLO(./runs/train/weld_defect_yolo11/weights/best.pt)#图片检测resmodel.predict(sourceweld_test.jpg,saveTrue,conf0.4)#视频检测#res model.predict(sourceweld_video.mp4,saveTrue,conf0.4)#摄像头实时检测#res model.predict(source0,saveTrue,conf0.4)七、PyQt5 焊接缺陷可视化检测界面完整源码weld_gui.pyimportsysimportcv2fromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QPushButton,QLabel,QFileDialog,QTextEdit)fromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromultralyticsimportYOLO modelYOLO(./runs/train/weld_defect_yolo11/weights/best.pt)classDetThread(QThread):send_imgpyqtSignal(object)send_resultpyqtSignal(list)def__init__(self,source):super().__init__()self.sourcesource self.run_flagTruedefrun(self):capcv2.VideoCapture(self.source)whileself.run_flag:ret,framecap.read()ifnotret:breakresmodel(frame,conf0.4)boxesres[0].boxes det_info[]forboxinboxes:x1,y1,x2,y2map(int,box.xyxy[0])conffloat(box.conf[0])clsint(box.cls[0])det_info.append([x1,y1,x2,y2,conf,cls])cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(frame,f{model.names[cls]}{conf:.2f},(x1,y1-8),cv2.FONT_HERSHEY_SIMPLEX,0.45,(0,255,0),1)self.send_img.emit(frame)self.send_result.emit(det_info)cap.release()classWeldDetWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(基于YOLOv11焊接缺陷检测系统)self.resize(1250,820)self.init_ui()self.det_threadNonedefinit_ui(self):self.img_labelQLabel(self)self.img_label.setGeometry(20,60,780,650)self.img_label.setStyleSheet(border:1px solid #777;)self.btn_imgQPushButton(图片缺陷检测,self)self.btn_img.setGeometry(840,60,200,40)self.btn_img.clicked.connect(self.detect_image)self.btn_videoQPushButton(视频缺陷检测,self)self.btn_video.setGeometry(840,120,200,40)self.btn_video.clicked.connect(self.detect_video)self.btn_camQPushButton(摄像头实时检测,self)self.btn_cam.setGeometry(840,180,200,40)self.btn_cam.clicked.connect(self.detect_camera)self.result_textQTextEdit(self)self.result_text.setGeometry(840,250,340,450)self.result_text.setPlaceholderText(缺陷检测结果、坐标、置信度信息)defshow_frame(self,frame):rgbcv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,chrgb.shape bytes_per_linech*w q_imgQImage(rgb.data,w,h,bytes_per_line,QImage.Format_RGB888)self.img_label.setPixmap(QPixmap.fromImage(q_img).scaled(self.img_label.size(),Qt.KeepAspectRatio))defshow_result(self,det_list):self.result_text.clear()totallen(det_list)self.result_text.append(f检测缺陷总数{total}\n)foridx,iteminenumerate(det_list):x1,y1,x2,y2,conf,clsitem cls_namemodel.names[cls]self.result_text.append(f[{idx1}]缺陷:{cls_name}\n置信度:{conf:.2f}\nf位置:xmin{x1},ymin{y1},xmax{x2},ymax{y2}\n)defdetect_image(self):path,_QFileDialog.getOpenFileName(self,打开焊接图像,,Image(*.jpg *.png *.jpeg))ifnotpath:returnframecv2.imread(path)resmodel(frame,conf0.4)boxesres[0].boxes info[]forboxinboxes:x1,y1,x2,y2map(int,box.xyxy[0])conffloat(box.conf[0])clsint(box.cls[0])info.append([x1,y1,x2,y2,conf,cls])cv2.rectangle(frame,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(frame,f{model.names[cls]}{conf:.2f},(x1,y1-8),cv2.FONT_HERSHEY_SIMPLEX,0.45,(0,255,0),1)self.show_frame(frame)self.show_result(info)defdetect_video(self):path,_QFileDialog.getOpenFileName(self,打开焊接视频,,Video(*.mp4 *.avi))ifnotpath:returnself.det_threadDetThread(path)self.det_thread.send_img.connect(self.show_frame)self.det_thread.send_result.connect(self.show_result)self.det_thread.start()defdetect_camera(self):self.det_threadDetThread(0)self.det_thread.send_img.connect(self.show_frame)self.det_thread.send_result.connect(self.show_result)self.det_thread.start()if__name____main__:appQApplication(sys.argv)winWeldDetWindow()win.show()sys.exit(app.exec_())环境依赖pipinstallultralytics opencv-python pyqt5