ARTICLE DETAIL

资讯详情

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

PCB元器件检测YOLO数据集:34类小目标标注与训练全流程

PCB元器件检测YOLO数据集:34类小目标标注与训练全流程 简介这是一份面向目标检测学习者的电路板元器件图像数据集适用于YOLO系列模型的训练与验证尤其适合小目标、密集目标检测场景的实战练习。数据按YOLOv5标准目录组织可直接投入训练无需额外转换。压缩包共约2000个文件包含1660个txt标签、339张jpg图像及1个可视化py脚本整体约63.56MB。数据集划分清晰训练集约1500张、验证集约80张、测试集约40张覆盖保险丝、散热片、IC、电感器、晶体管、电容器等34类元器件类别定义见classes文件。配套可视化脚本可随机读取图片并绘制边界框无需修改即可运行便于快速检查标注质量。目前已有835人学习下载适合希望上手工业质检、PCB缺陷检测或小目标检测的研究者与开发者参考使用。1. 电路板元器件检测数据集34 类小目标标注开箱即训的 YOLO 落地包手里拿到一块 PCB 板图要在上面把保险丝、散热片、IC、电感器、晶体管、电容器这些元器件一个个框出来这件事的难点从来不在模型结构而在数据。元器件尺寸小、排布密、同类外观差异大自己从零标一千多张图光是画框就能耗掉一两周。这份 YOLO 数据集就是冲着这个痛点来的1500 张左右的训练图加对应标签、80 张验证、40 张测试按 YOLOv5 的目录规范整理好34 个类别写在 classes 文件里还附带一个可视化脚本随机丢一张图进去就能把边界框画出来存到当前目录。它适合做工业质检、PCB 缺陷与元器件识别方向的从业者也适合刚入门想跑通小目标检测流程的新手——不用先啃标注工具直接进训练环节。2. 数据集结构与 YOLOv5 目录规范先看懂再动手2.1 目录长什么样为什么按这个结构存YOLOv5 对数据目录有固定期待训练脚本默认去images/train、labels/train这类路径找图找标签路径对不上就是一堆 FileNotFoundError。这份数据集直接按这套规范落盘省掉了自己搬文件的功夫。典型结构如下pcb_dataset/ ├── images/ │ ├── train/ # 约 1500 张 jpg │ ├── val/ # 约 80 张 jpg │ └── test/ # 约 40 张 jpg ├── labels/ │ ├── train/ # 与 train 图片同名的 txt │ ├── val/ │ └── test/ ├── classes.txt # 34 个类别名一行一个 └── visualize.py # 可视化脚本图片文件名形如pcb98rec1_jpg.rf.02ab8a0b0d11a40415c316ce22f7229c.jpg中间那串rf.加哈希是标注平台导出时加的防重名后缀不影响使用但要注意标签 txt 必须和图片同名同前缀只换扩展名。images/train里每一张xxx.jpglabels/train里就得有一个xxx.txt少一个都会在训练时被跳过或报错。2.2 标签格式YOLO 的归一化中心点写法YOLO 的标签不是左上右下角坐标而是类别 中心x 中心y 宽 高且全部归一化到 0~1。一行一个目标一张图有多少个元器件就有多少行。看一个例子12 0.4832 0.5127 0.0410 0.0638 7 0.2210 0.3345 0.0288 0.0451第一列是类别索引对应classes.txt里的行号从 0 开始后四列是归一化后的中心点与宽高。这里有个新手最容易翻车的点类别索引是 0-basedclasses.txt第一行是索引 0不是 1。如果你自己改过 classes 顺序标签里的数字含义就全变了模型学出来的类别会整体错位。2.3 34 个类别与类别不平衡的现实类别覆盖保险丝、散热片、IC、电感器、晶体管、电容器等 34 种具体以 classes 文件为准。34 类在目标检测里算中等偏多PCB 场景下不同元器件的样本量往往不均匀——大颗的 IC、散热片出现次数多小颗的电阻电容虽然数量多但尺寸极小。这种不平衡会直接反映在训练上模型对高频大类学得快对小目标小类容易欠拟合。所以拿到数据后第一件事不是急着训而是先统计一下每类的框数量心里有数。import os from collections import Counter label_dir pcb_dataset/labels/train counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: line line.strip() if line: cls_id int(line.split()[0]) # 第一列是类别索引 counter[cls_id] 1 for cls_id, cnt in sorted(counter.items()): print(fclass {cls_id}: {cnt} boxes)这段脚本遍历训练标签统计每个类别出现的框数。cls_id直接取每行第一个字段转 intcounter累加。跑完你会看到哪些类只有几十个框、哪些类上千后面调损失权重或做重采样就有依据了。参数上唯一要改的是label_dir指向你自己的标签目录即可。3. 可视化脚本怎么用三行代码验证标注质量3.1 脚本能干什么为什么先跑它训练前最该做的一件事是肉眼确认标注没错位、没漏框。这份数据集自带visualize.py随机传一张图进去它读同名标签、把边界框画在图上、保存到当前目录。脚本无需改动即可运行这对不熟悉 OpenCV 的人很友好。它的价值在于如果标签的归一化坐标算错了画出来的框会整体偏移或大小离谱一眼就能看出来比训到一半发现 mAP 上不去再回头查要省事得多。3.2 运行方式与参数说明常见用法是命令行传图片路径或者直接改脚本里的默认路径。假设脚本用 argparse 接收参数运行方式大致如下python visualize.py --image pcb_dataset/images/train/pcb98rec1_jpg.rf.02ab8a0b0d11a40415c316ce22f7229c.jpg \ --label pcb_dataset/labels/train/pcb98rec1_jpg.rf.02ab8a0b0d11a40415c316ce22f7229c.txt \ --classes pcb_dataset/classes.txt如果脚本是随机抽图模式那更简单直接python visualize.py就行它会自己从目录里挑一张。核心逻辑无非是读图拿到h, w读标签每行cls cx cy bw bh把归一化坐标还原成像素坐标x1 (cx - bw/2) * w再cv2.rectangle画框、cv2.putText写类别名最后cv2.imwrite存盘。参数上要盯的是classes路径类别名读错会导致框上文字全乱。3.3 从可视化结果判断标注是否可用画出来之后重点看三件事框是否贴合元器件边缘、密集区域有没有框重叠到分不清、小目标有没有被漏标。PCB 上电容电阻挨得近如果发现两个元器件被一个大框圈住说明标注时合并了这种样本对训练是噪声。另外注意图片分辨率如果原图很大而元器件只占几十像素缩放到 640 训练时小目标会更小这是后面调参要重点处理的。提示可视化脚本存图默认落在当前工作目录批量跑之前先建个输出文件夹免得把原图目录搞乱。4. 训练配置与参数从 data.yaml 到小目标适配4.1 写对 data.yaml路径和类别数一个都不能错YOLOv5 训练靠一个 yaml 描述数据位置和类别。这份数据集要配的 yaml 大致如下path: ./pcb_dataset # 数据集根目录 train: images/train # 相对 path 的训练图路径 val: images/val test: images/test nc: 34 # 类别数必须和 classes.txt 行数一致 names: # 类别名列表顺序必须和 classes.txt 完全一致 0: fuse 1: heatsink 2: IC # ... 其余 31 类nc写错是最隐蔽的坑写成 33 或 35训练不一定立刻报错但类别映射会错位最后预测出来的类别名对不上。names的顺序必须和classes.txt逐行对应因为标签里的索引就是按这个顺序编的。path用相对路径时注意是从你执行训练命令的目录算起不是从 yaml 文件所在目录算起这点和很多人的直觉相反。4.2 小目标检测的关键参数怎么设PCB 元器件普遍偏小默认的 640 输入尺寸下一个电容可能只剩十几个像素。常见做法是把--imgsz提到 960 甚至 1280代价是显存和训练时间上涨。如果显存吃紧可以先用 640 跑通流程再逐步加。锚框方面YOLOv5 默认锚框是 COCO 尺度对小目标偏大可以用--noautoanchor关掉自动锚框或者先跑一次 autoanchor 让它根据你的数据重算。python train.py \ --data pcb_dataset/data.yaml \ --weights yolov5s.pt \ --img 960 \ --batch 16 \ --epochs 100 \ --hyp data/hyps/hyp.scratch-low.yaml--img 960提升小目标分辨率--batch 16按显存调--hyp hyp.scratch-low.yaml是低增强配置适合小数据集减少过拟合。100 轮是起步值看验证集 mAP 曲线决定要不要加。如果训练时发现 loss 震荡厉害先把 batch 调小、学习率降一档再看。4.3 数据增强对小目标的取舍YOLOv5 默认开了 mosaic、mixup、随机缩放等增强。mosaic 把四张图拼一张对小目标检测通常有帮助因为它增加了小目标出现的上下文多样性。但 mixup 在小数据集上有时会糊掉小目标可以适当降低mixup权重。缩放增强scale别开太大否则小目标被缩得更小直接消失。这些都在 hyp yaml 里改改完记得对齐训练日志里的增强参数确认生效。5. 避坑与排查标注、路径、显存三类高频翻车5.1 训练报 “No labels found”现象启动训练后日志提示找不到标签或者labels计数为 0。原因通常是图片和标签没同名或者labels目录层级和images对不上。YOLOv5 默认把images里的/images/替换成/labels/再找同名 txt如果你的目录不是这个对应关系就会失败。解决确认images/train/xxx.jpg对应labels/train/xxx.txt前缀完全一致只差扩展名。5.2 框画出来整体偏移或大小不对现象可视化时框的位置和元器件对不上整体偏一个方向或框特别大。原因多半是标签坐标没归一化或者归一化时用错了宽高基准把 w 和 h 弄反。解决检查标签每行后四列是否都在 0~1 之间若出现大于 1 的值说明没归一化再确认x cx * w、y cy * h的还原顺序没写反。5.3 类别名显示错乱现象预测或可视化时框上的类别名张冠李戴。原因classes.txt顺序和标签索引、yaml 里的names三者不一致。解决以classes.txt为准逐行核对 yaml 的names确保第 0 行对应索引 0中间没有空行或注释行打乱顺序。5.4 显存爆掉CUDA out of memory现象训练刚开始就 OOM。原因--img提到 960/1280 后显存需求翻倍--batch又没降。解决先把 batch 降到 8 或 4或者用--img 640跑通再往上加也可以开--cache ram之外的选项时注意内存别把磁盘缓存和显存搞混。5.5 验证集 mAP 一直上不去现象训练 loss 在降但验证 mAP 卡在低位。原因小目标在 640 下信息丢失或类别不平衡导致小类被忽略。解决提高输入尺寸、检查小类样本量、必要时对小类做重采样或调损失权重同时确认验证集标签没有漏标。6. 进阶技巧用可视化脚本反查漏标与锚框重算跑通训练只是开始真正拉开差距的是数据侧的迭代。我习惯在训练前后各跑一遍可视化训练前确认标注训练后拿预测结果和原标注叠一起看漏检。具体做法是用训练好的权重对训练集图片推理把预测框和真值框画在同一张图上真值用绿框、预测用红框漏检的地方就是绿框没被红框覆盖的区域。这一步能直接暴露是标注漏了还是模型没学到。import cv2 def draw_boxes(img, boxes, color, labelNone): for x1, y1, x2, y2 in boxes: cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), color, 2) if label: cv2.putText(img, label, (int(x1), int(y1) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) # gt_boxes 来自标签还原pred_boxes 来自模型输出 img cv2.imread(sample.jpg) draw_boxes(img, gt_boxes, (0, 255, 0)) # 真值绿框 draw_boxes(img, pred_boxes, (0, 0, 255)) # 预测红框 cv2.imwrite(compare.jpg, img)这段代码把两组框叠画绿真值红预测颜色区分开。参数上color是 BGR 顺序别写成 RGB否则绿红会反。跑完对着compare.jpg看如果某类元器件真值有框、预测没有要么是样本太少要么是尺寸太小对应去补数据或提分辨率。另一个值得做的动作是重算锚框。YOLOv5 训练时会自动跑 k-means 聚类锚框但如果你改了输入尺寸最好手动确认一下聚类结果是否匹配。命令是python utils/autoanchor.py --data pcb_dataset/data.yaml它会输出建议锚框和当前锚框的对比。锚框偏大时小目标召回会明显下降这一步花几分钟能省掉后面反复调参的功夫。还有个容易被忽略的点测试集只有 40 张单看测试 mAP 波动会很大别拿它当唯一指标。我一般以验证集为主测试集只在最后确认一次。类别不平衡的情况下看每类的 AP 比看总 mAP 更有意义小类的 AP 才是真正决定这套数据能不能上产线的指标。从那以后我每次拿到新数据集都强制先跑一遍类别统计和可视化再动训练脚本——这个习惯帮我省下了太多返工时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表