☰
基于YOLOv11的小目标检测优化系统
2026/11/3 10:45:59 网站建设 项目流程

一、项目概述

本项目基于YOLOv11深度学习模型,实现了一套完整的PCB(印刷电路板)缺陷检测系统。系统能够自动识别PCB板上的6种常见缺陷类型,并提供可视化检测界面,可广泛应用于工业质量检测场景。

二、数据集说明

本项目使用DeepPCB数据集进行训练,该数据集专门针对PCB缺陷检测任务设计。数据集包含6种常见的PCB缺陷类型:

缺陷类型(英文)缺陷类型(中文)训练集数量类别ID特征描述
open开路8980电路断开,导线不连续
short短路7301导线意外连接
mousebite鼠咬9522边缘不规则缺口
spur毛刺6953多余的金属突起
copper残铜7184不应存在的铜残留
pin-hole针孔6955铜层上的小孔

表2-1 数据集信息表

数据集统计信息:

  • 总类别数:6种
  • 训练集总样本数:约4,688个缺陷实例
  • 图像尺寸:1024×1024像素(训练时使用高分辨率以保留小目标特征)
  • 数据格式:YOLO格式标注

三、模型训练与参数优化

3.1 参数调整策略

针对PCB缺陷检测中的小目标识别难题,我对YOLOv11s模型进行了针对性的参数优化,在保证检测精度的同时将训练轮数控制在24轮以内:

核心优化策略:

  1. 高分辨率输入(imgsz=1024)

    • 将输入尺寸从默认的640提升到1024,让小缺陷在特征图上有更多的像素表征
    • 这是小目标检测最关键的优化点
  2. 数据增强参数调整

    • scale=0.9:减少图像缩放幅度,避免小目标被过度缩小而丢失
    • mosaic=1.0:全程启用Mosaic增强,增加小目标的上下文信息
    • close_mosaic=10:最后10轮关闭Mosaic,让模型适应真实图像分布
    • copy_paste=0.1和mixup=0.1:通过复制粘贴和混合增强增加小目标样本多样性
  3. 快速收敛设置

    • 使用预训练权重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.50.9820.987+0.5%
mAP@0.5-950.7000.806+10.6%
pin-hole准确率0.9720.985+1.3%
copper准确率0.9900.994+0.4%
训练时长4.3分钟8.2分钟+3.9分钟
显存占用2.9GB6.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: 针孔

五、技术特点与创新

  1. 高分辨率训练:使用1024×1024输入分辨率,有效检测PCB上的小目标缺陷
  2. 针对性数据增强:采用Mosaic、Copy-Paste、Mixup等多种增强策略,提升小目标检测能力
  3. 中英文双语支持:系统界面和检测结果均支持中文显示,提升用户体验
  4. 实时可视化界面:基于PyQt5开发的交互式界面,支持参数实时调整
  5. 高精度检测:mAP@0.5达到98.7%,各类别检测精度均衡

六、总结

本项目成功实现了基于YOLOv11的PCB缺陷检测系统,在DeepPCB数据集上取得了优异的检测性能。系统具有以下优势:

  • 高精度:总体mAP达到98.7%,能够准确识别6种PCB缺陷
  • 实时性:推理速度快,适合工业实时检测场景
  • 易用性:提供友好的可视化界面,支持参数灵活配置
  • 可扩展性:架构清晰,便于添加新的缺陷类型或集成到生产线

七、演示视频

YOLOv11小目标检测

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询