一、项目概述
本项目基于YOLOv11深度学习模型,实现了一套完整的PCB(印刷电路板)缺陷检测系统。系统能够自动识别PCB板上的6种常见缺陷类型,并提供可视化检测界面,可广泛应用于工业质量检测场景。
二、数据集说明
本项目使用DeepPCB数据集进行训练,该数据集专门针对PCB缺陷检测任务设计。数据集包含6种常见的PCB缺陷类型:
| 缺陷类型(英文) | 缺陷类型(中文) | 训练集数量 | 类别ID | 特征描述 |
| open | 开路 | 898 | 0 | 电路断开,导线不连续 |
| short | 短路 | 730 | 1 | 导线意外连接 |
| mousebite | 鼠咬 | 952 | 2 | 边缘不规则缺口 |
| spur | 毛刺 | 695 | 3 | 多余的金属突起 |
| copper | 残铜 | 718 | 4 | 不应存在的铜残留 |
| pin-hole | 针孔 | 695 | 5 | 铜层上的小孔 |
表2-1 数据集信息表
数据集统计信息:
- 总类别数:6种
- 训练集总样本数:约4,688个缺陷实例
- 图像尺寸:1024×1024像素(训练时使用高分辨率以保留小目标特征)
- 数据格式:YOLO格式标注
三、模型训练与参数优化
3.1 参数调整策略
针对PCB缺陷检测中的小目标识别难题,我对YOLOv11s模型进行了针对性的参数优化,在保证检测精度的同时将训练轮数控制在24轮以内:
核心优化策略:
高分辨率输入(imgsz=1024)
- 将输入尺寸从默认的640提升到1024,让小缺陷在特征图上有更多的像素表征
- 这是小目标检测最关键的优化点
数据增强参数调整
scale=0.9:减少图像缩放幅度,避免小目标被过度缩小而丢失mosaic=1.0:全程启用Mosaic增强,增加小目标的上下文信息close_mosaic=10:最后10轮关闭Mosaic,让模型适应真实图像分布copy_paste=0.1和mixup=0.1:通过复制粘贴和混合增强增加小目标样本多样性
快速收敛设置
- 使用预训练权重
yolo11s.pt,避免从零训练 batch=8:较大的批次加速收敛patience=0:关闭早停,确保训练24轮充分学习
- 使用预训练权重
3.2 训练结果对比
图3-1:各类别精确率-召回率曲线(优化版本)
图3-1展示了优化后模型的6种PCB缺陷检测性能曲线。每条曲线代表一种缺陷类型,曲线越靠近右上角表示性能越好。得益于1024分辨率输入和scale=0.9的优化设置,所有类别都达到了97%以上的检测精度,其中copper(残铜)达到99.4%,mousebite(鼠咬)达到99.1%。整体mAP@0.5达到98.7%,证明了小目标优化策略的有效性。
图3-2-图3-3:混淆矩阵对比(基础版 vs 优化版)
混淆矩阵对比分析:
通过图3-2和图3-3的对比,可以清晰看到小目标优化策略带来的性能提升:
1. 基础版本存在的问题(图3-2):
- pin-hole(针孔)识别困难:准确率仅0.91,是所有类别中表现最差的,有0.13的样本被误判为背景
- 背景误检率高:多个类别都有较高的背景混淆(0.08-0.31),说明640分辨率下小目标容易丢失
- mousebite(鼠咬)误检:有0.31的样本被误判为背景,是误检最严重的类别
- short(短路)准确率低:只有0.93,有0.11的背景误检
2. 优化版本的改进(图3-3):
- pin-hole准确率提升:从0.91提升到0.94,背景误检从0.13降至0.06(提升3%,误检减半)
- 背景误检率显著降低:所有类别的背景误检控制在0.03-0.23之间,整体降低约30-50%
- 对角线数值全面提升:所有类别识别准确率都达到0.94以上,其中copper达到0.98,表现最佳
- 类别混淆大幅减少:相似缺陷(如open和short)之间的混淆从0.03降至0.01
3. 性能数据对比:
| 指标 | 基础版本(640分辨率) | 优化版本(1024分辨率) | 提升幅度 |
| mAP@0.5 | 0.982 | 0.987 | +0.5% |
| mAP@0.5-95 | 0.700 | 0.806 | +10.6% |
| pin-hole准确率 | 0.972 | 0.985 | +1.3% |
| copper准确率 | 0.990 | 0.994 | +0.4% |
| 训练时长 | 4.3分钟 | 8.2分钟 | +3.9分钟 |
| 显存占用 | 2.9GB | 6.45GB | +3.55GB |
表3-1 性能数据表
4. 优化策略的核心作用:
- 1024高分辨率:让小目标在特征图上有更多的像素表征,是最关键的优化点
- scale=0.9:避免数据增强时过度缩小小目标(从默认0.5提升到0.9)
- copy_paste=0.1 + mixup=0.1:增加小目标样本的多样性,提升模型泛化能力
- close_mosaic=10:最后10轮关闭Mosaic增强,让模型适应真实图像分布
通过这些针对性的优化,虽然训练时长增加了约4分钟,但mAP@0.5-95提升了10.6%(从0.700到0.806),显著提升了小目标检测的精度,尤其是在IoU要求较高(0.5-0.95)的场景下表现更加出色。
图3-4:数据集标注分布统计
图3-4展示了训练数据集中缺陷目标的分布特征。从统计图可以看出,PCB缺陷普遍为小目标(宽高多在0.05-0.10范围内),且在图像中的位置相对分散。这正是我选择1024高分辨率输入和scale=0.9参数的原因——确保小目标在缩放后依然保留足够的特征信息。数据分布的分析结果直接指导了优化策略的制定。
图3-5:检测系统界面(初始状态)
图5展示了系统的初始界面。采用PyQt5搭建的三栏式布局,左侧为图像文件树,中间为原图与检测结果对比显示区(上下分屏),右侧为模型加载和参数配置面板。界面简洁直观,支持批量图像浏览和参数实时调整。
图3-6:实际检测结果展示
图3-6展示了系统加载优化模型后的实际检测效果。左侧显示已选中的测试图像,中间区域展示了原始PCB图像和检测结果的对比,模型成功检测出图像中的多个缺陷并用彩色边框标注。通过1024分辨率和数据增强策略的优化,模型能够准确识别PCB上的小目标缺陷,检测框定位精准,置信度信息清晰可见,满足工业应用的实时检测需求。
四、核心代码实现
4.1 模型推理预测器
# PCB缺陷检测可视化系统 - 模型预测器 class ModelPredictor: """YOLOv11模型预测器 - 用于PCB缺陷检测""" def __init__(self): self.model = None self.model_path = None self.class_names = [] self.en_to_zh_map = {} # 英文到中文映射 def load_model(self, model_path, model_info): """加载YOLOv11模型""" from ultralytics import YOLO self.model_path = model_path self._load_class_mapping() # 加载中文映射 try: # 使用ultralytics YOLO加载模型 self.model = YOLO(model_path) # 获取模型的类别名 if hasattr(self.model, 'names') and self.model.names: self.class_names = list(self.model.names.values()) except Exception as e: self.model = None raise RuntimeError(f"模型加载失败: {e}") def predict(self, image_path, params): """使用YOLO模型进行预测""" if self.model is None: raise RuntimeError("模型未加载") # 提取参数 img_scale = params.get('img_scale', 640) threshold = params.get('threshold', 0.25) iou_threshold = params.get('iou_threshold', 0.45) # 使用YOLO模型推理 results = self.model.predict( image_path, imgsz=img_scale, conf=threshold, iou=iou_threshold, verbose=False ) # 解析结果 detections = [] if results and len(results) > 0: result = results[0] if result.boxes is not None: boxes = result.boxes for i in range(len(boxes)): box = boxes.xyxy[i].cpu().numpy() conf = float(boxes.conf[i].cpu().numpy()) cls = int(boxes.cls[i].cpu().numpy()) x1, y1, x2, y2 = map(int, box) # 获取类别名(支持中英文) class_name_en = self.class_names[cls] class_name = self.en_to_zh_map.get(class_name_en, class_name_en) detections.append({ 'bbox': [x1, y1, x2, y2], 'class_id': cls, 'class_name': class_name, 'confidence': conf }) return detections代码说明:
load_model(): 加载训练好的YOLOv11模型,支持中英文类别名映射predict(): 执行推理,返回检测结果(边界框、类别、置信度)- 参数可配置:图像尺寸、置信度阈值、IoU阈值
- 支持GPU加速推理
4.2 检测结果可视化绘制
def draw_detections(self, img, detections, show_label=True): """在图像上绘制检测结果(支持中文标签)""" import cv2 from PIL import Image, ImageDraw, ImageFont # 转换为RGB用于PIL img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) pil_img = Image.fromarray(img_rgb) draw = ImageDraw.Draw(pil_img, 'RGBA') # 加载中文字体 try: font_path = "C:/Windows/Fonts/msyh.ttc" # 微软雅黑 font = ImageFont.truetype(font_path, 24) except: font = ImageFont.load_default() # 定义颜色列表(RGB格式) colors = [ (0, 0, 255), (0, 255, 0), (255, 0, 0), (0, 255, 255), (255, 0, 255), (255, 255, 0), (128, 0, 128), (255, 165, 0) ] for det in detections: x1, y1, x2, y2 = det['bbox'] class_id = det['class_id'] class_name = det['class_name'] confidence = det['confidence'] # 选择颜色 color = colors[class_id % len(colors)] # 绘制边界框 draw.rectangle([x1, y1, x2, y2], outline=color, width=3) # 绘制标签 if show_label: label = f"{class_name}: {confidence:.2f}" # 获取文本尺寸 bbox = draw.textbbox((0, 0), label, font=font) text_width = bbox[2] - bbox[0] text_height = bbox[3] - bbox[1] padding = 6 # 绘制半透明背景 bg_color = color + (180,) draw.rectangle( [x1, y1 - text_height - padding * 2, x1 + text_width + padding * 2, y1], fill=bg_color ) # 绘制白色文本(带黑色描边) text_pos = (x1 + padding, y1 - text_height - padding) # 黑色描边 for offset_x in [-1, 0, 1]: for offset_y in [-1, 0, 1]: if offset_x != 0 or offset_y != 0: draw.text( (text_pos[0] + offset_x, text_pos[1] + offset_y), label, font=font, fill=(0, 0, 0, 255) ) # 白色主体 draw.text(text_pos, label, font=font, fill=(255, 255, 255, 255)) return np.array(pil_img)代码说明:
- 使用PIL库绘制,支持中文标签显示
- 为每个类别分配不同颜色
- 绘制带描边的文本,增强可读性
- 添加半透明背景,避免标签与图像内容混淆
4.3 数据集配置文件
# PCB缺陷检测数据集配置 # DeepPCB Dataset for YOLOv11 # 数据集路径(相对于此配置文件) path: D:\DeepPCB-master\data train: images/train val: images/val # 类别数量 nc: 6 # 类别名称(英文) names: 0: open # 开路 1: short # 短路 2: mousebite # 鼠咬 3: spur # 毛刺 4: copper # 残铜 5: pin-hole # 针孔 # 类别中文名称(用于界面显示) names_zh: 0: 开路 1: 短路 2: 鼠咬 3: 毛刺 4: 残铜 5: 针孔五、技术特点与创新
- 高分辨率训练:使用1024×1024输入分辨率,有效检测PCB上的小目标缺陷
- 针对性数据增强:采用Mosaic、Copy-Paste、Mixup等多种增强策略,提升小目标检测能力
- 中英文双语支持:系统界面和检测结果均支持中文显示,提升用户体验
- 实时可视化界面:基于PyQt5开发的交互式界面,支持参数实时调整
- 高精度检测:mAP@0.5达到98.7%,各类别检测精度均衡
六、总结
本项目成功实现了基于YOLOv11的PCB缺陷检测系统,在DeepPCB数据集上取得了优异的检测性能。系统具有以下优势:
- 高精度:总体mAP达到98.7%,能够准确识别6种PCB缺陷
- 实时性:推理速度快,适合工业实时检测场景
- 易用性:提供友好的可视化界面,支持参数灵活配置
- 可扩展性:架构清晰,便于添加新的缺陷类型或集成到生产线
七、演示视频
YOLOv11小目标检测