简介面向工程机械智能识别场景的目标检测数据集适合深度学习和目标检测入门者及工地、矿山重型车辆视觉项目开发者。解决施工现场多类机械检测标注数据紧缺、格式不统一的问题资源围绕挖掘机、装载机、自卸车、汽车起重机、压路机、推土机、平地机七类机械提供标注数据覆盖6338张施工场景图像支持YOLO、Faster RCNN、SSD等主流框架训练。压缩包共2000个文件以YOLO格式txt标注为主附加1个指定类别信息的yaml配置文件整体约361.74MB标注框信息可直接读取yaml内容方便YOLO系列模型加载类别整体也可转换VOC格式使用。数据已完成训练、验证、测试集划分可直接导入YOLOv5至YOLOv10系列开展训练、验证与对比实验省去自行统一标注格式和划分数据集的繁琐步骤。已有308人学习下载适合需要高质量工程机械检测基准数据、快速搭建目标检测流程的读者。1. 为什么工程机械识别数据集值得认真做智慧工地的视频监控里甲方想自动统计现场有多少台挖掘机、装载机在作业机械租赁平台要核对租出去的设备是否真的进场保险定损员想从事故照片里快速判断有没有大型机械参与。这些事情落到技术上核心都是同一个东西——工程机械识别数据集配合目标检测模型。很多团队直接拿通用检测模型跑现场结果泛化得很差不是把渣土车当成自卸车就是漏掉远处的小挖机。问题不在模型而在数据。公开数据集里几乎没有标注清晰的工程机械类别想做出能落地的模型必须自己构建一套高质量的目标检测数据集。这篇内容适合智慧工地、设备监管、保险定损、施工自动化方向的人照着做从采集、标注到训练和排错一次讲透。2. 先定类别体系和采集方案数据规模与多样性决定模型上限2.1 类别体系先拆明白别把复杂形态一筐装拿到工程机械识别数据集这个需求最容易犯的错是直接开拍、开标类别列表写到一半推翻再来。第一件事应该是把类别体系定死。工程机械现场形态差异非常大液压挖掘机有履带式和轮式小挖和大挖尺寸差好几倍装载机有滑移装载机和轮式装载机推土机和装载机从正面看轮廓高度相似压路机又有单钢轮和双钢轮。如果一开始就把类别定得很细比如把履带挖掘机和轮式挖掘机分成两类标注员每天都会遇到边界争议模型也容易互相混淆。比较稳妥的做法是第一版按功能定大类excavator、loader、bulldozer、roller、crane、concrete mixer truck、dump truck七类起步。这也是工程机械识别领域最常见的划分方式。等验证集指标稳定了再拆细粒度类别而不是一步到位。类别数量直接决定标注成本七类已经需要至少两个人标两周细分类会把时间再翻一倍。还有一类样本容易被忽略——负类。工地上最多的其实是渣土车、皮卡、普通卡车如果不把它们标注出来当作负样本模型很容易把渣土车识别成自卸车或装载机。常见做法是给负类单开一个类别或者在训练集里放一批不带标注的图片让模型学会这些不是目标。2.2 三个图像来源固定机位、航拍和抽帧图像来源一般分三条路。自有拍摄最可靠项目上的固定摄像头、无人机航拍、手机随手拍都算版权干净、角度真实。网络图片和公开数据集可以补充夜间、雨天这类稀缺场景但要查清楚授权范围商用前更要谨慎。视频抽帧是快速扩充样本的高效手段工地摄像头通常全天记录抽帧比拍照效率高得多。我一般会在工程现场架一台相机连续录一周覆盖从土方开挖到路面压实的过程然后按间隔抽帧。ffmpeg -i construction_site_day.mp4 -vf fps1 -q:v 2 frames/day_%04d.jpg这条命令把视频每秒抽一帧。fps1可以改成fps1/5也就是每 5 秒抽一帧适合画面变化慢的固定机位-q:v 2控制输出 jpg 质量2 接近无损避免抽帧后二次压缩导致细节丢失。抽出来的帧不能直接进标注因为相邻帧高度相似同一台挖掘机连续十几帧停在同一位置每帧都标会让成本翻倍也会让训练集真实多样性虚高。去重一般按前后帧图像差异判断差异低于阈值就丢弃。航拍视角值得多说一句。固定机位拍到的都是平视或俯视角度但工地验收和大型土方项目经常需要无人机巡检。无人机斜45度视角下的工程机械和地面视角差异很大伸缩臂的轮廓会完全不同。采集时至少要保证 15%20% 的样本来自航拍不然部署在无人机项目上会直接翻车。2.3 清洗脚本先过滤模糊和小目标再送标抽完帧、拍完照要做一轮客观清洗。送到标注团队手里的图如果全是模糊的花的是双份钱。我一般用 OpenCV 的 Laplacian 方差做清晰度过滤同时筛掉尺寸过小的图。import cv2 from pathlib import Path src_dir Path(raw_frames) dst_dir Path(clean_frames) dst_dir.mkdir(exist_okTrue) min_side 640 # 最短边阈值单位像素 lap_threshold 80 # Laplacian 方差阈值低于这个值判定为模糊 for img_path in src_dir.glob(*.jpg): img cv2.imread(str(img_path)) if img is None: continue h, w img.shape[:2] if min(h, w) min_side: continue gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) lap_var cv2.Laplacian(gray, cv2.CV_64F).var() if lap_var lap_threshold: continue cv2.imwrite(str(dst_dir / img_path.name), img, [cv2.IMWRITE_JPEG_QUALITY, 95])min_side参数与后面的训练分辨率强相关如果计划用 640 输入清洗时就把最短边小于 640 的图筛掉否则小尺寸图会被拉伸变形标注框也失真。lap_threshold是经验值白天正常光照的视频帧一般在 120 以上夜间画面会落到 3060可以按这个量级调。过滤完的图像还要人工扫一遍重点看有没有被水印、字幕或工地围挡遮挡的情况这种图再多也只会教坏模型。2.4 最小可用规模按类别、场景、天气去配第一版就想跑出能验证流程的模型我给一个参考区间单类别至少 8001000 张图像每张图里尽量有 2 个以上同类实例七类机械合计至少 6000 张。如果只有单台机器摆拍训练出来的模型换个工地就可能漏检。场景丰富度比总数更重要即使总数到 10000 张全部是晴天白天正面角度模型在雨天、夜间、背光场景基本等于没有。建议按这个矩阵去补齐数据角度上覆盖正面、侧面、俯视、航拍斜视距离上覆盖近景、中景、远景小目标天气上覆盖晴天、阴天、雨天、雾天光照上覆盖白天、黄昏、夜间状态上覆盖作业中、停靠、运输途中。每个类别至少要覆盖 4 个角度和 3 种天气再用夜间和雨天补充 20% 的样本。类别建议图像数覆盖场景要求excavator1000不同臂展角度履带式和轮式都包含loader800铲斗抬起与放下两种状态bulldozer800侧视轮廓为主注意和 loader 的混淆roller800单钢轮和双钢轮、停车与作业状态crane800塔吊与汽车吊视角差异很大concrete mixer truck800尾部进料斗特征夜景车灯状态dump truck800空载与满载、平斗和起斗状态单类样本不够时优先压缩类别数量把相近类目合并也不要拿 100 张图硬训。目标检测是数据密集的活数量不够模型学不到稳定的类别边界。2.5 数据合规与归档别在交付时才发现授权有问题商用项目里这块绕不开。从网络收集的机械图片、视频帧要保留来源记录和授权信息工地上拍到工人面孔或车牌做脱敏处理再入库。归档方面按site/date/camera三级目录整理每张图保留原始拍摄信息。这些工作看着琐碎但模型上线后每一次数据溯源都要靠它尤其是误报引发的责任问题。3. 标注出能训练好模型的框工具、框法与质检3.1 标注工具选型从单机到协作工程机械识别的目标检测标注常用的工具就是 LabelImg、X-AnyLabeling、CVAT 三选一。单人小项目、一两千张图用 X-AnyLabeling 或 LabelImg 就够。LabelImg 是老牌工具保存 PascalVOC XML插件生态成熟CVAT 适合多人协作和视频标注监控视频抽帧项目效率高X-AnyLabeling 内置了 SAM 预标注能力先用分割模型生成候选框再人工修正在工地大画面里找机械能省不少时间。工具适合规模输出格式关键优势LabelImg3000 张以内单人XML/TXT最简单学习成本低X-AnyLabeling5000 张以内单人JSON/TXT集成 SAM 预标注CVAT多人协作/视频XML/TXT任务分配与自动标注无论选哪个最终都要转成 YOLO 格式的 txt。后面训练流程用 YOLO 系模型最顺手格式统一能少踩很多坑。3.2 边界框规则工程机械标注最容易吵起来的三个问题工程机械和普通车辆标注差异很大主要体现在三处。第一框整机还是框车体。挖掘机的臂伸出去占了大半个画面装载机的铲斗举到头顶如果只框车体模型学到的特征是残缺的。定规则为包含驾驶室、底盘和主工作机构伸出臂只要连在车体上就算进框。这个决定在标注一致性上起决定性作用。如果有的标注员只框车身、有的框整机样本边界框分布会非常散mAP 肉眼可见地掉。第二小目标和遮挡目标标不标。监控画面里几十米外的小挖机可能只有 30×20 像素照样要标出来保留这些样本对提升小目标召回率很有价值。遮挡超过 20% 才放弃标注。一个机械被截成两段、只露出一个挖斗时不标避免一个机械被拆成两个框。第三两台机械连在一起怎么切。用画面里能看清的分界线切实在切不开就放弃这张图。不要硬标一个包含两台机械的大框那种框里的特征分布是混乱的模型会学到错误的目标中心位置。夜间、逆光、雨天的图像也照标不误特征看不清但轮廓还在。模型的质量上限由数据里有多少高质量难例决定这部分样本正是工程机械识别数据集的价值所在。3.3 XML 转 YOLO 格式类别表顺序是命根子LabelImg 保存的 VOC XML 转 YOLO txt 有现成脚本但工程机械数据往往是从多个项目合并过来的最容易出错的是类别列表顺序。YOLO 格式的 txt 第一列是类别 ID 数字数字和类别名的对应关系由 data.yaml 决定。很多团队翻车点是改了几次类目后 ID 对不上。我每次合并数据集都先打印一份类别统计。import xml.etree.ElementTree as ET from pathlib import Path CLASSES [excavator, loader, bulldozer, roller, crane, concrete_mixer_truck, dump_truck] # 这个顺序必须与 data.yaml 的 names 完全一致 xml_dir Path(annotations_xml) out_dir Path(labels_yolo) out_dir.mkdir(exist_okTrue) for xml_file in xml_dir.glob(*.xml): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in CLASSES: continue # 负类或不关心的类先跳过 cls_id CLASSES.index(name) bndbox obj.find(bndbox) x_min float(bndbox.find(xmin).text) y_min float(bndbox.find(ymin).text) x_max float(bndbox.find(xmax).text) y_max float(bndbox.find(ymax).text) cx ((x_min x_max) / 2) / img_w # YOLO 格式是归一化的中心点 xywh cy ((y_min y_max) / 2) / img_h bw (x_max - x_min) / img_w bh (y_max - y_min) / img_h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) (out_dir / f{xml_file.stem}.txt).write_text(\n.join(lines)) from collections import Counter counts Counter() for txt in out_dir.glob(*.txt): for line in txt.read_text().strip().splitlines(): counts[int(line.split()[0])] 1 for cls_id, c in sorted(counts.items()): print(f{CLASSES[cls_id]}: {c} instances)脚本逻辑是把 VOC 的绝对坐标转成 YOLO 需要的归一化中心点坐标和宽高CLASSES列表第一项对应 ID 0。末尾的 Counter 统计很关键如果发现 loader 只有 120 个实例而 excavator 有 3500 个就得回去补数据而不是直接开训。转换完还要抽查 txt 内容看有没有某个数值超过 1.0这通常是标注框超出图像边界导致的YOLO 训练时会直接报错或静默忽略。3.4 标注质检先试训再看图不要全标完才验证标注全部完成不意味着可以训练。我一般随机抽 300 张图覆盖之前定的角度和天气矩阵训练 50 个 epoch 做冒烟测试。试训模型 mAP50 如果连 0.3 都到不了优先怀疑标注错误而不是网络结构。两个常用质检手段一是把同一类别的边界框可视化拼成网格图看是否有一类框的形状比例分布异常比如宽度普遍超过高度三倍可能就是多目标粘连框二是用表现最差的模型跑一次全量训练集把漏检目标截图出来如果发现大量漏检其实是标注时漏标了就让标注员回去补。这一步在工程机械数据集里尤其重要因为现场图背景复杂吊臂、钢架容易让标注员漏看目标。4. 用 YOLO 训练自己的数据集流程、命令与参数4.1 目录结构和划分按工地分别按文件随机分工程机械数据最常见的翻车是把同一个视频抽的帧同时分进训练集和验证集。这样验证时模型看到的场景训练时都见过分数虚高现场一测就露馅。正确做法是按工地或视频片段划分train 用 6 个工地val 用 1 个没见过的工地test 再留 1 个工地。目录结构如下construction-machinery/ ├── data.yaml ├── images/ │ ├── train/ │ │ ├── site01_0001.jpg │ │ └── ... │ ├── val/ │ │ └── site07_0001.jpg │ └── test/ │ └── site08_0001.jpg └── labels/ ├── train/ │ ├── site01_0001.txt │ └── ... ├── val/ └── test/data.yaml 内容如下train: construction-machinery/images/train val: construction-machinery/images/val test: construction-machinery/images/test nc: 7 names: [excavator, loader, bulldozer, roller, crane, concrete_mixer_truck, dump_truck]分割脚本的逻辑不是随机抽文件而是从 site 前缀分组后按组分配用 pandas groupby 就能完成关键是分组键是工地 ID。只按文件名随机分的后果是同一工地的背景、光照、机械型号同时在训练集和验证集出现验证指标虚高最后在 test 新工地上一测就打回原形。4.2 模型选型与训练参数为什么我不用默认 640样本量在 600010000 张、七类目标的情况下最稳的路线是从 YOLOv8n 或 yolov8s 起步。n 只适合验证流程是否跑通真正训练建议 s 起步m 适合显存 16G 以上的机器。工程机械的吊臂、挖斗会产生大量细长条目标监控画面里的目标又普遍偏小模型不能选得太轻否则细节特征抓不住。RT-DETR 也可以试标注的数据是同一份切换成本不高。训练启动命令yolo detect train \ dataconstruction-machinery/data.yaml \ modelyolov8s.pt \ imgsz1280 \ epochs200 \ batch8 \ optimizerAdamW \ lr00.001 \ weight_decay0.0005 \ patience50 \ projectruns/detect \ nameexcavator_2025imgsz1280是我在这个场景下的偏好不是默认的 640。工程机械在监控画面里很多是中目标和小目标640 下挖掘机可能只有 20×20 像素特征直接淹没在背景里。升到 1280 能把细节留住代价是显存和训练时长翻倍batch 要降到 8。patience50开启早停连续 50 个 epoch 验证指标不涨就自动停止。lr0从 0.001 而不是 0.01 起步因为预训练权重来自 COCO工程机械和 COCO 的分布差距极大学习率太高容易把已有特征冲乱。显存不足时先降 batch再考虑降 imgsz不要一上来就砍分辨率。训练完成后必看四个产物混淆矩阵、PR 曲线、val 预测图和 per-class 的 mAP 表。整体 mAP 会掩盖挖掘机 0.92、压路机 0.3 这种失衡必须每类单独看。4.3 验证预测命令与关键指标yolo detect predict \ modelruns/detect/excavator_2025/weights/best.pt \ sourcetest/site08 \ imgsz1280 \ conf0.25 \ iou0.45 \ save_txtTrue \ save_confTrueconf0.25是线下评估用的阈值线上部署时按误报率再调高到 0.40.5。工程机械目标在远距离时响应值天然偏低阈值设太高会把真正的小目标过滤掉。iou0.45是 NMS 参数目标密集粘连时两台机械靠太近iou 设太低会吞框设太高会出现大量重复框。保存的 txt 里每行是cls x_center y_center w h conf可以写脚本自动统计某段视频里每类机械的出现次数这就是现场验收的数据基础。验证集的正确用法是只看一次。真正验证泛化能力的是 test 目录里完全没见过的新工地画面。我把 test 的 mAP50-95 记录在一张表里每次数据扩充后重新跑一遍。任何一次新增数据导致 mAP50-95 下降超过 0.02就要警惕新样本标注风格不一致通常是标注规则没有被严格执行。5. 工程机械识别训练里的 5 个高发踩坑点与排查5.1 类别不平衡压路机永远漏检现象训练时 loss 降得很快val mAP 也不差但现场专门盯着压路机测十个漏掉六个。查 per-class 统计excavator 有 3500 个实例roller 只有 150 个。原因工地上的挖掘机几乎每天都在动压路机只在路面施工阶段出现采集到的原始分布天然失衡。解决分三层第一层对压路机图像做 3 倍过采样第二层靠 mosaic 和 copy-paste 增强把少数类目标合成到背景图里第三层在 loss 里给少数类加权重。实务上最重要的还是回到第 2 章的采集矩阵去补压路机在不同工况下的真实样本过采样只是缓解不是根治。5.2 远距离小目标漏检小尺寸框被直接忽略现象训练图尺寸 1920×1080挖掘机在画面远端宽度只有 40 像素检测器根本没框出来。原因图像下采样到 640 后40 像素变成 13 像素特征图上的响应几乎消失。小目标检测问题在这个场景里不是模型架构问题而是输入分辨率问题。解决第一步是把 imgsz 从 640 提到 1280第二步对长视频做滑窗切图把 1920×1080 切成 4 张 640×960 的重叠块分别检测再用坐标映射合并回原图。实际项目里这两步做完远端小挖机的召回率能提升 20 个百分点以上。5.3 负样本缺失导致误报渣土车当自卸车现象统计设备数量时突然多出两倍截图一看模型把一排渣土车全识别成了 dump_truck。原因类别体系里 dump_truck 和渣土车外观接近负样本没有进入训练分布。解决不要把非目标类别直接省略。我在工地采样时会专门拍 5001000 张没有机械、只有车辆和人员的图作为背景YOLO 训练时会把这些图的损失算进背景类或者在标注时单独加一个 truck 负类。加了负类之后dump_truck 的精确率提升非常明显这是工程机械识别数据集最容易忽略的提速手段。5.4 微调直接崩掉loss 发散或卡死在 0.1现象加载预训练权重微调前几个 epoch loss 变成 nan或者 mAP 一直在 0.1 附近不动。原因排查顺序先看 labels 里有没有类别 ID 超出nc-1的比如 data.yaml 只有 7 类但 txt 出现数字 8这是合并数据时类别表顺序不一致再看有没有坐标值超过 1 的这些异常在转换脚本里就要拦掉最后看有没有空标注图像混进训练集。实操时我会在训练命令加上cacheTrue前两三个 epoch 就看一次 loss 曲线。如果 loss 直接发散把 lr0 降到 0.0001 再试。提示微调崩了不要急着调网络先把标注文件全量审查一遍大概率是数据问题而不是模型问题。5.5 跨域失效雨天泥浆车和夜间灯光现象晴天白天训练评估 mAP 0.86雨天上线后直接掉到 0.5。原因工程机械的视觉特征严重受涂装颜色和附着物影响晴天黄色挖掘机清晰可辨雨天全是泥浆色边界对比度大幅下降。解决有两个方向一是训练时把 HSV 增强调大YOLOv8 默认 hsv_h0.015、hsv_s0.7、hsv_v0.4雨天场景我会调到 hsv_s0.9、hsv_v0.6二是收集真实夜间和雨天数据做针对性扩充。合成雨天增强替代不了真实雨天泥浆样本泥浆带来的不只是颜色变化还有表面纹理被覆盖、边缘模糊。数据矩阵里至少保留 15%20% 的真实雨天样本否则模型跨域铁定翻车。6. 从一次性交付变成越用越值钱增量标注与工地验收数据集不是交付一次就结束工程机械的作业状态和涂装随地区差异太大。我现在的固定流程是每接一个新工地先拿旧模型在工地固定机位视频上做预标注置信度高的框直接转成训练样本低置信度的截出来给标注员修正。一天视频处理完能拿到几百张带初标的图人工修正成本比从零标注低一半以上。伪标签过滤脚本思路如下import json with open(predictions.json) as f: preds json.load(f) # [{cls, conf, x1, y1, x2, y2}, ...] high, mid [], [] for p in preds: if p[conf] 0.6: high.append(p) elif p[conf] 0.3: mid.append(p) # high 直接转训练标签mid 转给标注员人工复核0.6 的阈值只是起点如果现场有灯影、落叶造成边缘高相似误报就调到 0.75。高置信度伪标签复核时重点看框有没有完整包住机械中置信度难例要逐个看类别是否标错这部分是增量训练价值最大的样本。验收环节我用固定指标新工地视频里分别统计准确率、召回率和误报数要求准确率不低于 0.9、召回率不低于 0.85再按每类机械单独过一遍。工地经理不会看 mAP他们只会数视频里挖掘机进来几台、出去几台。所以验收脚本里按时间窗口统计进出次数和现场人工计数对比误差在 5% 以内才算通过。这个流程度过了我好几个项目最深刻的教训就是数据采集阶段偷的懒训练和验收阶段都会加倍还回来。前期两千张图如果全是单一视角补数据的成本是采集时的三倍。所以如果你刚开始做工程机械识别数据集先把不同工地、不同天气、不同视角写进采集需求再动手标注。希望这些用法对你有帮助。本文还有配套的精品资源点击获取