ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PCB元器件检测数据集:34类YOLO格式,小目标密集场景开箱即用

PCB元器件检测数据集:34类YOLO格式,小目标密集场景开箱即用 简介这是一份面向电路板元器件检测任务的YOLO格式数据集适合从事工业质检、PCB缺陷识别及小目标密集检测的算法工程师与研究者使用。数据按YOLOv5目录结构组织可直接投入训练与验证覆盖保险丝、散热片、IC、电感器、晶体管、电容器等34类元器件类别定义由classes文件统一给出。压缩包共约2000个文件以1660个txt标注文件、339张jpg图像和1个可视化py脚本为主整体约63.56MB训练集约1500张、验证集约80张、测试集约40张划分清晰。配套脚本可随机读取一张图片并绘制边界框无需修改即可运行便于快速核查标注质量与类别分布。目前已有834人学习下载适合需要现成数据快速验证模型、开展小目标与密集检测实验的读者参考使用。1. 电路板元器件检测数据集34 类小目标密集场景开箱即用的 YOLO 格式手里有一批 PCB 板子照片想训一个能认出保险丝、散热片、IC、电感、晶体管、电容器的检测模型最耗时的往往不是调网络而是从零标几千张图。这份资源直接给了一套已经划分好的 YOLO 数据集34 个元器件类别训练集约 1500 张、验证集约 80 张、测试集约 40 张图片和同名 txt 标签一一对应目录结构按 YOLOv5 的规范摆放解压就能挂到训练脚本上。它还附了一个可视化 py 文件随机传一张图进去就能把边界框画出来存到当前目录脚本不用改。对做小目标检测、密集检测的人来说这类板级元器件正好是天然的密集小目标场景——元件挨得近、尺寸差异大、背景纹理杂拿来验证模型在密集排布下的召回能力很合适。下面按「数据长什么样 → 怎么接进训练 → 坑在哪 → 怎么验证」走一遍。2. 拆开数据集目录结构、标签格式与 34 类分布2.1 YOLOv5 目录约定与文件对应关系这份数据按 YOLOv5 的标准布局组织核心是 images 和 labels 两个平行目录训练/验证/测试各一套。图片是 jpg标签是同名的 txt文件名主体一致、只换扩展名这是 YOLO 系列读取标签的硬约定——它不靠索引文件而是拿图片路径把后缀替换成 .txt 去找标签。所以任何一张图缺了同名 txt训练时要么报错要么被静默跳过这点后面避坑章会细说。典型结构长这样pcb_dataset/ ├── images/ │ ├── train/ # 约 1500 张 jpg │ ├── val/ # 约 80 张 jpg │ └── test/ # 约 40 张 jpg ├── labels/ │ ├── train/ # 与 train 图片同名的 txt │ ├── val/ │ └── test/ └── classes.txt # 34 类名称按行排列classes.txt是类别的黑匣子行号就是类别索引第 0 行对应标签里的 class_id 0以此类推到 33。改类别顺序等于改标签语义千万别随手重排。2.2 标签格式归一化中心点加宽高每行标签是一个目标格式为class_id x_center y_center width height后四个都是相对整图宽高的归一化值范围 0 到 1。举例一张 640×480 的图里有个 IC框左上角 (100, 80)、右下角 (260, 200)换算后中心点是 ((100260)/2/640, (80200)/2/480) (0.281, 0.292)宽高是 (160/640, 120/480) (0.25, 0.25)那行就是2 0.281 0.292 0.25 0.25假设 IC 是第 2 类。这种归一化写法的好处是图片缩放、letterbox 填充后标签不用重算训练时按当前输入尺寸反算即可。代价是人工核对时不好直接读所以可视化脚本才重要。2.3 34 类的分布特点与检测难点34 类覆盖保险丝、散热片、IC、电感器、晶体管、电容器等常见板级元件。这类数据的分布有几个共性一是长尾明显电容器、电阻这类数量多散热片、特定 IC 数量少二是尺寸跨度大大散热片可能占图 1/4小电容只有几十像素三是密集同一区域可能并排十几个同类元件。这三点直接决定了训练策略小目标要靠更高输入分辨率或多尺度特征密集要靠合适的 NMS 阈值和 anchor 匹配长尾要靠类别权重或重采样。数据集本身不解决这些但它把「标注」这一最贵的环节省掉了让你能把精力放在模型侧。2.4 用可视化脚本先做一次数据体检拿到数据别急着训先跑可视化确认标签没错位。资源里的 py 脚本随机取一张图绘制边界框并保存到当前目录逻辑大致是读图、读同名 txt、按归一化坐标反算像素框、画矩形和类别名、写回文件。核心片段如下import cv2, os, random def draw_one(img_path, label_path, classes): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path) as f: for line in f: cid, xc, yc, bw, bh line.split() cid int(cid) # 归一化中心点宽高 反算 像素左上右下 x1 int((float(xc) - float(bw) / 2) * w) y1 int((float(yc) - float(bh) / 2) * h) x2 int((float(xc) float(bw) / 2) * w) y2 int((float(yc) float(bh) / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, classes[cid], (x1, max(y1 - 5, 10)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(vis_ os.path.basename(img_path), img) classes [l.strip() for l in open(classes.txt)] img_path random.choice([os.path.join(images/train, f) for f in os.listdir(images/train)]) draw_one(img_path, img_path.replace(images, labels).replace(.jpg, .txt), classes)参数说明classes从 classes.txt 读入顺序必须和标签里的 class_id 对齐img_path.replace是图片路径到标签路径的映射靠的就是同名约定。跑几张不同图重点看框有没有整体偏移、类别名对不对、有没有框跑到图外。框整体偏移通常是宽高和中心点顺序写反了框跑到图外多半是归一化时除了错的基准尺寸。3. 接进 YOLOv5/v8 训练data.yaml、超参与小目标参数3.1 写对 data.yaml 是第一步YOLO 训练靠一个 yaml 描述数据位置和类别。这份数据要写三个路径加类别名路径用绝对路径最稳相对路径容易因为工作目录不同而找不到path: /abs/path/pcb_dataset train: images/train val: images/val test: images/test nc: 34 names: [fuse, heatsink, ic, inductor, transistor, capacitor, ...]nc必须等于 names 的长度也等于 classes.txt 的行数三者不一致训练会直接报维度错。names 的顺序要和 classes.txt 完全一致否则模型学到的类别名会张冠李戴。test 段可选但建议写上方便训完直接评估。3.2 小目标与密集场景的关键超参板级元件小且密默认超参往往召回偏低。几个值得动的参数参数默认建议作用imgsz640960 或 1280提高小目标像素占比batch16按显存下调大 imgsz 时显存吃紧iou (NMS)0.450.5~0.6密集目标减少误抑制conf0.250.1~0.2 评估看召回时先压低mosaic1.0保留增强小目标与密集样本imgsz 提到 960 以上对小目标帮助最直接因为小元件在 640 下可能只剩十几个像素特征图上一两个格子很难学。代价是显存和训练时间上升batch 要相应减小。NMS 的 iou 阈值调高是为了让挨得近的同类元件不被互相抑制掉——密集检测里这是最常见的漏检来源。3.3 启动训练与断点续训以 YOLOv5 为例命令行大致是python train.py \ --data data/pcb.yaml \ --weights yolov5s.pt \ --img 960 \ --batch 8 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml \ --name pcb_exp--weights用预训练权重能明显加快收敛小数据集从零训容易过拟合。--hyp选 low 增强那套小数据集上强增强有时反而伤性能可以两套都试。中断后加--resume续训它会从 last.pt 接着跑。YOLOv8 的话换成yolo detect train datapcb.yaml modelyolov8s.pt imgsz960 epochs100参数名略有差异但含义一致。3.4 训练日志里该盯什么loss 分三块box、obj、cls。小目标场景重点看 box loss 是否稳定下降如果 obj loss 震荡大往往是密集区域正负样本划分不稳可以调 anchor 或换更细的特征层。mAP0.5 看整体mAP0.5:0.95 看定位精度。验证集只有 80 张指标波动会比较大别被单轮跳变带偏看趋势。如果训练 mAP 高、验证 mAP 低很多先怀疑过拟合加数据增强或减模型容量。4. 避坑与排查标签、路径、显存、类别四类翻车4.1 图片和标签不同名导致样本被静默丢弃现象训练能跑起来但日志里显示的图片数比实际少或者某些类别几乎学不到。原因YOLO 靠同名替换找标签任何一张图没有对应 txt这张图就被跳过不报错。解决训前跑一遍校验遍历 images 下所有 jpg检查 labels 下同名 txt 是否存在且非空import os for split in [train, val, test]: img_dir fimages/{split} for f in os.listdir(img_dir): if not f.endswith(.jpg): continue lbl os.path.join(labels, split, f.replace(.jpg, .txt)) if not os.path.exists(lbl) or os.path.getsize(lbl) 0: print(缺失或空标签:, f)4.2 路径写相对导致找不到数据现象报No labels found或Dataset not found。原因data.yaml 里用了相对路径而训练脚本的工作目录和你以为的不一样。解决path 一律写绝对路径train/val/test 相对 path 写。改完先单独跑一次数据加载确认能读到图再开训。4.3 大 imgsz 直接 OOM现象把 imgsz 提到 1280 后显存爆掉进程被杀。原因显存占用大致随 imgsz 平方增长batch 没同步降。解决imgsz 翻倍时 batch 至少减半或者开梯度累积模拟大 batch。实在不够就退回 960小目标收益和显存之间取平衡。4.4 类别顺序不一致导致标签语义错乱现象可视化时框的位置对但类别名全错或者训练后模型把电容认成 IC。原因data.yaml 的 names 顺序和 classes.txt 不一致class_id 指向了错误的类。解决以 classes.txt 为准逐行核对 names顺序、拼写、数量三者对齐。改完重新可视化几张确认。5. 验证与进阶用测试集量化再拿可视化脚本做回归训完别只看训练曲线拿那 40 张测试集跑一次独立评估命令是python val.py --data data/pcb.yaml --weights runs/train/pcb_exp/weights/best.pt --img 960 --task test。重点看每类的 P、R、mAP长尾类如果 R 明显低说明样本太少可以考虑对稀有类做复制增强或调类别权重。密集区域漏检多就回头调 NMS 的 iou 阈值从 0.45 往上试到 0.6观察漏检和误检的平衡点。我自己的习惯是每次改完超参或数据都拿可视化脚本随机抽 10 张图重画一遍肉眼过一遍框。指标涨了但框画歪了的情况不是没有尤其是改了 imgsz 或做了重采样之后。这个脚本不用改、直接跑正好当回归检查用。从那以后我每次训完新权重都强制走一遍「测试集评估 随机可视化」这两步才敢说这版模型能用。希望帮到你。本文还有配套的精品资源点击获取
返回列表