尧图精选

工程车辆目标检测数据集实战:YOLO格式450张图训练与部署

🕒 发布时间:2026/10/1 17:35:25 📁 来源:尧图网络
简介这份工程车辆目标检测数据集面向建筑工地智能监控、智能交通与自动驾驶环境感知等方向的算法开发者与高校研究者聚焦混凝土搅拌车、自卸卡车、挖掘机三类常见工程车辆的识别需求帮助解决专业场景下样本稀缺、类别针对性不足的问题。资源包共902个文件以450张JPEG实景图片和450个YOLO格式标注txt为主另附1个yaml配置文件与1份docx说明文档压缩包约65.83MB标注包含边界框坐标与类别标签可直接加载至YOLO系列等主流框架训练。图片取自真实建筑工地与运输场景涵盖多样化车辆姿态与背景有助于提升模型在复杂环境中的泛化能力。目前已有197人学习下载适合用于目标检测算法实践、工地设备管理模型开发及工程类院校AI课程教学也可扩展至车辆分类等衍生任务。1. 工程车辆目标检测数据集三类工程车、450 张训练图能不能直接开练工地门口那套车牌识别换成工程车识别是我去年接过最别扭的一单。摄像头架好了模型却认不出搅拌车和自卸卡车的区别——两者车头轮廓接近车厢结构差异又集中在后半段通用 COCO 预训练权重在这类场景里几乎等于没学。后来翻到这个工程车辆目标检测数据集三类目标、YOLO 格式、450 张训练图规模不大但类别聚焦得刚好属于那种「拿来就能跑通第一版 baseline」的行业数据集。它解决的不是通用检测问题而是建筑工地和运输场景里混凝土搅拌车、自卸卡车、挖掘机这三类工程车辆的识别。标注是标准 YOLO 格式边界框加类别标签JPEG 原图来自真实工地和运输环境车辆姿态和背景都有变化。适合谁做工地智能监控、物流车辆调度、自动驾驶施工区域感知的从业者以及拿它当课程实践或算法验证的工程类院校学生。450 张不算多但作为工业数据集的起步盘够你把训练管线跑通、把类别定义对齐、把评估指标摸清楚。2. YOLO 标注格式拆解从 txt 坐标到 DataLoader 的完整链路2.1 为什么 YOLO 格式能直接喂进主流框架YOLO 格式的核心是每张图对应一个同名 txt每行一个目标格式为class_id x_center y_center width height后四个值都是归一化到 0~1 的相对坐标。这个设计的好处是跟图像分辨率解耦——你换一批不同尺寸的工地监控截图标注文件不用重做。相比 VOC 的 XML 和 COCO 的 JSONYOLO txt 解析成本最低Ultralytics 系列的 YOLOv5/v8/v11 都能直接读。这个数据集里三类目标的 class_id 映射需要你自己确认。常见做法是按类别名首字母或数据集说明里的顺序排我一般会先写个脚本把 txt 里的 class_id 分布统计一遍避免出现「以为 0 是搅拌车、实际 0 是挖掘机」这种翻车。下面这段脚本就是干这个的顺便检查有没有越界坐标和空标注文件。import os from collections import Counter label_dir labels/train class_counter Counter() bad_files [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue path os.path.join(label_dir, fname) with open(path, r) as f: lines [l.strip() for l in f if l.strip()] if not lines: bad_files.append((fname, empty)) continue for line in lines: parts line.split() if len(parts) ! 5: bad_files.append((fname, field_count)) continue cid int(parts[0]) coords list(map(float, parts[1:])) # 归一化坐标必须在 0~1 之间越界说明标注或导出有问题 if any(c 0 or c 1 for c in coords): bad_files.append((fname, coord_range)) class_counter[cid] 1 print(类别分布:, dict(class_counter)) print(异常文件:, bad_files[:20])逻辑说明先遍历 label 目录下所有 txt逐行拆字段。字段数不等于 5 直接记异常坐标超出 0~1 也记异常因为 YOLO 训练时越界框会被裁剪或直接报错。参数上label_dir换成你解压后的实际路径即可。跑完你会拿到两个关键信息——类别是否只有 0/1/2 三个 id以及有没有空标注文件。空文件在 YOLO 里是合法的负样本但如果比例过高说明这批图可能标漏了。2.2 目录结构怎么摆才能被 Ultralytics 认出来YOLO 训练对目录结构有硬性约定摆错了不会报错只会静默跳过数据最后 loss 不降你还以为是学习率问题。标准结构是 images 和 labels 平行各自下面分 train 和 val。这个数据集只给了训练集 450 张没有独立验证集所以你得自己切。dataset/ ├── images/ │ ├── train/ # 约 360 张 │ └── val/ # 约 90 张 └── labels/ ├── train/ └── val/切分脚本我一般用随机种子固定保证每次复现一致import os, random, shutil random.seed(42) img_dir images/all train_img, val_img images/train, images/val train_lbl, val_lbl labels/train, labels/val for d in [train_img, val_img, train_lbl, val_lbl]: os.makedirs(d, exist_okTrue) files [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(files) split int(len(files) * 0.8) for i, f in enumerate(files): src_img os.path.join(img_dir, f) stem os.path.splitext(f)[0] src_lbl os.path.join(labels/all, stem .txt) if i split: shutil.copy(src_img, train_img) shutil.copy(src_lbl, train_lbl) else: shutil.copy(src_img, val_img) shutil.copy(src_lbl, val_lbl)参数说明random.seed(42)固定切分换种子会得到不同划分对比实验时别乱动。80/20 是 450 张这种小规模数据集的常见比例验证集 90 张够看 mAP 趋势但置信区间会宽别拿小数点后三位的差异当结论。注意图片和标签必须同名同 stem否则 Ultralytics 找不到对应标注。2.3 data.yaml 里三个字段填错就白跑data.yaml 是 YOLO 训练的入口配置这个数据集对应的写法path: /abs/path/to/dataset train: images/train val: images/val nc: 3 names: 0: concrete_mixer_truck 1: dump_truck 2: excavatorpath建议写绝对路径相对路径在不同工作目录下启动训练时容易翻车。nc必须和 names 数量一致且 class_id 要和标注 txt 里的 id 对得上——这就是 2.1 里统计分布的意义。names 的顺序决定了推理时输出的类别名写反了模型没错、你读结果错了这种坑最隐蔽。常见做法是先把 names 按数据集说明里的顺序填再用统计脚本核对 id 分布是否符合预期。3. 训练参数怎么设450 张图的小数据集调参边界3.1 从预训练权重起步别从零训450 张图从零训练基本没戏模型见过的样本太少特征提取层学不出通用边缘和纹理。标准做法是加载 COCO 预训练的 YOLOv8n 或 YOLOv8s让 backbone 带着通用视觉特征进来只微调检测头。命令如下yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/train \ nameeng_vehicle参数逐个说modelyolov8n.pt是最小的 nano 版本450 张图用 s 或 m 容易过拟合n 够用且训练快。epochs100配合patience2020 轮验证指标不升就早停省得白跑。imgsz640是 YOLO 默认输入尺寸工地车辆在画面里占比通常不小640 够分辨搅拌车滚筒和自卸车斗。batch16看显存8G 卡跑 n 模型 640 尺寸没问题显存紧就降到 8。lr00.01是微调的常见起点如果你发现 loss 前几轮就炸降到 0.001。3.2 数据增强开哪些、关哪些Ultralytics 默认开 mosaic、HSV 抖动、随机翻转。小数据集上 mosaic 是把双刃剑——它把四张图拼一张等效增加了场景多样性但工程车辆的长宽比比较特殊过度拼接会让模型学到不真实的车辆比例。我的习惯是前 80 轮开 mosaic最后 20 轮关掉让模型在接近真实分布的图上收尾。yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ mosaic1.0 \ close_mosaic20 \ hsv_h0.015 hsv_s0.7 hsv_v0.4 \ fliplr0.5 \ degrees0.0close_mosaic20表示最后 20 轮关闭 mosaic这是 YOLOv8 的内置参数比手动改配置省事。degrees0.0关掉旋转增强因为工地摄像头基本是固定角度旋转会引入不存在的视角。fliplr0.5水平翻转保留车辆左右对称性还行但注意如果数据里有文字标识比如车身上的编号翻转会产生镜像文字这种样本对模型是噪声介意的话降到 0.2。3.3 验证集指标怎么看才不被忽悠训练完看 results.csv 或 runs 目录下的混淆矩阵。小数据集上 mAP0.5 能到 0.7 以上算正常但别只看总数——三类里挖掘机的类内差异最大不同臂展、不同角度mAP 往往最低。如果某一类 mAP 明显拖后腿先回去看那类的标注框是不是漏标或框太松。from ultralytics import YOLO model YOLO(runs/train/eng_vehicle/weights/best.pt) metrics model.val(datadataset/data.yaml, splitval) print(mAP50:, metrics.box.map50) print(每类 mAP50:, metrics.box.maps)metrics.box.maps返回每类的 mAP 数组顺序和 data.yaml 里 names 一致。参数splitval指定在验证集上评估别手滑写成 train那样指标虚高没有参考价值。如果验证集只有 90 张单类可能就二三十个目标mAP 波动会很大建议多跑几个随机种子取平均或者用 K 折交叉验证虽然 450 张做 5 折每折才 90 张训练但至少能看出模型稳不稳定。4. 推理与部署从 best.pt 到工地摄像头的一步4.1 单图推理和批量推理的写法差异训练完拿到 best.pt先做单图推理确认模型没学歪from ultralytics import YOLO model YOLO(runs/train/eng_vehicle/weights/best.pt) results model.predict( sourcetest_site.jpg, conf0.25, iou0.45, imgsz640, saveTrue ) for box in results[0].boxes: cls_id int(box.cls) conf float(box.conf) xyxy box.xyxy.tolist()[0] print(model.names[cls_id], round(conf, 3), [round(v, 1) for v in xyxy])conf0.25是置信度阈值低于它的框不输出。工地场景里车辆通常是大目标0.25 够用如果误检多提到 0.4 试试。iou0.45是 NMS 的 IoU 阈值两辆车挨得近时调高能保留更多框但太高会出现重复检测。saveTrue把画框结果存到 runs/detect 目录方便肉眼核对。批量推理把 source 换成目录或 glob 即可但要注意批量推理时saveTrue会写一堆图磁盘吃得快。生产环境更常见的是把模型导出成 ONNX 或 TensorRT再用 OpenCV 或 Triton 做服务化。4.2 导出 ONNX 后精度掉了怎么办yolo export modelruns/train/eng_vehicle/weights/best.pt formatonnx imgsz640 opset12导出后拿 ONNX Runtime 跑一遍和 PyTorch 结果对比。常见现象是 ONNX 的框坐标和 PyTorch 差几个像素原因通常是预处理里的 letterbox 填充方式不一致。解决方法是导出时确认imgsz和训练一致推理时用同样的归一化和填充逻辑。如果 mAP 掉超过 2 个点检查 opset 版本12 对 YOLOv8 支持较好太低会缺算子。提示导出 ONNX 后务必用同一批验证图跑一次精度对比别直接上线。我见过导出后类别顺序错乱的情况原因是导出脚本没把 names 写进 metadata。4.3 工地摄像头的实际输入怎么对齐数据集里的图是 JPEG工地摄像头输出可能是 RTSP 流或 H.264。用 OpenCV 拉流后逐帧推理注意帧的 BGR 通道顺序——YOLO 内部会转 RGB但如果你自己做了预处理再喂给模型通道顺序错了颜色就反了模型对搅拌车的橙白色涂装识别会明显下降。常见做法是拉流后直接cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)再传给模型或者干脆把原始帧交给 Ultralytics 的 predict让它自己处理。帧率上YOLOv8n 在 1080Ti 上 640 尺寸大概 60~80 FPS工地监控 25 FPS 的流完全跟得上。如果多路摄像头共用一张卡考虑用 batch 推理或者降 imgsz 到 480精度损失在工程车辆这种大目标上通常可接受。5. 避坑与排查450 张小数据集最容易翻车的五个点5.1 训练 loss 不降检查标注和图片是否同名现象训练启动后 box_loss 在 2.0 附近震荡不降mAP 始终接近 0。原因images 和 labels 目录下的文件名 stem 不一致YOLO 找不到标注把所有图当负样本训。解决写脚本比对两个目录的文件名集合差集就是问题文件。注意有些数据集导出时图片名带.rf.哈希后缀标签名可能被截断这种要手动对齐。5.2 验证集 mAP 远高于训练集切分泄漏了现象val mAP 0.9train mAP 0.6反常。原因切分时同一段视频的连续帧被分到了 train 和 val两边的图几乎一样等于变相泄漏。解决如果数据来自视频抽帧按视频源切分而不是按帧随机切。这个数据集是独立 JPEG泄漏风险低但如果你自己扩充了数据务必按场景或时间段切。5.3 推理时类别名对不上names 顺序写反现象模型把挖掘机标成自卸卡车置信度还挺高。原因data.yaml 里 names 的顺序和标注时的 class_id 映射不一致。解决回到 2.1 的统计脚本确认每个 id 对应的实际类别再改 names。改完重新训练别指望推理时改名字能救回来——模型学的就是错的映射。5.4 显存溢出batch 和 imgsz 的取舍现象训练几轮后 CUDA out of memory。原因batch 或 imgsz 超过显存。解决优先降 batch8 降到 4 对梯度影响可控imgsz 从 640 降到 512 会损失小目标精度但工程车辆是大目标512 通常够。还可以开ampTrue混合精度省显存且速度更快YOLOv8 默认就开。5.5 过拟合训练 mAP 0.95 验证 0.6现象训练集指标漂亮验证集拉胯。原因450 张图对检测模型偏少模型记住了训练样本。解决加大增强mosaic、mixup、加 weight_decay、早停。更根本的是补数据——这个数据集三类各约 150 张如果某一类实际场景里形态特别多150 张覆盖不住考虑自己再标一批同场景图合并训练。6. 小数据集的进阶玩法用三类工程车做跨场景验证450 张图跑通 baseline 只是起点真正决定这个数据集值不值得深挖的是它能不能撑起跨场景验证。我的习惯是留出一批完全没参与训练的工地图——比如换个工地、换个时间段拍的——单独做测试集看模型在分布外数据上的表现。这一步比刷验证集 mAP 有用得多因为工地监控上线后遇到的永远是训练时没见过的光照和角度。具体做法从原始数据里按拍摄场景分组确保验证集和测试集来自不同场景。如果数据里没有场景标签就按图片的色调、天气、车辆密度人工分几组。然后用同一套权重分别跑验证集和测试集对比每类 mAP 的跌幅。跌幅超过 15 个点说明模型过拟合到了训练场景的特定纹理需要补该场景的数据或加强颜色增强。另一个玩法是把这三类工程车当预训练任务。你手头如果有其他工业车辆数据——叉车、吊车、泵车——可以先用这个数据集训一个特征提取器再迁移到新类别上。小样本迁移时冻结 backbone 前几层只训检测头通常 50 张新类图就能出可用效果。这个思路在工业数据集里很实用因为标注成本高能复用的特征就别重学。from ultralytics import YOLO # 加载已训练权重替换检测头类别数为新任务 model YOLO(runs/train/eng_vehicle/weights/best.pt) model.model.model[-1].nc 5 # 新任务 5 类 model.model.names {0: forklift, 1: crane, 2: pump_truck, 3: bulldozer, 4: roller} model.train(datanew_task.yaml, epochs50, freeze10, lr00.001)freeze10冻结前 10 层保留通用特征lr00.001比从头训小一个量级避免破坏预训练权重。注意替换 nc 后检测头的输出维度变了旧权重里检测头部分会随机初始化这是正常的backbone 权重仍然有效。从那以后我每次拿到小规模行业数据集都强制先跑一遍跨场景测试再决定要不要扩标——验证集好看不代表能用工地上的光照和扬尘才是真正的考官。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →