
简介这份工程机械识别数据集面向从事目标检测的深度学习开发者与算法学习者尤其适合需要训练工程机械检测模型的YOLO系列、Faster R-CNN、SSD等框架使用者。数据集覆盖Excavator、Loader、Dumb_truck、Mobile_crane、Roller、Bull_dozer、Grader七类工程机械共6338张图片已按训练集、验证集、测试集完成划分并同时提供YOLO格式txt标签与VOC格式xml标签另附指定类别信息的yaml配置文件可直接投入YOLOv5至YOLOv10等系列算法训练。压缩包共2000个文件以1999个txt标注文件和1个yaml配置文件为主整体约361.74MB目录结构清晰便于按类别与划分快速检索。目前已有308人学习下载适合希望省去数据采集与标注环节、直接验证模型效果或开展工程机械场景检测研究的中高级开发者。1. 工程机械识别数据集从工地监控到目标检测落地的第一道坎工地监控画面里挖掘机、装载机、塔吊、混凝土搅拌车混在一起远看都是黄色铁疙瘩近看姿态各异、遮挡严重。想用目标检测模型自动识别它们第一个卡住你的往往不是模型结构而是数据集。工程机械识别数据集属于典型的垂直领域目标检测数据它要解决的是「在复杂工地场景下把不同类别的工程机械框出来并分类」这件事。适合谁用做智慧工地、施工安全监测、设备调度统计的算法工程师以及想拿真实工业场景练手目标检测的开发者。这类数据集和 COCO、VOC 那种通用数据集最大的区别在于类别少但类间差异小背景脏乱标注一致性难保证。你拿通用预训练权重直接微调mAP 经常卡在 0.5 上下上不去问题多半出在数据本身而不是模型。这一章先把「工程机械识别数据集到底长什么样、为什么难、值不值得投入」讲清楚后面几章再落到具体怎么做标注、怎么转格式、怎么训练和排查。2. 工程机械识别数据集长什么样类别体系与采集边界2.1 类别怎么定别一上来就分二十类工程机械识别最容易翻车的地方是类别体系设计。新手常犯的错是照着设备台账分挖掘机还分履带式、轮式、破碎锤挖掘机装载机分铲斗、抓木机……结果每类样本只有几十张模型根本学不动。我一般建议第一版控制在 6 到 10 个粗类按「外观差异明显 业务需要区分」两个条件筛。常见的工程机械识别数据集类别体系大致是这样类别典型外观特征易混对象建议最少样本数挖掘机动臂斗杆铲斗履带底盘抓料机800装载机前端大铲斗铰接车身推土机600塔吊高耸桁架结构水平臂施工电梯400汽车吊轮式底盘伸缩臂混凝土泵车500混凝土搅拌车圆柱搅拌罐倾斜布置油罐车500推土机前端推铲履带装载机400压路机圆柱钢轮平地机300高空作业车折叠臂工作斗汽车吊300这张表不是让你照抄而是给你一个「类间可分性」的判断框架。挖掘机和抓料机外观接近如果业务上不需要区分就合并成一类塔吊和施工电梯差异大但远距离小目标都模糊是否分开取决于你的摄像头分辨率和拍摄距离。提示类别数每增加一类标注成本大约增加 15% 到 25%但 mAP 提升可能只有 1 到 2 个点。先做减法跑通基线再考虑细分。2.2 采集边界工地场景的四个变量工程机械识别数据集的采集质量取决于四个变量拍摄高度、光照条件、遮挡程度、设备姿态。这四个变量决定了你的模型上线后能不能扛住真实画面。拍摄高度分地面平视、塔吊视角、无人机俯拍。平视视角设备互相遮挡严重俯拍视角设备形状变形但遮挡少。如果你的部署场景是固定枪机就按枪机高度采如果是无人机巡检就按俯拍采。别拿平视数据训出来的模型去跑俯拍画面mAP 掉 20 个点是常事。光照条件要覆盖白天强光、阴天、傍晚、夜间补光。工地夜间施工很常见但夜间图像噪声大、对比度低如果训练集里夜间样本少于 10%模型夜间基本失效。我一般要求夜间样本占比不低于 20%哪怕用数据增强补。遮挡程度分无遮挡、部分遮挡、严重遮挡。工地场景里设备互相遮挡、被建材遮挡、被围挡遮挡是常态。标注时对遮挡超过 70% 的目标建议标为「困难样本」并在训练时单独统计。设备姿态包括静止、作业中、运输中。作业中的挖掘机动臂位置变化大如果训练集全是静止姿态模型对作业中设备的召回会明显下降。2.3 标注规范框怎么画才不坑自己目标检测标注的核心是边界框一致性。工程机械识别数据集标注最容易出的问题是动臂、铲斗这些伸展部件算不算进框我的做法是——算。边界框要包含设备所有可见部分包括伸出的动臂和铲斗因为推理时模型看到的就是完整设备。但如果动臂伸出画面外就只标画面内可见部分不要脑补。标注工具用 LabelImg、CVAT、X-AnyLabeling 都行关键是导出格式统一。工程机械识别数据集常见导出格式是 PASCAL VOC XML 和 YOLO TXT。VOC 可读性好YOLO 训练方便。我一般先用 CVAT 标导出 VOC再写脚本转 YOLO。标注时还有三个细节一是框要贴紧目标边缘留白不超过 5 个像素二是同类目标框的大小要一致别一个框松一个框紧三是遮挡目标如果可见部分不足 30%建议标为 ignore 区域而不是强行标框否则模型学到的是噪声。注意标注一致性比标注精度更重要。十个标注员标同一张图框位置差 10 个像素可以接受但如果有人把铲斗算进去有人不算模型就会困惑。标前统一规范标后抽检 5% 到 10%。3. 从原始视频到 YOLO 格式工程机械识别数据集的转换流水线3.1 抽帧别用等间隔抽帧糊弄原始数据如果是工地监控视频第一步是抽帧。很多人直接用 ffmpeg 等间隔抽帧比如每秒抽一帧。这在工程机械识别场景里会出问题设备静止时抽出来的帧几乎一样浪费标注成本设备快速移动时又可能漏掉关键姿态。我一般用「运动检测 间隔抽帧」的组合策略。先用帧差法或轻量背景建模找出画面有明显变化的片段再在变化片段里加密抽帧。下面是一个用 OpenCV 做运动检测抽帧的脚本import cv2 import os import numpy as np def extract_frames_by_motion(video_path, out_dir, diff_threshold25, min_interval15): 基于帧间差异抽帧差异大于阈值时保存当前帧 video_path: 输入视频路径 out_dir: 输出帧目录 diff_threshold: 帧差均值阈值越大越不敏感 min_interval: 最小抽帧间隔帧数避免连续保存相似帧 os.makedirs(out_dir, exist_okTrue) cap cv2.VideoCapture(video_path) prev_gray None frame_idx 0 saved 0 last_save -min_interval while True: ret, frame cap.read() if not ret: break gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray cv2.GaussianBlur(gray, (5, 5), 0) if prev_gray is not None: diff cv2.absdiff(prev_gray, gray) mean_diff np.mean(diff) # 运动足够大且距上次保存超过最小间隔 if mean_diff diff_threshold and (frame_idx - last_save) min_interval: cv2.imwrite(os.path.join(out_dir, fframe_{frame_idx:06d}.jpg), frame) saved 1 last_save frame_idx prev_gray gray frame_idx 1 cap.release() print(f总帧数 {frame_idx}保存 {saved} 帧) extract_frames_by_motion(site_video.mp4, frames/, diff_threshold20, min_interval15)这段代码的逻辑是对每帧做灰度化和高斯模糊降噪计算与前一帧的绝对差如果平均差异超过阈值且距离上次保存超过最小间隔就保存当前帧。diff_threshold控制灵敏度工地监控建议 15 到 30 之间调min_interval控制抽帧密度25fps 视频设 15 表示最快约 0.6 秒抽一帧。抽完帧后人工过一遍删掉模糊、重复、无目标的帧再进入标注。3.2 VOC 转 YOLO四个边界坑标注完导出 VOC XML 后要转成 YOLO 的 TXT 格式。YOLO 格式是类别索引 中心x 中心y 宽 高全部归一化到 0 到 1。转换脚本网上一堆但工程机械识别数据集有几个边界坑第一个坑是类别索引映射。VOC 里类别是字符串YOLO 要整数索引必须建一个固定的类别到索引的映射表训练和推理共用。别用sorted(set(classes))临时生成否则增删类别后索引全乱。第二个坑是坐标越界。VOC 的 xmin、ymin 可能小于 0 或大于图像宽高归一化后会出现负值或大于 1 的值。YOLO 训练时这些框会被静默丢弃或报错。转换时要 clamp 到 [0, 1]。第三个坑是宽高为 0。有些标注框 xmin 等于 xmax转换后宽为 0训练时除零或产生 NaN。转换前要过滤掉宽高小于 2 像素的框。第四个坑是图像和标注不对应。VOC 的 XML 文件名要和图片文件名一致转换后 TXT 也要同名。如果图片是.jpg标注是.JPG或者有图片没标注、有标注没图片训练时会报错或漏样本。import xml.etree.ElementTree as ET import os CLASS_MAP { excavator: 0, loader: 1, tower_crane: 2, truck_crane: 3, mixer_truck: 4, bulldozer: 5, roller: 6, aerial_platform: 7 } def voc_to_yolo(xml_path, img_w, img_h, out_path): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text.strip() if name not in CLASS_MAP: continue cls_id CLASS_MAP[name] bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # clamp 到图像范围 xmin max(0, min(xmin, img_w)) xmax max(0, min(xmax, img_w)) ymin max(0, min(ymin, img_h)) ymax max(0, min(ymax, img_h)) w xmax - xmin h ymax - ymin if w 2 or h 2: # 过滤无效框 continue cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h nw w / img_w nh h / img_h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))CLASS_MAP必须固定训练配置里的names顺序要和它一致。img_w和img_h从对应图片读取别硬编码。转换后建议写个校验脚本统计每类框数量、宽高分布、是否有空标注文件空标注文件在 YOLO 里表示负样本但工程机械识别数据集里空图太多会拉低召回。3.3 数据集划分别让同一段视频的帧同时进训练和验证工程机械识别数据集的划分有个隐蔽陷阱如果按帧随机划分同一段视频的相邻帧会同时出现在训练集和验证集里。这些帧几乎一样验证集 mAP 会虚高上线后掉得厉害。正确做法是按视频源或时间段划分。比如有 20 段工地视频用 14 段抽的帧做训练3 段做验证3 段做测试。如果只有一段长视频就按时间前后切分前 70% 训练中间 15% 验证后 15% 测试。这样验证集才能真正反映模型在未见过的场景上的表现。划分完生成train.txt、val.txt、test.txt每行是图片路径。YOLO 训练配置里用train: train.txt指定。路径建议用绝对路径或相对于数据集根目录的路径别用当前工作目录的相对路径否则换个终端就找不到。4. 训练工程机械识别模型参数怎么设、指标怎么看4.1 基线选择YOLOv8 还是 YOLOv11工程机械识别数据集的目标检测基线目前主流是 YOLOv8 和 YOLOv11。两者在工地场景的差异没有宣传的那么大YOLOv11 在小目标上略好YOLOv8 的社区资源和部署工具链更成熟。如果你要快速跑通选 YOLOv8n 或 YOLOv8s如果追求精度且算力够选 YOLOv11m。别一上来就上大模型。工程机械识别数据集通常几千到几万张YOLOv8n 在 5000 张图上微调mAP0.5 能到 0.75 左右YOLOv8x 可能只高 2 到 3 个点但训练时间和显存翻几倍。先用小模型把数据问题暴露出来再换大模型。预训练权重用 COCO 的yolov8n.pt。虽然 COCO 里没有工程机械类别但底层特征提取器学到的边缘、纹理、形状特征是可迁移的。从零训练在几千张图上几乎不可能收敛好。4.2 训练命令与关键参数YOLOv8 训练命令yolo detect train \ dataexcavator.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ augmentTrue \ mosaic1.0 \ mixup0.1 \ degrees10 \ translate0.1 \ scale0.5 \ fliplr0.5 \ device0dataexcavator.yaml是数据集配置文件里面写train、val、nc、names。imgsz640是输入尺寸工地远距离小目标多的话可以提到 1280但显存和速度代价大。batch16根据显存调8G 显存跑 640 大概能到 16。lr00.01是初始学习率微调时如果 loss 震荡厉害降到 0.001。patience30表示 30 轮验证指标不提升就早停避免过拟合。数据增强参数里mosaic1.0是 YOLO 默认的四图拼接增强对工程机械识别有帮助因为工地场景目标密集。mixup0.1轻微混合别设太高否则小目标被淹没。degrees10旋转增强工地摄像头有倾斜角度时有用。fliplr0.5水平翻转注意如果设备有方向性比如挖掘机左右不对称翻转可能引入噪声但一般影响不大。4.3 指标解读mAP 之外要看什么训练日志里重点看四个指标mAP0.5、mAP0.5:0.95、precision、recall。工程机械识别数据集里mAP0.5到 0.8 以上算可用mAP0.5:0.95通常只有 0.5 到 0.6因为框的定位精度受遮挡影响大。但别只看 mAP。工地场景更关心召回率漏检一台挖掘机可能比误检更严重。如果 recall 低于 0.7先查标注有没有漏标再查训练集里该类样本是否太少。precision 低则可能是背景误检比如把黄色围挡认成挖掘机这时候要加负样本。混淆矩阵也要看。工程机械识别数据集里挖掘机和装载机、汽车吊和混凝土泵车最容易混。如果混淆矩阵显示这两对互相误判严重要么合并类别要么针对性补样本。提示训练完在测试集上跑一遍yolo detect val导出 PR 曲线和混淆矩阵。别用验证集指标当最终结论验证集可能被早停策略间接优化过。5. 工程机械识别数据集避坑五条血泪经验5.1 现象训练 loss 正常下降但 mAP 不动原因标注框和图像不对应或者类别索引映射错了。常见情况是 VOC 转 YOLO 时类别顺序和 YAML 里的names不一致模型学的是错位标签。解决写脚本可视化抽查 20 张图的标注框把 YOLO TXT 画回图像上肉眼确认框位置和类别正确。再检查 YAML 的names顺序和CLASS_MAP是否一致。5.2 现象模型在验证集上很好上线后漏检严重原因数据集划分按帧随机分训练集和验证集有大量相似帧验证集指标虚高。或者采集场景太单一没有覆盖部署场景的光照和角度。解决按视频源或时间段重新划分数据集确保验证集和测试集来自不同视频。补采部署场景的样本尤其是夜间和遮挡场景。5.3 现象小目标远距离塔吊、高空作业车召回极低原因输入尺寸 640 下远距离目标只有十几个像素特征提取器根本抓不到。或者数据集中小目标样本占比太低。解决把imgsz提到 1280或者用切片推理SAHI。数据层面对小目标密集的区域单独裁剪放大后加入训练集。YOLOv8 的 P2 层可以保留更多小目标特征但需要改模型结构。5.4 现象夜间画面几乎全漏检原因训练集夜间样本太少模型没学过夜间特征。或者夜间图像噪声大和白天特征分布差异大。解决夜间样本占比提到 20% 以上训练时加亮度、对比度增强。如果夜间画面是红外或补光考虑单独训一个夜间模型或者用域适应方法。5.5 现象同一类设备框大小差异大模型定位不准原因标注时框的松紧不一致有人贴边有人留白。或者设备姿态变化大动臂伸缩导致框尺寸变化剧烈。解决统一标注规范框贴紧可见部分。对姿态变化大的类别增加不同姿态的样本。训练时用scale0.5增强让模型适应尺度变化。6. 把工程机械识别数据集用出价值增量迭代与部署前验证数据集不是标完就完事工程机械识别这类垂直场景增量迭代才是常态。我的习惯是每上线一个新工地先跑一周推理把置信度低于 0.4 的检测结果和漏检画面截下来人工筛一遍挑出真正有价值的困难样本补标。这样每轮迭代补 200 到 500 张模型对特定场景的适应会明显变好。部署前验证有个容易被忽略的环节用实际部署的摄像头和推理硬件跑一遍端到端测试。训练时用的是 640 分辨率、RTX 显卡部署可能是 1080p 输入、Jetson 或算力盒子。分辨率缩放、量化、后处理阈值都会影响最终效果。我一般会在目标硬件上跑 500 张测试图统计 mAP 和推理延迟和训练环境对比。如果 mAP 掉超过 5 个点就要查预处理是否一致、量化是否损失太大。还有一个技巧是「类别分组评估」。工程机械识别数据集里不同类别的业务价值不同。塔吊漏检可能导致安全事故压路机漏检只是统计少一台。部署前按类别单独看召回率对高价值类别设更低的置信度阈值对低价值类别设高阈值减少误报。这个策略比统一阈值实用得多。最后说个我踩过的坑有次模型在测试集上 mAP 0.82上线后调度员反馈「搅拌车经常认成油罐车」。查了半天发现测试集里搅拌车样本都是新式白色罐体而实际工地有一批老旧灰色罐体训练集里没有。补了 300 张灰色罐体样本后问题解决。工程机械识别数据集的覆盖度永远比模型结构更值得你花时间。希望帮到你。本文还有配套的精品资源点击获取