ARTICLE DETAIL

资讯详情

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

工程机械识别数据集:从采集标注到YOLO训练全流程

工程机械识别数据集:从采集标注到YOLO训练全流程 简介本资源为面向深度学习目标检测方向的工程机械识别数据集适合从事智慧工地、施工安全监控、工程车辆检测等场景的算法工程师与研究者使用可支撑YOLO系列、Faster R-CNN、SSD等主流检测模型的训练与验证。数据集共包含6338张标注图片覆盖挖掘机、装载机、自卸卡车、移动式起重机、压路机、推土机、平地机七类工程机械并提供YOLO与VOC双格式标签便于不同框架直接调用。压缩包内共2000个文件以1999个txt标签文件和1个yaml类别配置文件为主yaml中已明确类别名称与索引整体约361.74MB图片与标签已按训练集、验证集、测试集完成划分开箱即可投入YOLOv5至YOLOv10等系列算法训练。目前已有308人学习下载适合需要快速搭建工程机械检测基线、验证模型泛化能力或开展多类别目标检测实验的读者参考使用。1. 工程机械识别数据集从工地扬尘到标注框一条被低估的落地赛道工地门口那台挖掘机在监控画面里其实只有四十来个像素宽背景是漫天扬尘和交错的钢筋脚手架。我第一次拿到这类现场视频时用 COCO 预训练的检测模型直接推理挖掘机被识别成“卡车”的概率超过六成装载机干脆漏检。这不是模型不行而是通用数据集里根本没有足够的工程机械样本——工程机械识别数据集这个方向就是被这种真实需求逼出来的。它要解决的问题很具体在施工工地、矿山、港口、灾后现场这些场景里自动识别挖掘机、装载机、推土机、起重机、混凝土搅拌车、渣土车等设备输出类别和位置框。目标检测是承载这件事的主流技术路线而数据集是整条链路里最容易被低估、也最决定成败的一环。适合谁做做智慧工地、无人矿山、工程机械调度、施工安全监控的算法工程师和产品团队以及想找一个垂直领域做目标检测落地的个人开发者。这一章先把“为什么值得做”讲清楚后面几章拆怎么建、怎么标、怎么训、怎么避坑。2. 工程机械识别数据集到底长什么样类别体系与采集边界2.1 类别怎么定别一上来就分二十类工程机械的类别划分直接决定标注成本和模型上限。我见过最离谱的一份需求文档列了“小型挖掘机、中型挖掘机、大型挖掘机、轮式挖掘机、履带挖掘机”五类结果标注员在扬尘画面里根本分不清轮式和履带一致性惨不忍睹。常见做法是按“外观差异明显、业务上需要区分”两个原则收敛类别。一个能落地的起步类别体系通常是 6 到 10 类类别名英文标签典型外观特征易混对象挖掘机excavator动臂斗杆铲斗履带底盘起重机远距离装载机loader前端大铲斗铰接车身推土机推土机bulldozer前端推土铲履带装载机起重机crane高耸臂架或吊钩挖掘机臂架相似混凝土搅拌车mixer_truck圆筒搅拌罐渣土车渣土车dump_truck方形货厢可举升普通货车压路机roller圆柱形钢轮无打桩机pile_driver垂直立柱锤头起重机提示如果业务只关心“有没有机械”可以先做单类检测把“工程机械”当一个类标后期再拆分。这样标注速度能快三到五倍模型也更容易收敛。类别确定后要写一份标注规范文档把每个类的判定标准、遮挡处理、截断处理写清楚。这份文档比数据集本身还重要因为它是标注一致性的唯一依据。2.2 采集边界什么该采什么采了也白采工程机械数据集的采集有几个硬约束踩过坑的人都知道。第一分辨率与目标尺寸的平衡。工地监控通常是 1080P 甚至更低一台挖掘机在画面里可能只占 60×40 像素。如果采集时只存压缩后的视频帧标注框会糊到没法用。我一般要求原始采集分辨率不低于 1920×1080且对重点区域做裁剪增强。第二光照和天气的覆盖。工地场景的光照跨度极大正午强光、黄昏逆光、夜间补光、雨雾天。如果数据集只有晴天白天的样本模型一到夜间就崩。建议按光照条件分层采集每层至少占总量的 15%。第三遮挡与截断的标注策略。工程机械经常被脚手架、其他车辆、扬尘部分遮挡。标注规范里要明确遮挡面积超过 70% 的目标不标截断目标如果可见部分超过 30% 则标出完整框并打truncated标记。第四负样本的采集。纯背景帧、只有工人没有机械的帧、其他车辆帧都要按一定比例纳入。负样本比例通常控制在 1:5 到 1:10 之间太少会导致误检率飙升。采集渠道上公开数据集如 COCO、Open Images 里能筛出一部分工程机械但数量少、场景单一。真正可用的数据还是来自工地监控、无人机航拍、手持设备拍摄。如果做智慧工地项目和施工方谈数据授权时要把隐私合规一起谈清楚人脸和车牌该模糊的模糊。3. 从原始视频到 YOLO 格式标注、清洗与增强的完整链路3.1 抽帧与去重别让模型记住同一帧原始视频直接抽帧会产生大量近似重复的样本模型会在这些冗余样本上过拟合。我一般用“时间间隔画面差异”双重策略抽帧。import cv2 import numpy as np from skimage.metrics import structural_similarity as ssim def extract_frames(video_path, interval_sec2, ssim_threshold0.92): 按时间间隔抽帧并用 SSIM 去重 interval_sec: 抽帧间隔秒数 ssim_threshold: 相似度阈值高于此值视为重复帧丢弃 cap cv2.VideoCapture(video_path) fps cap.get(cv2.CAP_PROP_FPS) frame_interval int(fps * interval_sec) saved_frames [] last_gray None frame_idx 0 while True: ret, frame cap.read() if not ret: break if frame_idx % frame_interval 0: gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray cv2.resize(gray, (320, 180)) # 降采样加速比较 if last_gray is not None: score ssim(last_gray, gray) if score ssim_threshold: frame_idx 1 continue saved_frames.append(frame) last_gray gray frame_idx 1 cap.release() return saved_frames这段代码的逻辑是先按固定时间间隔抽帧再用 SSIM 比较相邻抽帧的相似度超过阈值就丢弃。interval_sec根据视频内容变化速度调整工地监控一般 2 到 5 秒ssim_threshold设 0.92 左右比较稳设太高会丢有效样本设太低去重效果差。降采样到 320×180 是为了加速不影响去重判断。3.2 标注工具选型与标注规范落地目标检测常用标注工具里LabelImg 适合小规模快速上手CVAT 适合团队协作和视频标注Labelme 适合多边形但工程机械用矩形框就够了。我一般推荐 CVAT因为它支持多人任务分配、标注审核、导出 YOLO/COCO/VOC 多种格式。标注时最容易翻车的是三件事框不贴边、类别标错、漏标小目标。框不贴边会让回归损失震荡类别标错直接污染训练集漏标小目标会让召回率上不去。解决办法是标注完成后做一轮交叉审核每人抽 10% 的样本互查不一致的拉出来讨论。导出格式上YOLO 系列需要的是每张图一个.txt每行class_id x_center y_center width height全部归一化到 0 到 1。如果拿到的是 VOC 的 XML需要转换。import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_dir, output_dir, class_map): xml_dir: VOC标注文件夹 output_dir: YOLO标签输出文件夹 class_map: {excavator: 0, loader: 1, ...} os.makedirs(output_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(xml_dir, xml_file)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in class_map: continue 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) # 归一化并转为中心点宽高 x_center (xmin xmax) / 2.0 / w y_center (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{class_map[name]} {x_center:.6f} {y_center:.6f} {bw:.6f} {bh:.6f}) out_path os.path.join(output_dir, xml_file.replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines))转换时要注意四个边界坑坐标越界要裁剪到 0 到 1、宽高为 0 的框要丢弃、类别不在class_map里的要跳过、图片和标签文件名必须一一对应。转换完建议写个校验脚本统计每类的框数量和尺寸分布异常值人工复查。3.3 数据增强别把挖掘机增强成外星飞船工程机械场景的数据增强要克制。翻转、缩放、色彩抖动是安全的但大幅度的旋转、裁剪、马赛克增强可能把挖掘机的动臂结构破坏掉模型学到的特征反而变差。我常用的增强组合是随机水平翻转概率 0.5、随机缩放0.8 到 1.2、HSV 色彩抖动色调 ±10、饱和度 ±20、明度 ±20、随机遮挡模拟扬尘遮挡面积不超过 20%。Mosaic 增强可以用但概率别超过 0.3否则小目标会被拼得面目全非。如果用的是 YOLOv8 或 YOLOv11 这类框架增强参数直接在训练配置里调不用自己写增强代码。关键是理解每个参数对工程机械场景的影响而不是照搬 COCO 的默认配置。4. 训练工程机械检测模型YOLOv8 微调的参数与验证4.1 环境与数据配置文件以 YOLOv8 为例训练前需要准备一个data.yaml指向训练集、验证集和类别名。path: /data/construction_machinery train: images/train val: images/val test: images/test names: 0: excavator 1: loader 2: bulldozer 3: crane 4: mixer_truck 5: dump_truck 6: roller 7: pile_driver目录结构上images/train和labels/train要平行放置文件名一一对应。YOLOv8 会自动根据图片路径找到同名标签。如果标签缺失训练时会报 warning最好在训练前用脚本检查一遍。4.2 微调参数怎么设从 COCO 预训练权重出发工程机械数据集通常不大几千到几万张。从 COCO 预训练权重微调是最稳的路线。以下是一组我常用的起步参数yolo detect train \ modelyolov8m.pt \ data/data/construction_machinery/data.yaml \ epochs150 \ imgsz640 \ batch16 \ lr00.001 \ lrf0.01 \ momentum0.937 \ weight_decay0.0005 \ warmup_epochs3 \ patience30 \ augmentTrue \ mosaic0.3 \ mixup0.0 \ degrees0.0 \ translate0.1 \ scale0.2 \ fliplr0.5 \ hsv_h0.015 \ hsv_s0.4 \ hsv_v0.3 \ device0 \ projectruns/construction \ nameexp01参数说明model选 yolov8m 是精度和速度的平衡点如果部署端算力紧张可以换 yolov8s 或 yolov8nimgsz640是通用起点如果小目标多可以提到 960 或 1280但显存和推理时间会涨lr00.001是微调的保守学习率比从头训练低一个量级patience30表示验证指标 30 轮不提升就早停mosaic0.3是刻意压低的值原因在 3.3 节说过degrees0.0关闭旋转增强保护机械结构特征。如果训练时发现 loss 震荡厉害先把lr0降到 0.0005如果验证集 mAP 远低于训练集检查标注质量和类别平衡如果小目标召回差提高imgsz并检查数据集中小目标占比。4.3 验证指标怎么看mAP 之外还要看什么YOLO 训练完会输出 mAP50、mAP50-95、precision、recall。工程机械场景里我还会额外关注三件事。第一按类别看 mAP。如果挖掘机和起重机混淆严重说明这两类的特征区分度不够要么合并类别要么补充更多区分性样本。第二按目标尺寸看召回。把验证集按框面积分成小、中、大三档分别统计召回率。小目标召回低于 0.5 的话模型在实际监控画面里基本不可用。第三看误检的假阳性样本。把置信度阈值调到 0.5 以上仍然误检的图挑出来分析是背景干扰还是类别混淆。这一步往往比调参更能提升实际效果。5. 避坑与排查工程机械数据集最容易翻车的五个地方5.1 标注框大量越界或宽高为负现象训练时 loss 直接变 NaN或者报 “invalid bbox” 错误。原因VOC 转 YOLO 时没有做坐标裁剪或者标注员手抖把 xmax 标得比 xmin 小。解决转换脚本里加裁剪逻辑xmin max(0, xmin)、xmax min(w, xmax)并检查xmax xmin、ymax ymin不满足的框直接丢弃并记录日志。5.2 类别极度不平衡导致小类完全检不出现象挖掘机 mAP 0.85打桩机 mAP 0.02。原因打桩机样本只有几十张模型没学够。解决优先补采小类样本如果补不了用过采样或 copy-paste 增强还可以在 loss 里给小类更高权重但效果不如补数据直接。5.3 验证集和训练集来自同一段视频现象验证集 mAP 很高一上真实新场景就崩。原因抽帧时没有按视频源划分同一段视频的相邻帧同时进了训练集和验证集模型相当于“背答案”。解决按视频源或采集日期划分数据集确保验证集的场景、光照、设备型号和训练集有差异。5.4 夜间样本太少导致夜间误检率飙升现象白天检测正常夜间把路灯影子识别成挖掘机。原因训练集里夜间样本占比不到 5%模型没见过夜间光照分布。解决按光照条件分层采样夜间样本至少占 15%如果夜间数据实在少用亮度变换做增强但要注意别把白天样本调得太假。5.5 模型把“工程机械”和“普通货车”混为一谈现象渣土车和普通货车互相误检。原因这两类外观接近标注时边界模糊。解决在标注规范里明确区分标准比如渣土车必须有举升货厢结构如果业务上不需要区分直接合并成一个“货车”类减少模型困惑。6. 进阶技巧用开放词汇检测和主动学习把数据集滚起来工程机械识别数据集建到一定规模后继续盲目标数据边际收益很低。我现在的习惯是两条腿走路一条用开放词汇目标检测做预筛选一条用主动学习挑最难样本。开放词汇检测模型比如 Grounding DINO 这类可以用文本提示“excavator”“bulldozer”直接推理不需要训练。它的精度不如微调后的 YOLO但胜在零样本可用。我一般用它跑一遍新采集的视频把高置信度检测结果作为预标注人工只做修正标注速度能快一倍以上。低置信度的样本则进入待标注池。主动学习这边核心是挑“模型最不确定”的样本。具体做法是用当前模型对未标注池推理计算每个样本的熵或最大类别概率挑熵最高的一批送标。这样每标一批模型提升比随机抽样明显。import torch import numpy as np def uncertainty_sampling(model, unlabeled_loader, top_k100): 用最大类别概率的熵做不确定性采样 返回最不确定的 top_k 个样本索引 model.eval() scores [] with torch.no_grad(): for imgs, idxs in unlabeled_loader: preds model(imgs) # [B, num_classes] probs torch.softmax(preds, dim1) entropy -torch.sum(probs * torch.log(probs 1e-8), dim1) scores.extend(zip(idxs.tolist(), entropy.tolist())) scores.sort(keylambda x: x[1], reverseTrue) return [s[0] for s in scores[:top_k]]这段代码的关键是entropy计算熵越高说明模型越拿不准。top_k根据每轮标注预算定一般 100 到 500。实际用的时候还要加一个多样性约束避免挑出来的全是同一场景的相似帧。验证方法上我习惯每轮主动学习后在一个固定的“黄金验证集”上跑一次评估。这个验证集不参与训练场景覆盖全面用来判断模型是真的进步还是只是拟合了新标的数据。如果黄金验证集 mAP 连续两轮不涨就该停下来检查标注质量或调整采样策略而不是继续堆数据。最后说个血泪教训我曾经为了赶进度把标注外包给不熟悉工程机械的团队结果挖掘机和起重机混标了 30%模型训出来两类互相打架返工重标花了两倍时间。从那以后我的习惯是任何外包标注先做 200 张的试标一致性达标才放量。数据集这件事慢就是快。希望帮到你。本文还有配套的精品资源点击获取
返回列表