简介:这份工程机械识别数据集面向从事目标检测的深度学习开发者与算法学习者,尤其适合需要训练工程机械检测模型的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_threshold=25, min_interval=15): """ 基于帧间差异抽帧:差异大于阈值时保存当前帧 video_path: 输入视频路径 out_dir: 输出帧目录 diff_threshold: 帧差均值阈值,越大越不敏感 min_interval: 最小抽帧间隔(帧数),避免连续保存相似帧 """ os.makedirs(out_dir, exist_ok=True) 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, f"frame_{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_threshold=20, min_interval=15)这段代码的逻辑是:对每帧做灰度化和高斯模糊降噪,计算与前一帧的绝对差,如果平均差异超过阈值且距离上次保存超过最小间隔,就保存当前帧。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 张图上微调,mAP@0.5 能到 0.75 左右,YOLOv8x 可能只高 2 到 3 个点,但训练时间和显存翻几倍。先用小模型把数据问题暴露出来,再换大模型。
预训练权重用 COCO 的yolov8n.pt。虽然 COCO 里没有工程机械类别,但底层特征提取器学到的边缘、纹理、形状特征是可迁移的。从零训练在几千张图上几乎不可能收敛好。
4.2 训练命令与关键参数
YOLOv8 训练命令:
yolo detect train \ data=excavator.yaml \ model=yolov8n.pt \ epochs=150 \ imgsz=640 \ batch=16 \ lr0=0.01 \ lrf=0.01 \ patience=30 \ augment=True \ mosaic=1.0 \ mixup=0.1 \ degrees=10 \ translate=0.1 \ scale=0.5 \ fliplr=0.5 \ device=0data=excavator.yaml是数据集配置文件,里面写train、val、nc、names。imgsz=640是输入尺寸,工地远距离小目标多的话可以提到 1280,但显存和速度代价大。batch=16根据显存调,8G 显存跑 640 大概能到 16。lr0=0.01是初始学习率,微调时如果 loss 震荡厉害降到 0.001。patience=30表示 30 轮验证指标不提升就早停,避免过拟合。
数据增强参数里,mosaic=1.0是 YOLO 默认的四图拼接增强,对工程机械识别有帮助,因为工地场景目标密集。mixup=0.1轻微混合,别设太高否则小目标被淹没。degrees=10旋转增强,工地摄像头有倾斜角度时有用。fliplr=0.5水平翻转,注意如果设备有方向性(比如挖掘机左右不对称),翻转可能引入噪声,但一般影响不大。
4.3 指标解读:mAP 之外要看什么
训练日志里重点看四个指标:mAP@0.5、mAP@0.5:0.95、precision、recall。工程机械识别数据集里,mAP@0.5到 0.8 以上算可用,mAP@0.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 现象:同一类设备框大小差异大,模型定位不准
原因:标注时框的松紧不一致,有人贴边有人留白。或者设备姿态变化大,动臂伸缩导致框尺寸变化剧烈。
解决:统一标注规范,框贴紧可见部分。对姿态变化大的类别,增加不同姿态的样本。训练时用scale=0.5增强,让模型适应尺度变化。
6. 把工程机械识别数据集用出价值:增量迭代与部署前验证
数据集不是标完就完事,工程机械识别这类垂直场景,增量迭代才是常态。我的习惯是每上线一个新工地,先跑一周推理,把置信度低于 0.4 的检测结果和漏检画面截下来,人工筛一遍,挑出真正有价值的困难样本补标。这样每轮迭代补 200 到 500 张,模型对特定场景的适应会明显变好。
部署前验证有个容易被忽略的环节:用实际部署的摄像头和推理硬件跑一遍端到端测试。训练时用的是 640 分辨率、RTX 显卡,部署可能是 1080p 输入、Jetson 或算力盒子。分辨率缩放、量化、后处理阈值都会影响最终效果。我一般会在目标硬件上跑 500 张测试图,统计 mAP 和推理延迟,和训练环境对比。如果 mAP 掉超过 5 个点,就要查预处理是否一致、量化是否损失太大。
还有一个技巧是「类别分组评估」。工程机械识别数据集里,不同类别的业务价值不同。塔吊漏检可能导致安全事故,压路机漏检只是统计少一台。部署前按类别单独看召回率,对高价值类别设更低的置信度阈值,对低价值类别设高阈值减少误报。这个策略比统一阈值实用得多。
最后说个我踩过的坑:有次模型在测试集上 mAP 0.82,上线后调度员反馈「搅拌车经常认成油罐车」。查了半天发现测试集里搅拌车样本都是新式白色罐体,而实际工地有一批老旧灰色罐体,训练集里没有。补了 300 张灰色罐体样本后问题解决。工程机械识别数据集的覆盖度,永远比模型结构更值得你花时间。希望帮到你。
本文还有配套的精品资源,点击获取