YOLO算法建筑工地扬尘目标检测数据集:166张单类别微调实战

发布时间:2026/10/12 1:22:08
YOLO算法建筑工地扬尘目标检测数据集:166张单类别微调实战
简介本资源为面向建筑工地扬尘治理场景的YOLO目标检测数据集标注类别聚焦“尘土”一类目标适合从事智慧工地、环境监测方向的研究者与算法工程师用于训练和验证扬尘识别模型。压缩包共503个文件包含168张jpg原始图像、166个xml标注文件、166个txt标签文件以及1个data.yaml配置文件、1个md说明和1个pdf文档整体约26.07MB已按训练集与验证集完成划分可直接接入YOLOv5、YOLOv7、YOLOv8、YOLOv11等系列算法开展训练。图像覆盖工地扬尘的多种实拍场景xml与txt双格式标注便于VOC与YOLO格式互转data.yaml省去手动配置数据路径的步骤。目前已有17人学习下载适合需要快速搭建扬尘检测基线、验证模型效果或扩充工地类数据集的读者参考使用。1. 工地扬尘检测为什么值得单独做一份数据集建筑工地扬尘目标检测说白了就是让模型在监控画面里把「扬尘」这块区域框出来。它和常规的车辆、行人检测不一样扬尘没有刚性边界形态随光照、风速、施工阶段剧烈变化颜色从灰白到土黄都有还经常和雾、逆光、水泥地面混在一起。你拿 COCO 或者 VOC 上训好的 YOLO 直接推理大概率会把扬尘漏掉或者把远处的雾、地面的反光误判成尘土。这就是为什么「YOLO算法建筑工地扬尘目标检测数据集」这类小规模专用数据集有存在价值——166 张、标注类别为尘土量不大但场景聚焦适合做垂直场景的微调验证和原型搭建。这份数据适合谁一是做智慧工地、环保监测方向想快速验证扬尘检测可行性的工程师二是手里有 YOLO 基础、想找一个真实脏数据练手标注格式转换和微调的人。它不适合直接当生产模型的数据底座166 张的体量决定了它只能做 baseline 和流程跑通真正落地还得靠现场持续采集扩充。下面我按「先看懂数据、再跑通训练、最后避坑」的顺序把这条链路讲清楚。2. 拆开这份扬尘数据集166 张到底能干什么2.1 标注类别只有「尘土」意味着什么单类别检测是这份数据集最鲜明的特征。标注类别为尘土意味着你的模型输出只有一个类检测头只需要区分「尘土」和「背景」。这带来两个直接后果一是训练收敛快166 张图在预训练权重基础上微调几十个 epoch 就能看到 loss 明显下降二是评估指标简单mAP0.5 基本就代表模型对扬尘区域的定位能力不用纠结多类之间的混淆。但单类别也有陷阱。扬尘和背景的边界本身就模糊标注时不同人对「哪里算尘土」的判断不一致框可能偏大或偏小。你在训练前一定要抽样看几十张标注框确认框的松紧程度是否统一。如果发现有的框把整片天空都框进去有的只框了最浓的一小块那这批标注的一致性就有问题训练出来的模型置信度会飘。从数据规模看166 张属于典型的小样本。小样本微调的核心思路不是从头训而是加载 COCO 预训练的 YOLO 权重冻结大部分 backbone只让检测头和部分高层特征参与更新。这样既利用了预训练学到的通用纹理特征又避免在小数据上过拟合。2.2 目录结构与标注格式的常见形态这类数据集压缩包解压后常见结构是图片文件夹加标注文件夹标注多为 YOLO 格式的 txt每行class_id x_center y_center width height坐标是归一化到 0 到 1 的值。也有部分数据集给的是 VOC 的 xml 或 LabelMe 的 json。你拿到手第一件事不是急着训而是确认格式。格式文件特征转换目标YOLO txt每行 5 个数值归一化坐标可直接用VOC xml含 bndbox 的 xmin/ymin/xmax/ymax需转 YOLOLabelMe jsonshapes 里存 points 多边形需转矩形框如果标注是 VOC 或 LabelMe就得先转成 YOLO 格式。转换时最容易翻车的是坐标归一化VOC 的像素坐标要除以图片实际宽高而不是固定值。图片尺寸不统一时逐张读取尺寸再归一化别用统一假设。2.3 用脚本快速体检数据集在训练前跑一段体检脚本能提前发现大部分脏数据问题。下面这段代码统计图片数量、标注数量、类别分布和异常框。import os import glob from collections import Counter img_dir images # 图片目录 label_dir labels # 标注目录 imgs glob.glob(os.path.join(img_dir, *.jpg)) glob.glob(os.path.join(img_dir, *.png)) print(f图片总数: {len(imgs)}) cls_counter Counter() bad_lines 0 empty_labels 0 for img_path in imgs: stem os.path.splitext(os.path.basename(img_path))[0] label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): print(f缺标注: {stem}) continue with open(label_path, r) as f: lines [l.strip() for l in f if l.strip()] if not lines: empty_labels 1 continue for line in lines: parts line.split() if len(parts) ! 5: bad_lines 1 continue cls_counter[parts[0]] 1 # 检查坐标是否越界 vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad_lines 1 print(f类别分布: {dict(cls_counter)}) print(f空标注文件: {empty_labels}) print(f异常标注行: {bad_lines})这段脚本做了四件事统计图片总数、检查每张图是否有对应标注、统计类别分布、校验坐标是否在 0 到 1 之间。参数上img_dir和label_dir按你解压后的实际路径改。如果输出里「缺标注」很多说明图片和标注文件名没对齐常见原因是扩展名不一致或前缀多了空格。如果「异常标注行」不为零训练时 dataloader 会报错或静默丢弃必须提前修掉。提示体检脚本跑完再动手训比训到一半发现标注错位要省几个小时。3. 用 YOLO 微调这份扬尘数据集的完整流程3.1 环境配置与预训练权重选择环境用 Ultralytics 的 YOLO 系列最省事pip 装完就能跑。版本上选当前稳定的 v8 或 v11 都行接口基本一致。关键是预训练权重小样本一定要用 COCO 预训练的权重别用随机初始化。COCO 上模型见过大量纹理和边缘迁移到扬尘这种低对比度目标上比从零学快得多。pip install ultralytics # 验证安装 yolo checksyolo checks会打印环境信息确认 torch 和 CUDA 是否可用。如果显示 CPU only训练会非常慢166 张图在 CPU 上跑 100 epoch 可能要几小时建议至少有张入门级显卡。3.2 数据集配置文件怎么写Ultralytics 用 yaml 描述数据集路径和类别。在项目根目录建一个dust.yamlpath: ./dust_dataset # 数据集根目录 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 nc: 1 # 类别数只有尘土 names: 0: dust # 类别名这里path是根train和val是相对根目录的路径。166 张图建议按 8:2 划分约 133 张训练、33 张验证。划分时注意同一段视频抽出的帧要分到同一侧否则相邻帧同时出现在训练和验证里验证指标会虚高。这是小样本数据集最隐蔽的坑之一。3.3 训练命令与关键参数yolo detect train \ datadust.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.001 \ patience20 \ projectruns/dust \ nameexp1逐项说参数。modelyolov8n.pt选 nano 版166 张图用大模型纯属浪费还算力。imgsz640是 YOLO 的默认输入尺寸扬尘区域通常占画面比例不小640 够用如果扬尘在画面里很小可以提到 960但显存和速度要权衡。batch16在 8G 显存上比较稳显存小就降到 8。lr00.001是初始学习率微调场景比默认的 0.01 小一档更稳避免把预训练权重冲垮。patience20表示验证指标 20 轮不提升就早停小数据上防止过拟合。训练过程中重点看两个曲线train/box_loss和metrics/mAP50。box_loss 稳定下降、mAP50 上升后趋于平缓就是正常收敛。如果 box_loss 一直震荡不降多半是学习率太大或标注框质量差。3.4 推理验证与结果解读训完在验证集上跑推理看实际框得准不准yolo detect predict \ modelruns/dust/exp1/weights/best.pt \ sourceimages/val \ conf0.25 \ saveTrueconf0.25是置信度阈值低于它的框不显示。扬尘检测里这个值可以调低到 0.15 看召回因为漏检扬尘比误检更影响业务判断。结果图存在runs/dust/exp1/下重点看三类情况浓尘有没有框住、薄尘有没有漏、地面反光和雾有没有被误判。把误判和漏检的图挑出来就是下一轮补数据的依据。4. 扬尘检测训练里最容易踩的坑4.1 验证集指标很高但实际画面漏检现象训练日志里 mAP50 到 0.9 以上但拿现场视频一跑扬尘几乎框不出来。原因通常是训练验证集同源划分时相邻帧泄漏模型记住了背景而不是学会了识别扬尘。解决按视频或时间段划分数据集确保验证集的场景和训练集不重叠同时用完全没参与训练的现场截图做一次独立测试。4.2 把雾和逆光误判成尘土现象清晨或阴天画面里模型在远处雾区画出大量尘土框。原因是扬尘和雾在灰度、纹理上高度相似单类别模型没有负样本约束。解决在训练集里加入含雾但不含扬尘的负样本图标注为空文件推理时适当提高 conf 到 0.4 以上牺牲一点召回换准确率。4.3 标注框松紧不一致导致置信度飘现象同一段视频里有的扬尘框置信度 0.9有的只有 0.3明明浓度差不多。原因是标注时框的大小标准不统一模型学到的目标尺度混乱。解决重新过一遍标注统一按「可见扬尘边缘外扩 5 到 10 像素」的标准修框修完再训一轮置信度分布会明显收窄。4.4 小样本过拟合训练 loss 降验证 loss 升现象训练 box_loss 一路降到很低验证 mAP 却在某个 epoch 后掉头向下。原因166 张图对模型来说太少模型开始背训练集。解决加载预训练权重、冻结 backbone 前几层、加数据增强mosaic、HSV 抖动、开早停。增强参数里mosaic1.0对小数据帮助最大它把四张图拼成一张等效扩充了场景组合。4.5 图片和标注文件名对不上现象训练启动就报找不到标注或者 dataloader 警告大量图片被跳过。原因图片是.jpg标注是.JPG.txt或者文件名里有中文空格。解决写个批量重命名脚本统一转小写、去空格、图片和标注同 stem。这个坑看着低级但实际项目里出现频率极高血泪经验。5. 把 166 张用出 1660 张效果的两个技巧第一个技巧是切片推理加小目标增强。扬尘在远景画面里可能只占几十像素640 整图缩放后细节丢失。做法是把原图切成带重叠的子图分别推理再合并框。Ultralytics 支持augmentTrue的测试时增强但更彻底的是自己写滑窗切片。对工地固定机位可以直接在 ROI 区域裁切训练让模型专注扬尘高发区。第二个技巧是用无标注数据做半监督伪标签。现场监控截图远多于 166 张你可以先用训好的模型对无标注图推理把高置信度框当伪标签人工快速过一遍修正再混入训练集。一轮下来通常能扩到几百张有效样本。伪标签的置信度阈值建议设 0.6 以上宁缺毋滥错标会污染模型。验证这套流程是否有效别只看 mAP。我一般会固定一段现场视频每隔 30 帧抽一张人工数出真实扬尘帧数再统计模型检出帧数和误报帧数算一个业务口径的检出率。这个数字比 mAP 更能说服做环保监测的甲方。最后说个习惯每次改完数据集或参数都在dust.yaml旁边记一行改动日志写清改了哪几张图、调了什么参数、指标变化多少。小数据集实验迭代快不记日志两周后你自己都说不清哪个版本最好。希望帮到你。本文还有配套的精品资源点击获取