ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

YOLO小样本训练实战:140张图像搞定安全防护与护目镜检测

YOLO小样本训练实战:140张图像搞定安全防护与护目镜检测 简介这是一份面向目标检测开发者的YOLO系列算法数据集围绕安全防护服与护目镜检测场景构建。整个压缩包共421个文件大小约3.81MB包含140张JPEG原图、140份YOLO格式TXT标签与140份VOC格式XML标签另附1个data.yaml配置文件。数据集已按训练/验证/测试划分标签格式为class x_center y_center width height坐标已归一化可直接接入YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLO11等主流版本进行训练与验证。训练集、验证集和测试集已分开存放用户只需修改data.yaml中的路径即可开始实验。对于需要快速开展安全工装检测、护目镜佩戴识别等任务的工程师和算法学习者该资源省去了自行标注与格式转换的环节拿到后即可配置数据路径并启动模型迭代。目前已有71人浏览学习内容虽小巧但结构完整适合作为入门实战或小型项目验证的数据基础。1. 140张带标签的小数据集够不够训一个安全防护装备检测模型工地监控里算法把远处一块反光铁皮判成了“安全服”或者把透明面屏当成“未戴护目镜”——这类误报不是模型本身差而是训练数据太少、太偏。标题给的条件很明确YOLO算法安全防护服与护目镜检测一共140张带标签图像。这个体量对检测任务属于典型小样本YOLO的预训练迁移能力正好能补位但前提是你得把数据格式、类别分布、训练参数都压到这条赛道上。这篇按一线工程师的做法从解压zip到拿到能在视频流里跑的best.pt把完整路线走一遍。适合已经跑通过YOLO demo、但没处理过极端小数据集的人。2. YOLO版本选型与损失函数视角下的训练前准备2.1 选第几代YOLO小样本场景先别追新“yolo第几代了”是社区里被问得最多的问题之一。从我接触的项目看2025年的生产环境里YOLOv8仍是性价比最稳的选择YOLOv9、YOLOv10在架构上有新东西但训练140张图这个量级时它们的收益体现不出来反而需要更精细的超参调试。稳定压倒一切。下表是我在这类小数据集上的选型建议列了四个常见选项模型体积/速度小样本表现适用场景YOLOv5s轻量推理快稳定但对遮挡目标易漏检CPU或边缘盒子YOLOv8n最轻精度略降140张下训练最快不易过拟合快速验证起步首选YOLOv8s中等精度更高需要更多epoch风险是过拟合项目验收前的精度冲刺YOLOv10n推理延迟低架构新但小数据下调参成本高追求极致帧率时再试我的习惯是先用YOLOv8n把从数据到训练到验证的链路跑通确认标签没问题后再看mAP50-95有没有余量有余量再换YOLOv8s或加数据。跳代追新在这类场景里不划算。2.2 损失函数决定你看训练曲线的哪一行训练日志里那三行loss——box_loss、cls_loss、dfl_loss——不是摆设。YOLOv8的损失函数由三部分构成分类用BCE边界框回归用CIoU加DFLDistribution Focal Loss。对小数据集你主要盯cls_loss和box_loss。cls_loss降得慢说明类别区分度不够常见原因是护目镜这类小目标占比少模型没学到足够特征。box_loss降得快但验证集mAP不涨大概率过拟合了此时应该早停或加大数据增强。dfl_loss波动大一般配合box_loss看不用单独纠结。训练时我会在终端保留yolo输出的实时曲线每5个epoch瞄一眼趋势而不是等全部跑完再开tensorboard。这能帮你省下大量无效等待时间。2.3 训练前的检查项清单动手训练前至少有这几件事要确认解压后的目录是否同时包含images和labels且文件名一一对应。标注类别ID是否从0开始连续编号有没有空标签文件。zip里是否存在损坏的jpg或pngYOLO训练遇到坏图会直接中断。训练集和验证集的划分是否按场景或视频片段切而不是纯随机。这四项里任何一项出问题后面的训练都是白跑。建议把这些检查写成一个小脚本每次拿到新数据集先跑一遍。3. 解压zip、校验YOLO标签与类别平衡处理3.1 解压与目录结构约定拿到yolo算法-安全防护服-护目镜数据集-140张图像带标签-安全防护服-护目镜.zip第一步不是急着解压而是先看压缩包内容确认它是不是标准的YOLO格式目录mkdir -p /data/ppe unzip -o yolo算法-安全防护服-护目镜数据集-140张图像带标签-安全防护服-护目镜.zip -d /data/ppe find /data/ppe -type f | sed s/.*\.// | sort | uniq -c这段命令的逻辑是unzip -o强制覆盖解压到指定目录find列出所有文件并按扩展名统计数量。正常情况下你希望看到的是.jpg或.png与.txt数量相等各140个左右。如果txt数量明显少于jpg说明有标注缺失直接用后面的校验脚本定位。解压完成后我一般再执行一次ls /data/ppe/labels | head确认标注文件命名与图像完全一致。YOLO格式的标注是images/xxx.jpg配labels/xxx.txt文件名相同、扩展名不同。这一步不花时间但能避免最恶心的“训练一半发现标签对不上图”的问题。3.2 用Python校验YOLO标签的格式与越界YOLO标签每行是class_id x_center y_center width height坐标相对图片宽高做了归一化值域是[0,1]。常见错误是类别ID从1开始、坐标超过1.0、宽度或高度为0。140张图手工检查不现实写个脚本几秒跑完。import os label_dir /data/ppe/labels num_classes 2 # 防护服、护目镜 for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f{fname}: 字段数异常 - {line}) continue cls, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) if cls num_classes: print(f{fname}: 类别ID越界 - {cls}) if not (0 cx 1 and 0 cy 1): print(f{fname}: 中心点越界 - {parts[1:]}) if not (0 w 1 and 0 h 1): print(f{fname}: 宽高异常 - {parts[3:]}) if cx w/2 1 or cx - w/2 0 or cy h/2 1 or cy - h/2 0: print(f{fname}: 边界框超出图像 - {line}) print(校验完成)这个脚本做了四件事字段数检查、类别ID范围检查、中心点是否在[0,1]、边界框是否超出图像范围。其中越界检查容易被忽略很多标注工具的导出结果在图像边缘会默认裁切导致框的一部分超出边界模型训练时虽然不报错但会拉低定位精度。如果脚本打印了大量越界记录建议回到标注工具里修正而不是强行训练。3.3 类别分布不均时的处理从“140张”看出关键风险现在YOLO版本从v5迭代到v10不少文章在讲架构和损失函数改进但小数据集真正卡脖子的往往不是模型而是类别分布。140张图像里安全防护服通常占大比例护目镜因为目标小、常被口罩或面屏遮挡标注数量可能只有防护服的一半甚至更少。先量化一下这个不平衡from collections import Counter counter Counter() for fname in os.listdir(/data/ppe/labels): if not fname.endswith(.txt): continue with open(os.path.join(/data/ppe/labels, fname)) as f: for line in f: cls int(line.strip().split()[0]) counter[cls] 1 total sum(counter.values()) for cls, cnt in counter.items(): print(f类别 {cls}: {cnt} 个实例, 占比 {cnt/total:.2%})输出会直接告诉你有没有类别严重不均衡。应对思路有三个按优先级排数据划分时做类别分层确保val集合里每一类都有一定数量避免验证时小类别一只没见到导致mAP虚低。训练时对小类别做加权。YOLO没有直接按类别加权loss的参数但可以通过增加该类别图片的重复次数——也就是把含护目镜的图多复制几份到训练目录里——实现类似Focal Loss的效果。这种做法在只有140张时非常实用。如果其中某类实例数少于20个别指望模型能学出稳健特征后期应该用第5章的伪标签法补充。4. 基于预训练权重的140张小样本训练4.1 写data.yaml并确认预训练权重YOLOv8的数据配置是一个yaml文件指向训练集、验证集路径和类别名。类别名的顺序必须与标注ID严格一致。假设数据集里只有安全防护服和护目镜两类# /data/ppe/ppe.yaml path: /data/ppe train: images/train val: images/val names: 0: safety_clothing 1: goggles写完后用yolo detect train跑训练时框架会直接读这个文件。这里有个常见误用names的索引不是起标识作用而是和txt里第一列的整数一一对应如果txt里写的是1开头而yaml里第一个是0模型会把护目镜当成背景类训练曲线一片乱。建议训练前打印一两个标注文件确认首列数字。预训练权重方面Ultralytics官方发布的YOLOv8n权重yolov8n.pt在COCO上预训练过下载后会自动缓存到本地。对于140张的小数据集必须在预训练权重基础上微调不要在随机初始化下从零训练否则收敛速度会慢一个量级而且大概率过拟合。4.2 训练参数怎么调batch、epochs、增强策略小数据集最怕两条欠拟合和过拟合。欠拟合表现为loss降不下去过拟合表现为train loss低但val mAP低。下面这份参数表是我在140张级别的安全装备检测任务上验证过的初始值按需调整参数建议值说明modelyolov8n.pt从预训练checkpoint开始不写.pt则随机初始化epochs200配合早停实际跑满100轮左右就可能停batch8显存不够就4太小会导致BN统计不稳定imgsz640不要低于416护目镜是小目标分辨率太低直接丢特征optimizerAdamW小数据集比默认SGD收敛更快lr00.001迁移学习场景下过大的学习率会破坏预训练特征close_mosaic10最后10个epoch关闭Mosaic增强避免目标被过度拼接patience50验证集连续50轮不提升就提前停止close_mosaic是我特别想强调的一个参数。YOLO默认开启Mosaic增强把4张图拼成1张训练对小目标检测提升明显。但它的副作用是最后阶段可能让模型看到太多拼接后的合成场景与真实单帧场景产生分布偏移。所以官方训练脚本里会在末尾自动关闭Mosaic我们手动指定close_mosaic10就是让最后10轮回归纯真实分布。4.3 训练命令与loss曲线观察重点一切就绪后在/data/ppe目录下执行cd /data/ppe yolo detect train \ datappe.yaml \ modelyolov8n.pt \ epochs200 \ batch8 \ imgsz640 \ optimizerAdamW \ lr00.001 \ patience50 \ close_mosaic10训练开始后终端会每轮打印一次box_loss、cls_loss、dfl_loss和mAP相关指标。前20轮的观察重点是box_loss是否从高位3.0以上快速下降mAP50是否开始出现非零值。如果前20轮mAP50一直为0且lr0已经是0.001那么可以把学习率降到0.0005再试一次。如果用的是AMD显卡且没配好ROCm环境yolo命令会自动回退到CPU训练。140张图、640分辨率、YOLOv8n在CPU上大约每小时能跑40到60轮200轮需要三小时左右能接受但不算舒服。NVIDIA显卡会快得多30分钟内跑完一轮完整训练。训练结束后模型保存在runs/detect/train/weights/best.pt和last.pt。记住一点只用best.pt别习惯性用last.pt因为last在末尾几轮可能已经过拟合。5. 验证指标与伪标签二次迭代5.1 用混淆矩阵和小目标漏检判断刚训完的模型训练完不等于能用先跑验证yolo detect val \ modelruns/detect/train/weights/best.pt \ datappe.yaml输出的报告中重点看两个数字mAP50和mAP50-95。140张数据集上如果mAP50达到0.85以上说明类别检测基本可用mAP50-95低于0.5也不用太慌小目标本身在IoU严格定义下得分就低。另一个被忽视的输出是confusion_matrix.png它揭示了护目镜被误判成背景的比例。若该比例高于20%优先补充护目镜的近距离标注数据而不是调IoU阈值。5.2 从140张到够用伪标签冷启动扩充140张对“带标签数据集”这个说法是成立的但对生产检测器来说规模太小。在不能手工标注更多数据的前提下最有效的路径是伪标签二次迭代。做法是采集同一工地的未标注监控帧用刚训好的best.pt跑推理只保留置信度高于0.85的框转成YOLO格式后人工抽样检查一轮再加入训练集。这个过程可以把有效数据从140张扩到500张的量级且类别覆盖会更接近真实分布。伪标签有几个必须注意的细节推理时的conf阈值别设太高0.70到0.85之间比较合适太高会漏掉小目标导致新标签依然偏向大目标跑推理时用save_txtTrue导出txt文件再按原图尺寸归一化坐标这一步YOLO框架会自动完成。扩完数据后重新跑一次第4章的训练通常mAP50会有3到5个百分点的提升。把这条迭代路径固化下来之后每次工地换机位、换光线都是同样的流程收新帧、筛伪标签、重训而不是重新标140张图。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进