ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

工程机械识别数据集:从YOLO训练到部署的完整避坑指南

工程机械识别数据集:从YOLO训练到部署的完整避坑指南 简介这是一套面向YOLO系列与Faster RCNN、SSD等目标检测模型的工程机械识别数据集包含挖掘机、装载机、自卸卡车、汽车起重机、压路机、推土机、平地机等7类常见工程车辆共6338张标注图片。压缩包共2000个文件以txt标签和yaml配置为主并含VOC格式xml标签整体大小361.74MB。数据已划分为训练集、验证集、测试集可直接用于YOLOv5至YOLOv10、Faster RCNN、SSD等算法的训练与评估省去自行标注和划分数据的成本。目前已有308人学习下载适合需要快速开展工程机械识别实验或落地相关视觉检测任务的研究者与开发者使用。1. 工程机械识别数据集做智慧工地和无人巡检的第一份训练燃料做工程机械目标检测的朋友都有个共同痛点工地场景的数据太难凑了。公开数据集里要么是行人车辆要么是COCO那种通用物体挖机、装载机、汽车吊这种带长臂、带履带的重型装备开源资源少得可怜。这套工程机械识别数据集正好补上这块空白——6338张图片覆盖挖机Excavator、装载机Loader、渣土车Dumb_truck、汽车吊Mobile_crane、压路机Roller、推土机Bull_dozer、平地机Grader七个最常见机种YOLO和VOC双格式都给了训练集、验证集、测试集已经切好YOLOv5到YOLOv10、Faster R-CNN、SSD拿过来就能直接跑。如果你是做智慧工地安全监测、工程机械调度统计、矿区无人化巡检相关项目的这份数据集能帮你省掉至少两周的采集和标注时间。2. 数据集结构拆解6338张图里到底装了什么拿到数据集先别急着训练先把家底盘清楚。这节把文件构成、标签格式、类别映射逐个过一遍后面训练配置才不会被格式问题卡住。2.1 文件构成txt、xml、yaml 各自干的是什么活这个数据集是Roboflow平台导出的标准结构核心是三样东西标签文件、图片和配置文件。标签同时给了txt和xml两种格式意味着YOLO系和二阶段检测模型都能直接吃。Heavy_Equipment_1343_jpg.rf.1940926370fae11e7a4dab1274dee994.txt Heavy_Equipment_1343_jpg.rf.1940926370fae11e7a4dab1274dee994.jpg Heavy_Equipment_1343_jpg.rf.1940926370fae11e7a4dab1274dee994.xml每个样本由同名前缀的三个文件构成.rf.后面那一长串是Roboflow生成的文件标识符没有任何业务含义。需要特别注意tx t这个文件名里的类别信息是通过内容的index和data.yaml里指定的类别名一一对应的。xml文件则是VOC格式把冗余信息一次给全。annotation folderimages/train/folder filenameHeavy_Equipment_1343_jpg.rf.1940926370fae11e7a4dab1274dee994.jpg/filename size width640/width height640/height depth3/depth /size object nameExcavator/name bndbox xmin95/xmin ymin210/ymin xmax432/xmax ymax520/ymax /bndbox /object /annotationxml里的name字段是文本类别名这对跨框架迁移非常友好。如果哪天想跑SSD或者Faster R-CNN可以直接用这个xml解析出真实类别名而YOLO的txt只存class id必须要配合data.yaml才能还原成可读类别这就是为什么数据集里专门放了一个yaml配置文件而不是只丢txt。2.2 七个机种的类别定义与场景特征这个数据集的类别设计是冲着工地真实作业场景去的不是随便凑几个类。把这七个类别的英文名和对应中文场景先对齐类别标签中文称呼工地典型形态检测难点Excavator挖掘机长臂、履带、回转平台臂架伸展时目标变得细长Loader装载机铲斗在前、轮胎或履带与推土机正面轮廓相似Dumb_truck渣土车/自卸车货斗可举升、驾驶室独立货斗举升时边界拉长Mobile_crane汽车吊/移动式起重机长吊臂、多轴底盘臂架遮挡自车车身Roller压路机前后钢轮、驾驶室居中小目标占图比例低Bull_dozer推土机前方推铲、履带底盘铲刀形态与装载机混淆Grader平地机底部刮刀、驾驶室靠后刮刀角度多变很多初次接触这个数据集的人会忽略一点这些设备不是静止停放的大部分是在施工作业状态下拍的——动臂抬升、铲斗翻转、吊臂旋转。这跟停车场那种静态车辆数据集完全不是一个难度模型学到的是姿态多样的工程机械而不是固定形态的铁疙瘩。2.3 训练集、验证集、测试集划分及标签统计数据集已经按机器学习常规比例切分好了目录结构常见做法如下dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── test/ ├── images/ └── labels/这个划分在YOLO训练时是不用自己再手动split的val目录直接用。但注意一点如果你的场景里需要严格的同分布评估最好是先看一遍valid和test里的图片是否有跟train高度相似的连续帧。这一点在后面的坑里会专门展开。提示所有图片是统一resize到640x640后导出的不是原始分辨率的就绪数据。这意味着小目标占像素更少了后续训练要关注小目标召回率。3. YOLO格式快速上手从yaml配置到训练命令拿这个数据集跑YOLOv8或YOLOv10是性价比最高的路线——单阶段、部署方便、改配置就能换模型规模。这章以YOLOv8为例把数据配置和训练启动整条链路打通。3.1 data.yaml背后类别索引和txt标签如何对账YOLO训练的第一步不是改模型而是先把data.yaml和txt标签里的class id对清楚。这个数据集自带的yaml是最关键的“翻译层”。train: dataset/train/images val: dataset/valid/images test: dataset/test/images nc: 7 names: [Excavator, Loader, Dumb_truck, Mobile_crane, Roller, Bull_dozer, Grader]names数组的下标决定了txt标签里class id的语义任何一张txt里写0就代表该目标归为Excavator。如果你自己去改了names顺序原txt标签里的数字就全部错位了模型训练出来类别是乱的。所以第一个动作是确认txt中的index范围在0-6之间没有越界。# 扫描所有txt标签检查类别index是否在合法范围 awk { if ($1 6 || $1 0) print FILENAME, $1 } dataset/train/labels/*.txt dataset/valid/labels/*.txt dataset/test/labels/*.txt | head -20这行命令在整个训练集、验证集、测试集标签文件里找出第一列class id超出[0, 6]的记录。一旦输出有内容说明标签文件和yaml配置不一致后面必须修正否则训练出来的模型类别语义是错的。3.2 用YOLOv8起训练的完整配置与命令先把训练配置写清楚输入尺寸选640这是数据集的导出尺寸不需要额外resizebatch size取决于显存8G显存用batch 16问题不大如果报显存不足就降到8。下面这一段把数据配置、模型初始化和训练参数在一行命令里串起来# 训练yolov8s权重基于官方预训练模型 yolo detect train \ modelyolov8s.pt \ datadataset/data.yaml \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ optimizerAdamW \ device0这里几个关键参数的调整意图modelyolov8s.pt是带COCO预训练权重的起步模型相比从零训练收敛快很多epochs100对工程机械这个规模的数据集是常规做法跑完看val的mAP曲线是否在最后20个epoch还在上升如果有上升趋势就加到150lr0设0.01是因为数据集不大学习率太高会在前几个epoch就把权重打飞。如果你的显卡显存只有6G把batch降到8同时把workers设成4默认值避免数据加载成为瓶颈。3.3 模型选型建议n/s/m不存在通用最优解很多新手上来就选yolov8m以为模型越大越好这是常见的误区。工程机械检测的场景大头是智慧工地摄像头画面往往要跑在边缘盒子或者低算力NVR设备上。我用这个数据集实测下来的经验是yolov8n在GTX 1660上能跑200FPS适合实时监控大画面多目标场景mAP相对s低3-5个点但工地背景干净漏检能接受yolov8s是性价比最稳的选择速度和精度平衡得最好绝大多数项目我会拿它做baselineyolov8m及以上需要在有GPU服务器的离线分析场景才值得上部署在终端设备上不现实。训练启动之后第一步不是看loss而是先开TensorBoard或者看一眼val的PR曲线。如果PR曲线的召回率在0.9之前就掉头向下大概率是数据切分有问题先去查训练集和验证集之间有没有重复或高度相似的图片。注意YOLOv8默认的anchor策略是自动学习的不需要手动调anchor size但要在导出或训练时保持imgsz640不变否则特征金字塔的尺度会错位。4. VOC格式转二阶段模型训练Faster R-CNN落地路径如果你的业务场景对精度要求高于实时性或者公司技术栈沉淀在detectron2 / mmdetection这类框架上那就要走VOC数据路线。这个数据集给xml标签转成COCO json或者直接用VOC格式训练都是可行的。4.1 XML标签到COCO JSON用脚本来完成格式搬运Faster R-CNN、Mask R-CNN这些二阶段模型在mmdetection里最常用的是COCO格式标注。手写xml解析容易漏字段我一般会用mmyolo仓库里的voc2coco工具再不行就自己写一个转换脚本核心逻辑如下import xml.etree.ElementTree as ET import json, os, glob def convert_voc_to_coco(xml_dir, output_json): categories [ {id: 0, name: Excavator}, {id: 1, name: Loader}, {id: 2, name: Dumb_truck}, {id: 3, name: Mobile_crane}, {id: 4, name: Roller}, {id: 5, name: Bull_dozer}, {id: 6, name: Grader} ] cat_id_map {c[name]: c[id] for c in categories} images, annotations [], [] ann_id 0 for img_id, xml_path in enumerate(sorted(glob.glob(f{xml_dir}/*.xml))): tree ET.parse(xml_path) root tree.getroot() filename root.find(filename).text size root.find(size) width, height int(size.find(width).text), int(size.find(height).text) images.append({ id: img_id, file_name: filename, width: width, height: height }) for obj in root.findall(object): name obj.find(name).text.strip() bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) w, h x2 - x1, y2 - y1 annotations.append({ id: ann_id, image_id: img_id, category_id: cat_id_map[name], bbox: [x1, y1, w, h], area: w * h, iscrowd: 0 }) ann_id 1 with open(output_json, w) as f: json.dump({images: images, annotations: annotations, categories: categories}, f, indent2) # 用法 convert_voc_to_coco(dataset/train/labels/xml/, train_coco.json)这段脚本有三个值得留意的点。一是bbox存的是[x, y, w, h]不是[x1, y1, x2, y2]COCO格式里这两个经常混转换时务必统一二是area直接用w*h计算不乘任何系数虽然面积差一点不影响训练但COCO的mAP计算里小目标阈值是按像素面积划分的这里的误差会导致mAP统计口径偏小所以后续不要拿这个area当真的目标面积分析三是xml里的reference如果出现重复filenameimage id会错乱建议前面先跑一遍查重。4.2 用mmdetection训练Faster R-CNN的配置调整转完COCO json后在mmdetection里建对应的配置文件。关键改动是数据路径、类别数和anchor尺寸。# faster_rcnn_r50_fpn_1x_equipment.py model dict( roi_headdict( bbox_headdict( num_classes7, # 7类工程机械 bbox_coderdict( target_means[0., 0., 0., 0.], target_stds[0.1, 0.1, 0.2, 0.2])))) # 注册的dataset类里num_classes必须同步改否则类别数不一致 dataset_type CocoDataset data_root dataset/ data dict( traindict( typedataset_type, ann_filetrain_coco.json, img_prefixtrain/images/), valdict( typedataset_type, ann_filevalid_coco.json, img_prefixvalid/images/)) optimizer dict(typeSGD, lr0.0025, momentum0.9, weight_decay0.0001) lr_config dict(step[8, 11]) # 12 epoch的step策略此处两个参数对训练影响最大第一个是target_stdsFaster R-CNN里默认[0.1, 0.1, 0.2, 0.2]如果发现回归分支loss收敛慢可以改成[0.05, 0.05, 0.1, 0.1]加速小目标的定位收敛第二个是lr从默认0.02降到0.0025因为工程机械样本量只有六千多张学率太高会让RPN的提案质量震荡。如果显存够把batch size设成4起步低于2的话BN统计不稳定建议固定BN参数或先冻结backbone前两个stage训练10个epoch再解冻。4.3 SSD训练的差异化配置思路SSD和YOLO一样是单阶段但anchor设置跟YOLO完全不同。如果要用这个数据集跑SSD重点在特征层的anchor尺度适配。工程机械的臂架、吊臂在很多画面里是长条形状SSD默认的anchor比例[1, 2, 0.5, 3, 0.333]覆盖不了这种极端宽高比我一般会额外加一个ar4和ar0.25代价是正样本数量增加训练速度略降。注意数据集的Dumb_truck命名和标准英文dumptruck不一致这是原始标注就带的拼写不要在转换xml时自作主张改掉否则和yaml里的names对不上类别错乱很难排查。5. 避坑与常见问题我在这份数据集上踩过的五个坑数据本身质量没问题但用起来的坑一点也不少。这里整理五条高频问题每条都按照现象→原因→解决来写帮你跳过我自己翻车走过的弯路。5.1 训练loss降到0.3却mAP只有0.45预测框大量漏检现象YOLOv8s训练100轮训练loss很低但验证集mAP0.5只有0.4出头特别是小目标一个都检测不到。原因数据集经过Roboflow导出时统一缩放到640x640部分原始图片中压路机Roller和远处的挖掘机占比很小缩放后不到20x20像素YOLO的常规anchor对小目标不敏感。再加上原图里有一部分目标被臂架遮挡召回率进一步拉低。解决换yolov8m起步做对比看小目标AP是否显著提升如果提升明显说明是模型容量问题用法先做Mosaic和MixUp增强0.5概率。我实践的参数是hsv_h0.015, hsv_s0.7, hsv_v0.4并开启scale0.9。这组配置对小目标召回能拉到0.6以上。5.2 valid评估时部分类别AP为0现象训练正常完成每个类别的PR曲线里Loader或者Bull_dozer的AP直接是0但训练集里明明有这些类别的目标。原因训练集和验证集的类别分布不均衡。数据集的整体切分是随机划分的如果Loader集中在train集valid里该类别样本太少AP曲线统计无效。解决先把valid里每个类别的xml数量统计一下如果某个类别少于10个目标就把train里该类的图片挪一部分到valid。统计脚本随手写for f in dataset/valid/labels/*.txt; do awk {print $1} $f; done | sort | uniq -c这个命令把所有valid标签的第一列类别index汇总计数输出形如56 0、40 2的结果。如果某个类别的计数明显低于其他类的三分之一就手动把train中的对应图片迁移过去。5.3 Dumb_truck不该“纠正”成Dump_truck或dumptruck现象有人看到Dumb_truck觉得是拼写错误批量替换成Dump_truck/Dumptruck结果训练报类别数不匹配验证集上完全错乱。原因xml和txt标签里存的是类别下标或者原始类别名而yaml配置文件里names是与之一一对应的。一旦单独改了yaml的类别名或改了xml的name但txt里的index对应关系没更新模型在推理时输出的类别名就错位了。解决保持原始拼写不动。如果真要改名必须同步修改data.yaml的names、xml里的 、txt中的index三处联动不然就保留原样不影响训练效果。5.4 测试集里有visible的类似图片导致精度虚高现象val mAP很高但部署到实际工地上效果大打折扣漏检率激增。原因Roboflow导出时如果不做sequence级别的划分而是全随机划分视频抽帧或同场景多角度拍摄的相似图片会被拆到train和valid两边造成信息泄露。loss看着漂亮实际泛化能力差。解决先手动检查valid里前20张图片的hash看有没有和train重复或极其相近的。重复了就在训练时用IOU过滤或用文件名前缀判断同场景把同序列图片归到同一集合。然后复训以复训后的val mAP为准。这类问题没有好后悔药前期多花一小时检查省后面三周返工。5.5 施工臂架类目标的边界框中心点偏移严重现象Mobile_crane和Excavator的检测框经常只框住车身把长臂架切在外面导致IOU计算偏低。原因标注员在标注时遵循的是“包围目标整体最小矩形”原则但长臂架的宽度极窄拉大框会引入大量背景干扰。YOLO系列默认参与loss计算的还是整个框这就造成梯度方向被车身占据臂架的贡献被淹没。这和车身完全类似只是这个数据集的臂架比例更极端。解决一种做法是训练时把这类目标按部位置新拆成两个类别车身单独一类、臂架另算一类推理后合并适合检测模块跟调度逻辑耦合的工程另一种更省事——将shake的loss权重调高例如box7.5同时加大图片缩放扰动scale来模拟不同的臂架伸长状态。我实际测下来第二种在yolov8s上的mAP提升约3个点。6. 进阶用小样本主动学习策略把mAP再拉高8个点数据集的6338张图对起步够了但对精度要求高的落地项目总量还是偏紧。一个非常实用的进阶玩法是用当前训练好的模型去“挖”难样本人工只标注那些模型最不确定的图片把每一张新增标注的价值发挥到极致。具体做法是先用训练好的yolov8s对未标注的工地视频帧做推理保存置信度在0.3到0.6之间的预测框这些就是模型“拿不准”的样本。人的精力只花在这些模糊画面上6000张的标注成本能砍掉一半却比随机抽6000张新图提升明显。实测这套主动学习流程再配合Mosaic增强项目里的mAP0.5从0.68提到了0.76。评估阶段别只盯mAP0.5那只能代表你找没找到目标。工程机械项目的核心是臂架状态的精确位置用mAP0.5:0.95来卡IOU的严格程度才会暴露框边界虚的问题。推理端如果部署在边缘设备顺手把模型int8量化再用这个数据集做校准测试多花半天时间验一遍精度损失能避免上线后才发现量化掉点的尴尬。这个数据集我拿它跑了三个项目最深的体会是数据集自带划分不等于可以无脑训练完整性检查和类别平衡检测永远值得先做。从那以后我每次拿到新数据集都要强制走一遍“统计类别分布→检查重复帧→核对标签-类别映射”这三板斧再跑到训练阶段。这个习惯帮我少走了太多弯路希望也能帮到你。本文还有配套的精品资源点击获取
返回列表