简介本资源为面向YOLO系列目标检测算法的工程机械数据集适用于从事施工场景识别、车辆检测的算法工程师与高校研究者可解决挖掘机、自卸卡车、轮式装载机三类目标检测任务中样本不足的问题。压缩包共2000个文件以xml标注文件为主同时提供yolo格式txt与voc格式xml两套标签分别存放于独立文件夹文件名末尾标注对应类别名称并附带data.yaml配置文件可直接用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等模型的训练与验证测试。数据集已按训练验证需求划分完毕yolo标签采用归一化中心点与宽高格式便于直接读取。目前已有80人学习下载适合需要快速搭建工程机械检测基线、验证模型迁移效果或补充施工场景样本的读者参考使用。1. 挖掘机数据集与 YOLO 训练2656 张带标签图像能跑出什么结果工地扬尘里那台自卸卡车刚倒完土轮式装载机又贴着边线推过来这种场景做目标检测的人应该不陌生。标题里的这份数据集核心就是 2656 张工地机械图像带标注覆盖自卸卡车、挖掘机、轮式装载机三类目标配合 YOLO 算法做训练和部署。它解决的是工程机械识别里最现实的问题公开数据集里这类样本少、类别混淆严重、背景干扰大自己从零标又费时费力。适合谁做智慧工地、矿山调度、土方量统计、无人驾驶工程车辆感知的团队以及想拿一个真实工业场景练 YOLO 全流程的开发者。三类目标在视觉上差异不算大尤其是挖掘机和轮式装载机在远距离、遮挡、逆光下容易混这也是后面调参和增强要重点处理的地方。数据集本身不是万能药2656 张的规模决定了它更适合做基线验证和迁移学习起点而不是直接冲高精度上线。2. 先搞清楚三类目标的视觉边界为什么挖掘机和轮式装载机会互相误检2.1 自卸卡车、挖掘机、轮式装载机的形态差异与标注难点自卸卡车通常有明确的货厢和驾驶室分离结构车体长侧面轮廓方正在图像里占宽比较大。挖掘机分履带式和轮式核心特征是动臂、斗杆、铲斗组成的作业装置但作业时姿态变化极大铲斗可能被土堆遮挡动臂可能伸出画面。轮式装载机则是前装铲斗、铰接车身轮胎明显铲斗贴近地面。问题在于当挖掘机收起作业装置行驶时和轮式装载机的侧面轮廓相似度会上升当轮式装载机举起铲斗时又容易被标成挖掘机。标注时如果只框主体不区分作业装置状态模型学到的特征就会糊。常见做法是标注时统一框住整车加作业装置不单独标铲斗或动臂。但这样做的代价是当作业装置被遮挡时框会缩到车身导致同一类目标框尺度波动大。我一般会要求标注员对遮挡超过 40% 的作业装置不强行外扩保持车身紧框同时在训练时用 mosaic 和 copy-paste 增强来补遮挡样本。这份 2656 张的数据集如果已经标好先别急着训抽 100 张看看三类框的宽高比分布如果挖掘机和轮式装载机的宽高比直方图重叠超过 30%后面分类头压力会很大。2.2 从标注文件到 YOLO 格式转换脚本与四个边界坑数据集原始标注可能是 VOC XML、COCO JSON 或 LabelImg 的 txt。YOLO 训练需要每张图一个 txt每行class_id x_center y_center width height全部归一化到 0-1。下面这个脚本处理 VOC 转 YOLO同时做边界裁剪和非法框过滤。import os import xml.etree.ElementTree as ET # 类别映射顺序必须和训练时 data.yaml 的 names 一致 CLASS_MAP {dump_truck: 0, excavator: 1, wheel_loader: 2} def voc_to_yolo(xml_path, img_w, img_h, out_txt): 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) # 边界裁剪防止标注超出图像 xmin max(0, min(xmin, img_w - 1)) ymin max(0, min(ymin, img_h - 1)) xmax max(0, min(xmax, img_w - 1)) ymax max(0, min(ymax, img_h - 1)) w xmax - xmin h ymax - ymin # 过滤宽高小于 2 像素的无效框 if w 2 or h 2: continue x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h nw w / img_w nh h / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {nw:.6f} {nh:.6f}) with open(out_txt, w) as f: f.write(\n.join(lines))逻辑说明先按类别映射过滤掉不需要的类再做坐标裁剪避免标注框超出图像边界导致归一化后出现负值或大于 1。宽高小于 2 像素的框直接丢弃这类框在训练时会产生极端梯度。参数上CLASS_MAP的顺序必须和data.yaml里的names完全一致否则类别会错位。x_center和y_center保留 6 位小数足够YOLO 内部会再处理。四个边界坑分别是标注框超出图像、宽高为零、类别名大小写不一致、图像尺寸和 XML 里记录的不一致。最后一个坑最隐蔽如果 XML 里的size和实际图像尺寸不同归一化会全错建议用 PIL 重新读图获取真实宽高。2.3 数据划分与 data.yaml 配置别让验证集泄漏进训练集2656 张按 8:1:1 划分训练 2124 张验证 266 张测试 266 张。划分时按场景或拍摄批次分不要随机打散否则同一段视频的相邻帧会同时出现在训练和验证里验证指标虚高。下面是一个可用的data.yaml。path: ./excavator_dataset train: images/train val: images/val test: images/test nc: 3 names: 0: dump_truck 1: excavator 2: wheel_loaderpath是数据集根目录train/val/test是相对路径。nc必须等于类别数names的键值对顺序和转换脚本里的CLASS_MAP一致。如果后面要加类别改这里和转换脚本重新生成标签。验证集和测试集不要参与任何增强以外的训练决策早停和调参只看验证集测试集留到最后跑一次。3. YOLO 训练配置从预训练权重到 2656 张图像的收敛策略3.1 选 YOLOv8 还是 YOLOv52656 张规模下的模型容量取舍2656 张属于小规模数据集模型容量太大容易过拟合太小又学不到挖掘机作业装置这种细粒度特征。YOLOv8n 和 YOLOv5s 是常见起点。YOLOv8n 参数量约 3.2MYOLOv5s 约 7.2M。在这个数据量下YOLOv8n 通常收敛更快验证集 mAP 在 50 轮左右能到 0.75 上下YOLOv5s 可能略高但训练时间翻倍。如果 GPU 是 V100 或同级可以试 YOLOv8s参数量 11.2M但必须配合强增强和早停。我的建议是先用 YOLOv8n 跑通全流程看混淆矩阵里挖掘机和轮式装载机的误检率如果这两类互相误检超过 15%再考虑换大模型或加分类损失权重。预训练权重用 COCO 上训好的不要从零训。COCO 里虽然有 truck 和 excavator 相关类但和工程机械差异大不过底层边缘和纹理特征可迁移。加载预训练权重时注意如果nc和 COCO 的 80 类不同检测头会重新初始化这是正常的。训练命令如下。yolo detect train \ data./excavator_dataset/data.yaml \ modelyolov8n.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience30 \ device0 \ projectruns/excavator \ nameyolov8n_baselineepochs150配合patience30如果 30 轮验证 mAP 不升就停。imgsz640是默认值如果图像里小目标多比如远距离的轮式装载机可以提到 960但显存占用会明显上升。batch16在 16G 显存下跑 640 分辨率够用不够就降到 8。lr00.01是初始学习率小数据集可以降到 0.005 减少震荡。lrf0.01是最终学习率因子配合余弦退火。3.2 针对工程机械的增强参数mosaic、mixup 和 copy-paste 怎么设默认增强里 mosaic 概率 1.0mixup 0.0copy-paste 0.0。对这份数据mosaic 保持 0.8-1.0 能显著提升小目标和遮挡场景。mixup 建议开到 0.1-0.15让模型见过挖掘机和轮式装载机叠加的模糊边界减少误检。copy-paste 需要分割掩码如果只有检测框可以用框级 copy-paste把一类目标裁剪后贴到另一张图概率设 0.1-0.2。HSV 增强里hsv_h0.015hsv_s0.7hsv_v0.4工地场景光照变化大饱和度增强可以模拟扬尘和逆光。翻转fliplr0.5flipud0.0工程机械上下翻转不符合物理。缩放scale0.5平移translate0.1。如果训练中 BN 崩溃表现为 loss 突然变 NaN常见原因是 batch 太小或学习率太高。把batch提到 16 以上或者把lr0降到 0.001加warmup_epochs3。YOLOv8 默认有 warmup但小数据集上 warmup 轮数可以加到 5。3.3 训练过程监控看哪些曲线能提前发现挖掘机与装载机混淆训练时重点看三个东西train/box_loss、val/box_loss和混淆矩阵。如果train/box_loss持续下降但val/box_loss在 30 轮后回升说明过拟合早停或加增强。混淆矩阵里挖掘机和轮式装载机的对角线数值如果低于 0.7说明这两类没分开。这时候可以看验证集预测图如果发现模型把轮式装载机的铲斗举高状态判成挖掘机说明标注里这类样本的框可能不一致。解决办法是在data.yaml里加一个excavator_working子类或者用分类损失加权把这两类的分类损失系数调高。YOLOv8 不直接暴露分类损失权重但可以通过cls1.5这种超参调整具体在default.yaml里改cls增益。另一个指标是metrics/mAP50-95如果 mAP50 高但 mAP50-95 低说明框的位置不够准可能是标注框松紧不一致。这时候回看标注统一框的松紧标准重新训。4. 推理与部署把训练好的挖掘机检测模型跑在视频流上4.1 用 ONNX 导出和 Python 推理从权重到实际画面框训练完的best.pt可以导出 ONNX方便部署到不同平台。导出命令yolo export modelruns/excavator/yolov8n_baseline/weights/best.pt formatonnx opset12 simplifyTrueopset12兼容性好simplifyTrue会做图优化。导出后得到best.onnx。下面是用 OpenCV 和 ONNXRuntime 做视频推理的最小代码。import cv2 import numpy as np import onnxruntime as ort # 加载 ONNX 模型 session ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider, CPUExecutionProvider]) input_name session.get_inputs()[0].name # 类别名顺序和训练一致 CLASSES [dump_truck, excavator, wheel_loader] # 预处理resize 到 640x640归一化HWC 转 CHW加 batch 维 def preprocess(img, size640): h, w img.shape[:2] scale min(size / w, size / h) nw, nh int(w * scale), int(h * scale) resized cv2.resize(img, (nw, nh)) canvas np.full((size, size, 3), 114, dtypenp.uint8) canvas[:nh, :nw] resized blob canvas[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0 blob np.expand_dims(blob, axis0) return blob, scale, nw, nh cap cv2.VideoCapture(site.mp4) while cap.isOpened(): ret, frame cap.read() if not ret: break blob, scale, nw, nh preprocess(frame) outputs session.run(None, {input_name: blob}) # YOLOv8 输出形状 [1, 4nc, 8400]转置后处理 preds outputs[0][0].T boxes, scores, class_ids [], [], [] for pred in preds: cls_scores pred[4:] cls_id int(np.argmax(cls_scores)) conf float(cls_scores[cls_id]) if conf 0.4: continue x, y, w, h pred[:4] # 还原到原图坐标 x1 (x - w / 2) / scale y1 (y - h / 2) / scale boxes.append([x1, y1, w / scale, h / scale]) scores.append(conf) class_ids.append(cls_id) # NMS 略可用 cv2.dnn.NMSBoxes for box, score, cid in zip(boxes, scores, class_ids): x, y, w, h [int(v) for v in box] cv2.rectangle(frame, (x, y), (x w, y h), (0, 255, 0), 2) cv2.putText(frame, f{CLASSES[cid]} {score:.2f}, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imshow(detect, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()预处理里用 114 灰度填充保持宽高比避免拉伸导致挖掘机动臂变形。conf 0.4是置信度阈值工地场景误检代价高可以提到 0.5。NMS 的 IoU 阈值建议 0.45如果同一台挖掘机出现多个框降到 0.4。ONNXRuntime 的CUDAExecutionProvider需要装对应版本没有 GPU 就用 CPU速度慢但能跑。4.2 视频流推理的帧间稳定性减少闪烁的三种做法逐帧检测会出现框闪烁尤其是远距离的轮式装载机。三种做法一是跟踪算法比如 ByteTrack把检测框和轨迹关联轨迹丢失几帧再出现时用预测框补二是多帧投票连续 3 帧里同一位置出现 2 次以上才输出三是提高输入分辨率960 比 640 的框更稳但帧率下降。我一般先用 ByteTrackYOLOv8 自带model.track接口改几行就能用。如果部署环境算力有限用多帧投票缓存最近 5 帧的检测结果按 IoU 聚类后取平均框。5. 避坑与排查2656 张工程机械数据集训练中最容易翻车的五件事5.1 验证集 mAP 很高但实际画面漏检严重现象验证集 mAP50 到 0.9但拿现场视频跑挖掘机漏检一半。原因验证集和训练集来自同一批图像场景、光照、角度分布一致模型过拟合到这批数据。解决从现场视频里抽 200 帧人工标一遍做独立测试集只看这个测试集的指标。如果测试集 mAP 低于 0.6说明泛化不够加更多场景增强或者收集不同工地的图像补充训练。5.2 训练到一半 loss 变 NaNBN 崩溃现象训练日志里box_loss突然变成nan之后所有指标失效。原因小 batch 下 BN 统计量不稳定或者学习率太高导致梯度爆炸。解决把batch从 8 提到 16lr0从 0.01 降到 0.001加warmup_epochs5。如果还崩换AdamW优化器YOLOv8 默认是SGD小数据集上AdamW更稳但收敛可能慢一点。5.3 挖掘机和轮式装载机互相误检混淆矩阵对角线低现象混淆矩阵里挖掘机被预测成轮式装载机的比例超过 20%。原因两类在特定姿态下轮廓相似标注时没有区分作业状态。解决在标注里加子类比如excavator_working和excavator_travel或者用 copy-paste 增强把两类目标贴到同一张图里强制模型学区分特征。另一个办法是提高输入分辨率到 960让铲斗和动臂的细节更清晰。5.4 图像尺寸和标注尺寸不一致导致框全错现象训练时 loss 不降可视化预测框全部偏移。原因XML 里记录的图像宽高和实际图像不一致归一化坐标算错。解决转换脚本里不要用 XML 的size用 PIL 或 OpenCV 重新读图获取真实宽高。批量检查一遍把所有不一致的样本找出来重新生成标签。5.5 推理时框抖动严重视频不可用现象视频里同一台自卸卡车框忽大忽小甚至闪烁。原因逐帧独立检测没有时序关联。解决用 ByteTrack 或 Bot-SORT 做跟踪YOLOv8 的model.track支持。如果不想加跟踪把置信度阈值从 0.4 提到 0.55减少低质量框同时用多帧投票平滑。注意提高阈值会漏检远距离小目标需要权衡。6. 把 2656 张用到极致半自动标注和难例挖掘的闭环这份数据集规模不大想提升精度最划算的不是换更大的模型而是把 2656 张的标注质量提上去同时用模型去挖现场视频里的难例。具体做法先用当前best.pt对现场未标注视频做推理把置信度在 0.3-0.5 之间的框导出来这些是模型不确定的样本人工复核后加入训练集。每轮加 100-200 张重训一次看测试集 mAP 变化。这个闭环跑三轮通常能把挖掘机和轮式装载机的误检率降一半。半自动标注用model.predict生成预标注再导入 LabelImg 或 CVAT 微调。YOLOv8 的save_txtTrue会输出 YOLO 格式的预测框直接当预标注用。注意预标注的框可能偏松人工要收紧到目标边缘。另一个技巧是难例挖掘时按类别平衡如果自卸卡车已经很好就少采它的难例重点采挖掘机和轮式装载机的遮挡、逆光、远距离样本。验证方法上除了 mAP我习惯看每类的召回率和精确率。如果挖掘机召回率 0.95 但精确率 0.6说明误检多提高置信度阈值或加负样本。如果召回率 0.6 精确率 0.95说明漏检多降低阈值或加正样本。这个平衡点按业务定工地安全预警宁可误检不可漏检就把召回率放第一位。最后说个血泪经验别在训练集上反复调参调到 mAP 0.99然后上线发现现场完全不能用。留一个独立的、来自不同工地的测试集哪怕只有 100 张每次改完模型先跑这个测试集。我一般会把测试集锁在硬盘里训练过程中绝不看只在最终评估时跑一次。这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取