166张建筑工地扬尘数据集:YOLO小样本训练与避坑指南 简介面向建筑工地扬尘监测场景的YOLO目标检测数据集标注类别为尘土适用于YOLOv5、YOLOv7、YOLOv8、YOLOv11等系列算法可直接用于训练与验证适合从事智慧工地、环境监测方向的研究者与算法工程师快速搭建扬尘识别模型。资源包共503个文件包含168张jpg原始图像、166个xml标注文件、166个txt标签文件以及1个data.yaml配置文件、1个md说明和1个pdf文档压缩包约26.07MB已按训练集与验证集完成划分开箱即可投入训练流程。数据集聚焦尘土这一单一类别图像覆盖工地扬尘典型场景标注规范统一便于模型收敛与效果评估。目前已有17人学习下载配套说明文档可辅助理解数据组织方式与使用要点适合作为扬尘检测任务的基线数据或迁移学习起点。1. 166 张扬尘数据集的真实定位小样本、单类别、工地场景建筑工地扬尘检测这件事真正卡住人的往往不是模型结构而是数据。你打开搜索引擎搜「YOLO识别」能找到一堆 COCO、VOC 的通用教程但工地上那种灰蒙蒙、半透明、边界糊成一片的尘土通用数据集里根本没有对应类别。这份 166 张、标注类别为「尘土」的 YOLO 格式数据集解决的就是这个从零到一的冷启动问题——它不追求规模追求的是让你先把训练管线跑通、把扬尘这一类目标的检测逻辑验证出来。它适合三类人一是做智慧工地、环保监测方向需要快速验证扬尘识别可行性的算法工程师二是手里有摄像头但没标注数据想先拿一份现成标注做 baseline 的开发者三是学生或转行者想找一个真实场景的小数据集练 YOLO 全流程。166 张属于典型的小样本量别指望它直接上生产但用来跑通「标注格式解析 → 训练 → 推理 → 评估」这条链路足够了。下面我按实际拆包和训练的流程把这份资源怎么用、参数怎么设、哪里会翻车讲清楚。2. 拆开压缩包先看什么YOLO 标注格式与目录结构核对拿到一份 YOLO 数据集第一件事不是急着训练而是确认它的标注格式和目录组织是否符合 Ultralytics 系的读取约定。这一步做错后面训练报的错会让你怀疑人生。2.1 目录结构与 images/labels 对应关系YOLO 格式的标准组织是 images 和 labels 两个平行目录里面文件名一一对应只是扩展名不同图片 .jpg/.png标注 .txt。常见做法是这样# 解压后先看目录树确认结构 unzip 建筑工地扬尘数据集-166张.zip -d dust_dataset cd dust_dataset find . -maxdepth 2 -type d | sort典型输出应该是类似这样的结构. ./images ./images/train ./images/val ./labels ./labels/train ./labels/val如果解压出来是 images 和 labels 混在一起、或者标注和图片放在同一个文件夹那就需要自己写脚本拆分。我一般会先统计一下数量对不对# 统计图片和标注文件数量两者必须相等 echo images: $(find ./images -type f \( -name *.jpg -o -name *.png \) | wc -l) echo labels: $(find ./labels -type f -name *.txt | wc -l)166 张图片对应 166 个 txt数量对不上就说明有图没标或者有标没图这种脏数据必须在训练前清掉否则训练时 Ultralytics 会直接跳过或报 warning。2.2 标注文件内容解析与类别索引YOLO 的 txt 标注每行是class_id x_center y_center width height后四个都是归一化到 0~1 的相对坐标。单类别「尘土」的话class_id 应该全是 0。打开一个标注文件确认# 随机抽一个标注文件看内容 head -n 5 ./labels/train/$(ls ./labels/train | head -n 1)正常输出类似0 0.512 0.634 0.221 0.318 0 0.334 0.712 0.180 0.245这里要重点核对两件事一是 class_id 是否只有 0如果出现 1、2 说明标注时类别没统一二是坐标是否都在 0~1 之间出现大于 1 的值说明标注工具导出时没归一化需要手动处理。我见过不少人直接拿这种数据去训练loss 一直不降最后发现是坐标没归一化白白浪费一晚上。2.3 生成 data.yaml 配置文件Ultralytics 系YOLOv5/v8/v11训练都靠一个 yaml 描述数据路径和类别。单类别的话这样写# data.yaml path: ./dust_dataset # 数据集根目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 nc: 1 # 类别数尘土只有一类 names: 0: dust # 类别名中文可写但建议英文避免编码问题参数说明path是根目录train/val是相对 path 的路径Ultralytics 会自动把images替换成labels去找标注。nc必须和标注里的最大 class_id 1 一致这里只有 0 所以 nc1。类别名建议用英文中文在某些终端和日志里会乱码排查问题时很烦。提示如果解压出来没有 train/val 划分166 张建议按 8:2 切约 133 训练、33 验证。小样本下验证集别太小否则 mAP 波动大得没法看。3. 用 Ultralytics 跑通训练从环境到第一个 baseline数据核对完接下来就是把它喂给模型。这一章按「环境配置 → 训练命令 → 参数含义 → 结果判读」走一遍新手照着能跑熟手可以看参数边界。3.1 环境配置与依赖安装Ultralytics 现在把 YOLOv8/v11 都收进了一个 pip 包配置比早年 YOLOv5 省事很多。常见做法是建个虚拟环境再装# 建虚拟环境Python 3.9~3.11 都行 python -m venv yolo_env source yolo_env/bin/activate # Windows 用 yolo_env\Scripts\activate # 装 ultralytics会自动带 torch/torchvision pip install ultralytics # 验证安装能打印版本就 OK yolo version如果你有 NVIDIA 显卡装完确认一下 CUDA 是否可用import torch print(torch.cuda.is_available()) # True 才走 GPU print(torch.cuda.get_device_name(0))返回 False 的话要么是没装对 CUDA 版本的 torch要么驱动太旧。CPU 也能训这 166 张就是慢一张 640 分辨率大概几百毫秒166 张一轮下来几分钟跑个几十轮也能接受。3.2 训练命令与关键参数单类别小数据集直接用预训练权重做迁移学习别从零训。命令如下yolo detect train \ data./data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch8 \ lr00.01 \ patience30 \ projectruns/dust \ nameexp1逐项说明modelyolov8n.pt用 nano 版参数量小、训练快适合小样本先验证epochs100是上限配合patience30做早停30 轮没提升就停imgsz640是 YOLO 的默认输入尺寸扬尘这种大目标够用batch8是显存不够时的保守值8G 显存可以往上加到 16lr00.01是初始学习率迁移学习常用 0.01从零训才用 0.001 级别。如果你要换 YOLOv11把 model 换成yolo11n.pt即可命令结构完全一样。这也是 Ultralytics 统一接口的好处换版本不用改训练脚本。3.3 训练日志怎么看loss 与 mAP 的判读训练开始后终端会刷每个 batch 的 box_loss、cls_loss、dfl_loss每轮结束打印 mAP50、mAP50-95。小样本单类别重点看三个信号第一box_loss 是否稳定下降。如果前 10 轮就卡在某个值不动八成是标注坐标有问题或者学习率太大。第二mAP50 能不能上到 0.7 以上。扬尘目标大、特征明显166 张迁移学习通常能到 0.7~0.9上不去说明数据或标注有系统性问题。第三验证集 loss 是否开始反弹。反弹就是过拟合小样本很容易发生这时候要么减 epochs要么加数据增强。# 训练完看结果曲线results.png 里有 loss 和 mAP 走势 ls runs/dust/exp1/ # weights/best.pt 是最优权重last.pt 是最后一轮3.4 推理验证与结果可视化训完拿 best.pt 跑推理确认模型真的能框出尘土yolo detect predict \ modelruns/dust/exp1/weights/best.pt \ source./dust_dataset/images/val \ conf0.25 \ saveTrueconf0.25是置信度阈值低于它的框不显示。扬尘这种半透明目标阈值设太高会漏检设太低会满屏框0.25 是个常用起点实际按验证集表现调。结果默认存到runs/detect/predict/打开图片看框的位置和置信度如果框明显偏移或大小不对回去查标注。注意166 张训出来的模型泛化能力有限换个工地、换个光照可能就掉点。它的价值是验证流程和做 baseline不是直接部署。4. 小样本扬尘检测的避坑清单五个真实翻车记录这一章是我和身边人踩过的坑每条按「现象 → 原因 → 解决」写你训练前对照一遍能省不少时间。4.1 现象训练 loss 为 nan 或一直不降原因标注坐标没归一化或者 txt 里混入了空行、非数字字符。YOLO 读取时不会报错直接把脏数据喂进去梯度就炸了。解决写个校验脚本扫一遍所有标注文件检查每行是否 5 个字段、后四个是否在 0~1、class_id 是否合法。发现异常文件直接剔除或修正。import os bad [] for root, _, files in os.walk(./labels): for f in files: if not f.endswith(.txt): continue p os.path.join(root, f) for i, line in enumerate(open(p)): parts line.strip().split() if len(parts) ! 5: bad.append((p, i, field count)); continue vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad.append((p, i, not normalized)) print(f异常标注 {len(bad)} 处) for b in bad[:10]: print(b)4.2 现象mAP 虚高但实际推理框不准原因train 和 val 用了同一批图片或者划分时把同一场景的相邻帧分到了两边造成数据泄漏。小样本下这种泄漏特别隐蔽。解决划分前先按场景/时间段聚类同一场景的图要么全在 train 要么全在 val。166 张如果来自连续视频抽帧务必打散后再切别按文件名顺序切。4.3 现象显存溢出 CUDA out of memory原因batch 设太大或者 imgsz 设成了 1280。166 张图不算多但 640 以上分辨率显存占用是平方级增长。解决先把 batch 降到 4 或 2还不行就降 imgsz 到 416。或者用batch-1让 Ultralytics 自动找最大可用 batch。4.4 现象类别名中文导致报错或乱码原因data.yaml 里 names 写了中文某些环境下 yaml 解析或日志输出编码不一致。解决names 统一用英文 dust显示时再映射回中文。这是最省事的做法别跟编码较劲。4.5 现象训练完模型对灰白色物体误检严重原因尘土颜色和水泥、雾、白墙接近单类别小样本下模型学到的更多是颜色和纹理不是语义。解决加负样本不含尘土的工地图进训练集或者用更强的数据增强HSV 抖动、mosaic提升泛化。166 张的 baseline 别期望太高误检是正常的靠后续加数据迭代。5. 从 166 张到可用模型数据增强与迭代验证技巧166 张训出来的模型直接部署肯定不够看但它的正确用法是当种子。这一章讲怎么用这份数据滚雪球以及怎么验证迭代是否真的有效。5.1 用增强把 166 张扩到等效上千张Ultralytics 训练时默认开了 mosaic、HSV、翻转等增强但小样本下可以再激进一点。在训练命令里加参数yolo detect train \ data./data.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch8 \ hsv_h0.02 hsv_s0.8 hsv_v0.5 \ degrees10 translate0.1 scale0.5 \ mosaic1.0 mixup0.2 \ projectruns/dust nameexp_aug参数说明hsv_s0.8加大饱和度抖动让模型不依赖颜色scale0.5允许缩放模拟不同距离的扬尘mixup0.2做图像混合小样本下能显著提升泛化但别设太高否则训练变慢且可能欠拟合。这套增强下来等效样本量能翻几倍。5.2 主动学习用模型找漏标训完第一版后拿它去推理未标注的工地视频帧把高置信度但人工看是误检的、以及漏检的帧挑出来人工补标后加入训练集。这是小样本迭代最有效的方式比盲目加数据快得多。# 对一批新图推理输出带框结果和 txt yolo detect predict \ modelruns/dust/exp_aug/weights/best.pt \ source./new_frames \ conf0.4 save_txtTrue save_confTruesave_txtTrue会把预测框存成 YOLO 格式你可以直接拿这些预测结果当预标注人工修正后就是新训练数据。conf0.4挑高置信度的减少人工核对量。5.3 验证迭代是否有效固定验证集 多指标对比每次加数据或改增强后必须用同一个固定验证集评估否则指标不可比。我一般会单独留 30 张不参与训练只做最终验证。对比时看三个指标指标含义关注点mAP50IoU0.5 时的平均精度整体检出能力mAP50-95多 IoU 阈值平均框的定位精度Precision/Recall查准率/查全率误检和漏检的权衡如果 mAP50 涨了但 Recall 没动说明模型只是框得更准没检出更多目标这时候要加漏检场景的数据。如果 Precision 掉得厉害说明误检增多要加负样本。5.4 一个具体技巧冻结 backbone 先训 head小样本下直接全量微调容易过拟合。我习惯先冻结 backbone 只训检测头 20 轮让 head 适应新类别再解冻全量训。Ultralytics 里可以这样控制# 先冻结 backbone 训 20 轮 yolo detect train data./data.yaml modelyolov8n.pt epochs20 freeze10 \ projectruns/dust nameexp_freeze # 再解冻全量微调 yolo detect train data./data.yaml modelruns/dust/exp_freeze/weights/best.pt \ epochs100 projectruns/dust nameexp_fullfreeze10表示冻结前 10 层backbone 主体只更新后面的 head。这样前期收敛稳后期全量微调又能让 backbone 适配扬尘特征。这套两段式训练在 166 张这种量级上通常比直接全量训高 3~5 个点 mAP。从那以后我每次拿到小样本数据集都强制先跑一遍标注校验脚本、再走冻结预训练这两步能挡掉八成低级翻车。这份 166 张的扬尘数据集价值不在它本身有多大而在于它给了你一个真实场景的起点让你把 YOLO 识别扬尘这条链路完整走一遍。希望帮到你。本文还有配套的精品资源点击获取