
简介这份工程机械识别数据集面向从事目标检测的深度学习开发者与算法工程师尤其适合需要快速验证YOLO系列、Faster R-CNN、SSD等模型训练效果的研究人员。数据集覆盖挖掘机、装载机、自卸卡车、移动起重机、压路机、推土机、平地机共7类工程机械图片总量达6338张可支撑从模型选型到精度调优的完整实验流程。压缩包共约2000个文件以txt标签文件为主另含1个记录类别信息的yaml配置文件整体约361.74MB图片与标签已按训练集、验证集、测试集划分完毕并同时提供YOLO与VOC两种标注格式省去格式转换与数据清洗环节。目前已有308人学习下载读者可直接将数据接入YOLOv5至YOLOv10等主流框架开展训练也可用于对比不同检测算法的性能差异适合作为工程机械场景目标检测的基准数据资源。1. 工程机械识别数据集6338 张图、7 类重型设备的开箱即用方案工地监控画面里同时出现挖掘机、装载机、压路机靠人眼盯屏既累又容易漏做土方量核算、设备调度、安全预警第一步都得先让模型知道画面里“有什么、在哪”。这份工程机械识别数据集就是冲这个场景来的6338 张实拍图标注了 Excavator、Loader、Dumb_truck、Mobile_crane、Roller、Bull_dozer、Grader 七类重型设备同时给了 YOLO 的 txt 标签和 VOC 的 xml 标签还附带类别 yaml 和已经切分好的训练/验证/测试集。换句话说你拿到手不用自己从零标注、不用纠结目录怎么分直接就能喂给 YOLOv5 到 YOLOv10 这一串模型也能转成 Faster R-CNN、SSD 需要的格式。适合谁做智慧工地、矿山监测、施工安全、设备资产盘点的算法同学以及想拿真实工业场景练手目标检测的从业者。2. 数据集结构与格式拆解txt、xml、yaml 三件套怎么对上2.1 目录长什么样先看清再动手这类数据集常见的组织方式是按 images 和 labels 分开放再各自切 train/val/test。从文件名能看出图片和标签是一一对应的比如Heavy_Equipment_1343_jpg.rf.1940926370fae11e7a4dab1274dee994.txt对应的就是Heavy_Equipment_1343_jpg.rf.1940926370fae11e7a4dab1274dee994.jpg。中间那串rf.加哈希是标注平台导出时加的防重名后缀不影响使用但改名时千万别只改一半否则图和标签就对不上了。我一般拿到手先跑一遍目录体检确认图片数、标签数、类别分布是否对得上# 统计图片和标签数量确认是否一一对应 find . -name *.jpg | wc -l find . -name *.txt | wc -l find . -name *.xml | wc -l # 看类别分布确认有没有严重长尾 cat labels/train/*.txt | awk {print $1} | sort | uniq -c | sort -rn逻辑说明前三条命令分别数 jpg、txt、xml 的数量正常情况 jpg 和 txt 应该相等xml 数量等于图片总数如果 VOC 标签是全量导出。最后一条按类别 id 统计框数量能快速看出哪类样本特别少。参数上awk {print $1}取的是每行第一个字段也就是 YOLO 格式里的类别索引uniq -c做计数。如果发现某个类别只有几十个框训练时就得考虑过采样或者类别加权。2.2 YOLO txt 格式五个数字背后的含义YOLO 的标签每行是class_id x_center y_center width height后四个都是归一化到 0~1 的相对值。很多人第一次看会懵为什么不是像素坐标因为归一化之后图片缩放、letterbox 填充都不影响标签模型输入尺寸改了也不用重标。举个例子0 0.5234 0.6120 0.2100 0.3400 2 0.3010 0.4550 0.1800 0.2900第一行表示类别 0按 yaml 里的顺序是 Excavator框中心在图片宽 52.34%、高 61.20% 的位置框宽占图宽 21%、高占 34%。第二行是类别 2Dumb_truck。这里有个血泪经验如果标注时框超出了图片边界归一化后会出现负数或大于 1 的值训练时虽然不一定报错但会拉低精度。体检时加一条# 找出坐标越界的异常标签行 awk $20 || $21 || $30 || $31 || $40 || $41 || $50 || $51 {print FILENAME: $0} labels/train/*.txt | head -20这条命令把中心点或宽高越界的行揪出来head -20先看前 20 条。发现越界要么重新裁剪图片要么手动修正坐标别直接扔进训练。2.3 yaml 类别文件七类顺序不能错数据集里带的 yaml 一般长这样nc是类别数names是类别名列表# data.yaml path: ./heavy_equipment train: images/train val: images/val test: images/test nc: 7 names: 0: Excavator 1: Loader 2: Dumb_truck 3: Mobile_crane 4: Roller 5: Bull_dozer 6: Grader关键点names里的顺序必须和 txt 标签里的 class_id 严格对应。如果训练时发现模型把挖掘机识别成压路机八成是 yaml 顺序和标注时的类别映射对不上。改 yaml 之前先确认原始标注的类别顺序别凭感觉调。path写相对路径还是绝对路径都行但train/val/test是相对path的路径拼错是新手最常见的翻车点训练一启动就报No labels found。3. 从零跑通 YOLOv8 训练环境、命令与参数调优3.1 环境准备与依赖安装这套数据直接对标 YOLO 系列我一般用 ultralytics 的库来跑版本选当前稳定版即可。先建虚拟环境再装避免污染系统 Python# 创建并激活虚拟环境 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate # 安装 ultralytics 和基础依赖 pip install ultralytics opencv-python pyyaml # 验证 GPU 是否可用 python -c import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))逻辑说明ultralytics一个包就覆盖了 YOLOv8/v9/v10 的训练和推理接口省得自己配。最后一条命令打印 CUDA 是否可用和显卡型号如果输出False说明要么没装 GPU 版 torch要么驱动有问题CPU 训练 6338 张图会慢到怀疑人生。参数上torch.cuda.is_available()返回布尔值get_device_name(0)返回第一块卡的型号确认不是空字符串。3.2 启动训练一条命令背后的参数数据目录按 yaml 配好后训练命令其实很短# 用 YOLOv8n 预训练权重在工程机械数据集上微调 yolo detect train \ modelyolov8n.pt \ data./heavy_equipment/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/heavy \ nameexp1逻辑说明modelyolov8n.pt用 nano 版预训练权重速度快、显存占用低适合先跑通流程data指向 yamlepochs100是常见起点数据量 6000 多张、7 类通常 80~150 轮收敛imgsz640是 YOLO 默认输入尺寸工程机械目标普遍偏大640 够用如果小目标多可以提到 960batch16在 8G 显存上比较稳显存不够就降到 8device0指定第一块 GPU。project和name控制输出目录方便多次实验对比。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否在涨、mAP50-95是否跟着动。如果box_loss震荡厉害先把学习率降一档或者把 batch 调大一点让梯度更稳。3.3 训练完怎么验证别只看 mAP训练结束会在runs/heavy/exp1/weights/下生成best.pt和last.pt。验证命令# 在验证集上评估 best.pt yolo detect val \ modelruns/heavy/exp1/weights/best.pt \ data./heavy_equipment/data.yaml \ imgsz640 \ batch16逻辑说明val模式会输出每类的 precision、recall、mAP50、mAP50-95。工程机械场景里我特别关注Dumb_truck和Mobile_crane这两类因为它们外形差异大但容易和背景里的其他车辆混淆。如果某一类 recall 明显低说明漏检多可能是该类样本少或者标注框偏小。参数上imgsz要和训练时一致否则评估结果会偏乐观或偏悲观。提示验证集和测试集别混用。数据集已经切好了 train/val/test评估用 val最终报告用 test别拿训练集上的指标说事。4. 格式转换与多模型适配VOC、COCO、Faster R-CNN 怎么接4.1 xml 转 YOLO已有 txt 就别重复转数据集同时给了 xml 和 txt说明作者已经做过一轮转换。如果你要用 VOC 格式训练 Faster R-CNN 或 SSD直接用 xml 就行如果要用 YOLO 但只有 xml才需要转。转换脚本核心逻辑是读 xml 里的bndbox像素坐标除以图片宽高归一化import xml.etree.ElementTree as ET from PIL import Image import os # 类别名到 id 的映射顺序必须和 yaml 一致 classes [Excavator, Loader, Dumb_truck, Mobile_crane, Roller, Bull_dozer, Grader] def convert(xml_path, img_path, out_path): tree ET.parse(xml_path) root tree.getroot() w, h Image.open(img_path).size lines [] for obj in root.findall(object): cls obj.find(name).text if cls not in classes: continue cid classes.index(cls) box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) # 归一化并转成中心点宽高 cx (x1 x2) / 2 / w cy (y1 y2) / 2 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{cid} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) with open(out_path, w) as f: f.write(\n.join(lines))逻辑说明ET.parse解析 xml遍历每个object节点取类别名和框坐标。classes.index(cls)把类别名转成 id这一步依赖类别顺序和 yaml 完全一致。归一化用图片实际宽高所以必须先读图拿到w, h。参数上:.6f保留六位小数和 YOLO 官方格式一致。如果 xml 里有difficult标记可以加判断跳过避免把难样本当正样本。4.2 接 Faster R-CNN / SSDVOC 目录结构要对Faster R-CNN 和 SSD 这类框架通常要求 VOC 风格的目录JPEGImages放图Annotations放 xmlImageSets/Main放 train/val/test 的 txt 列表。数据集已经切好 train/val/test你只需要把对应图片和 xml 软链或复制到 VOC 结构里# 构建 VOC 风格目录 mkdir -p VOC/JPEGImages VOC/Annotations VOC/ImageSets/Main # 把图片和 xml 按 split 复制过去示例train cp images/train/*.jpg VOC/JPEGImages/ cp annotations/train/*.xml VOC/Annotations/ # 生成 ImageSets 列表 ls VOC/JPEGImages/ | sed s/\.jpg// VOC/ImageSets/Main/train.txt逻辑说明cp把图片和 xml 集中到 VOC 标准位置ls | sed去掉扩展名生成文件名列表框架读这个列表去找图和标注。参数上sed s/\.jpg//把.jpg替换成空得到纯文件名。注意 train/val/test 要分别生成三个列表文件别混在一起。4.3 类别不均衡时怎么办七类里Excavator和Loader通常最多Grader、Roller可能偏少。如果直接训练发现少数类 mAP 很低常见做法是在 yaml 里给每类配权重部分框架支持或者用copy_paste、mosaic这类增强让少数类多出现。YOLOv8 默认开了 mosaic对少数类有一定帮助但如果某类只有几十个框还是建议单独过采样。5. 避坑与排查标注、路径、显存这三关最容易翻车5.1 现象训练一启动就报 No labels found原因yaml 里的train路径写错或者图片和标签不在同一级目录。YOLO 找标签的规则是把图片路径里的images替换成labels扩展名换成.txt。如果目录结构不是images/和labels/对称就会找不到。解决确认目录结构是images/train对labels/train或者用path指到数据集根目录train写相对路径。实在不行把 yaml 里的路径改成绝对路径先跑通。5.2 现象mAP 一直上不去loss 也不降原因标签类别 id 和 yaml 的names顺序对不上模型学的是错的映射或者图片和标签文件名不匹配导致部分样本标签错位。解决随机抽 10 张图用可视化脚本把框画出来肉眼确认框的位置和类别对不对。这一步别省我见过太多因为文件名差一个字符导致标签全错的案例。5.3 现象训练到一半显存爆了原因batch设太大或者imgsz提太高。工程机械图片分辨率普遍不低640 输入下 batch16 在 8G 卡上已经接近上限。解决先把 batch 降到 8或者开ampTrue混合精度。如果还爆把imgsz降到 512 先跑通再逐步往上加。别一上来就 1280显存和速度都扛不住。5.4 现象验证集指标很好测试集一塌糊涂原因验证集和测试集分布不一致或者验证集样本太少导致指标虚高。数据集虽然切好了但如果切分时没做随机打散可能出现某个 split 里全是晴天、另一个全是阴天。解决检查三个 split 的类别分布是否接近用前面的统计命令分别跑一遍。如果差异大重新按 8:1:1 随机切分别直接用作者给的切分。5.5 现象推理时框重叠严重同一个设备出好几个框原因NMS 阈值不合适或者模型对某些类过拟合。工程机械里Dumb_truck和Loader在远距离下外形接近容易互相误检。解决推理时调conf和iou参数conf0.25、iou0.45是常见起点。如果还是重叠把iou降到 0.4 加大抑制。另外可以在训练时加更多负样本让模型学会区分。6. 进阶技巧用 test 集做最终验证与推理部署训练跑通只是第一步真正落地还得看推理速度和部署方式。我一般会在 test 集上做一次完整评估再用导出的模型跑实际视频流。先看 test 评估# 在 test 集上做最终评估 yolo detect val \ modelruns/heavy/exp1/weights/best.pt \ data./heavy_equipment/data.yaml \ splittest \ imgsz640逻辑说明splittest让评估走测试集而不是默认的验证集这样得到的指标才是最终报告能用的。参数上imgsz保持和训练一致别为了好看偷偷调大。部署时我习惯先导出 ONNX再用 ONNXRuntime 或 TensorRT 加速# 导出 ONNX动态 batch 方便后续部署 yolo export modelruns/heavy/exp1/weights/best.pt formatonnx dynamicTrue opset12逻辑说明formatonnx导出通用格式dynamicTrue允许动态 batch 和尺寸opset12兼容性较好。导出后在目标设备上测一遍推理耗时别只看 GPU 上的数字实际工地边缘盒子可能是 CPU 或低功耗 GPU。这里有个我踩过的坑导出 ONNX 后直接拿 Python 推理结果框的坐标和原图对不上。原因是预处理时 letterbox 的填充比例没还原。后来我每次导出后都强制走一遍「原图 → 预处理 → 推理 → 后处理还原」的完整链路用一张已知结果的图验证坐标确认无误才上设备。从那以后我每次换模型或换部署环境都强制走一遍这个验证流程省得在现场被坐标偏移搞得措手不及。希望帮到你。本文还有配套的精品资源点击获取