ARTICLE DETAIL

资讯详情

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

834张道路限高杆检测数据集:VOC与YOLO双格式,YOLOv8训练实战

834张道路限高杆检测数据集:VOC与YOLO双格式,YOLOv8训练实战 简介这份资源是面向计算机视觉与目标检测方向的开发者、算法学习者及工程落地人员整理的道路限高杆、限高架检测数据集可用于训练和验证单类别目标检测模型适用于交通设施巡检、道路安全监测、自动驾驶感知等场景。压缩包共约2000个文件包含834张jpg图片、834个VOC格式xml标注文件、834个YOLO格式txt标注文件另有少量说明类txt整体约36.93MBVOC与YOLO双格式并存方便直接接入不同检测框架。标注由labelImg完成类别仅height limit pole一类共870个标注框标注密度适中适合作为单类别检测的入门与对比实验数据。目前已有79人学习下载读者可据此快速搭建训练集与验证集省去自行采集与标注的成本并对照双格式标注理解坐标转换与数据组织方式。1. 834 张道路限高杆限高架检测数据集单类别 870 框VOC 与 YOLO 双格式开箱即用做道路巡检、无人配送车或工程车辆辅助驾驶的团队绕不开限高杆和限高架这类目标。它不像行人车辆那样有成熟的大规模公开数据集很多时候得自己扛着相机去路口拍回来再一张张标。这份 834 张的限高杆限高架检测数据集正好补上这个缺口图片全部是 jpg配套 834 个 Pascal VOC 格式 xml 和 834 个 YOLO 格式 txt标注类别只有一个——height limit pole总框数 870。标注工具用的是 labelImg意味着坐标框风格规整没有奇怪的旋转框或分割掩码。它适合两类人一类是想快速验证 YOLO 系列训练流程、不想从零打标的算法工程师另一类是做道路设施巡检、需要一个小而干净的单类别数据集做 baseline 的从业者。834 张不算大但单类别、双格式、标注一致拿来跑通训练和推理链路足够。2. 数据集结构与格式解析VOC 与 YOLO 到底差在哪2.1 目录组织与文件对应关系拿到压缩包解压后常见做法是看到三个平行目录JPEGImages 放 834 张 jpgAnnotations 放 834 个 xmllabels 放 834 个 txt。文件名主干一致比如 image_xyxr_819.jpg 对应 image_xyxr_819.xml 和 image_xyxr_819.txt。这种一一对应关系是后续写转换脚本和校验脚本的基础。如果解压后发现 xml 和 txt 混在同一层或者文件名带多余前缀先别急着训练花五分钟做一次文件名对齐否则训练时会出现大量“找不到标签”的静默丢样本。VOC 的 xml 里关键字段是 size 下的 width、height、depth以及每个 object 下的 name、bndbox 的 xmin、ymin、xmax、ymax。YOLO 的 txt 每行是class_id x_center y_center width height全部归一化到 0 到 1。这份数据集只有一个类别所以 class_id 恒为 0。理解这两套坐标的换算是后面排查框偏移问题的核心。2.2 两种格式的坐标换算逻辑VOC 是绝对像素坐标左上角和右下角YOLO 是归一化中心点加宽高。换算关系如下# VOC - YOLO 坐标换算 # xml 中读到的 bndbox: xmin, ymin, xmax, ymax # 图片尺寸: img_w, img_h x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h # 写入 txt: f{class_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}这段逻辑里除以 img_w 和 img_h 用的是每张图自己的尺寸不是固定值。限高杆图片可能来自不同分辨率相机如果统一按 1920x1080 归一化遇到 1280x720 的图就会整体偏移。我一般会在转换脚本里加一句断言检查 xmax 是否超过 img_w超过就打印文件名这类越界框在标注时手抖很常见。2.3 用脚本做一次完整性校验训练前跑一遍校验能省掉后面几个小时的无效等待。下面这个脚本检查三件事jpg、xml、txt 数量是否都是 834每个 xml 是否能解析每个 txt 行数是否和 xml 中 object 数一致。import os import xml.etree.ElementTree as ET img_dir JPEGImages xml_dir Annotations txt_dir labels imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.endswith(.jpg)} xmls {os.path.splitext(f)[0] for f in os.listdir(xml_dir) if f.endswith(.xml)} txts {os.path.splitext(f)[0] for f in os.listdir(txt_dir) if f.endswith(.txt)} print(jpg:, len(imgs), xml:, len(xmls), txt:, len(txts)) print(缺失 xml:, imgs - xmls) print(缺失 txt:, imgs - txts) for name in sorted(xmls): tree ET.parse(os.path.join(xml_dir, name .xml)) root tree.getroot() obj_num len(root.findall(object)) txt_path os.path.join(txt_dir, name .txt) with open(txt_path) as f: lines [l for l in f.readlines() if l.strip()] if obj_num ! len(lines): print(数量不一致:, name, xml:, obj_num, txt:, len(lines))参数说明img_dir、xml_dir、txt_dir 按实际解压后的目录名改。输出里如果“缺失 xml”或“缺失 txt”非空说明有图片没标或标签丢失需要人工补。数量不一致的样本通常是标注时删了框但没同步导出建议直接剔除或重新标注。这一步做完数据集才算真正可用。3. 从零跑通 YOLO 训练环境、配置与启动命令3.1 环境准备与依赖版本选择YOLOv8 是目前这类单类别数据集最省事的选择ultralytics 包把训练、验证、导出串成一条命令。Anaconda 建环境时Python 选 3.9 或 3.10太新的 3.12 偶尔会和某些 torch 版本打架。CUDA 版本按显卡驱动来30 系卡用 cu118 比较稳。安装命令conda create -n heightpole python3.10 -y conda activate heightpole pip install ultralytics # 如需指定 torch 版本 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118装完用yolo checks看一眼环境确认 CUDA 可用、版本没冲突。如果显示 CPU only先别急着训练检查驱动和 torch 是否匹配否则 834 张图在 CPU 上跑 100 轮会等到怀疑人生。3.2 数据集配置文件与目录划分ultralytics 要求一个 yaml 描述数据路径和类别。先把数据按 8:1:1 切成 train、val、test目录结构建议dataset/ images/ train/ val/ test/ labels/ train/ val/ test/切分脚本用 Python 的 random.shuffle 固定种子保证可复现import os, random, shutil random.seed(42) src_img JPEGImages src_lbl labels pairs [os.path.splitext(f)[0] for f in os.listdir(src_img) if f.endswith(.jpg)] random.shuffle(pairs) n len(pairs) train, val pairs[:int(n*0.8)], pairs[int(n*0.8):int(n*0.9)] test pairs[int(n*0.9):] for split, names in [(train, train), (val, val), (test, test)]: for sub in [images, labels]: os.makedirs(fdataset/{sub}/{split}, exist_okTrue) for name in names: shutil.copy(f{src_img}/{name}.jpg, fdataset/images/{split}/{name}.jpg) shutil.copy(f{src_lbl}/{name}.txt, fdataset/labels/{split}/{name}.txt)参数说明random.seed 固定后每次切分结果一致方便对比实验。比例 8:1:1 对 834 张来说验证集约 83 张测试集约 83 张够用。如果后续要加数据保持同一 seed 重新切避免新旧混切导致泄漏。然后写 heightpole.yamlpath: /abs/path/to/dataset train: images/train val: images/val test: images/test nc: 1 names: [height limit pole]path 用绝对路径相对路径在部分版本会解析到 ultralytics 安装目录下这是新手最常踩的坑之一。3.3 启动训练与关键参数含义yolo detect train \ dataheightpole.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/heightpole \ nameexp1参数逐个说model 选 yolov8n 是因为单类别、数据量不大n 版够用想提精度换 s 或 m。imgsz640 是默认限高杆在图中往往细长如果原图分辨率高且杆体占比小可以试 960但显存和速度要权衡。batch16 按显存调8G 卡跑 640 一般没问题。lr0 初始学习率 0.01 是常见起点loss 震荡就降到 0.005。patience20 表示 20 轮没提升就早停省时间。训练日志里重点看 box_loss 和 mAP50单类别任务 mAP50 通常能到 0.9 以上如果卡在 0.5 左右回去查标签格式。4. 推理、验证与踩坑排查那些让 mAP 掉点的细节4.1 推理与可视化验证训练完先别急着部署拿测试集跑一遍推理肉眼看看框得准不准yolo detect predict \ modelruns/heightpole/exp1/weights/best.pt \ sourcedataset/images/test \ conf0.25 \ saveTrueconf0.25 是默认置信度门限。限高杆如果被误检成其他杆状物可以往上调到 0.4 到 0.5如果漏检多往下调到 0.15 试试。输出图在 runs/detect/predict 下重点看远处小目标和逆光场景这两类最容易翻车。4.2 常见问题排查清单现象一训练一开始就报“No labels found”。原因yaml 里 train 路径写成了 images/train但 ultralytics 会自动把 images 替换成 labels 去找标签如果实际目录不是 images/labels 平行结构就找不到。解决严格按 3.2 的目录结构放或者用绝对路径写清楚。现象二mAP 一直很低框位置整体偏移。原因VOC 转 YOLO 时归一化用错了图片尺寸或者 xml 里的 size 和实际 jpg 尺寸不一致。解决跑 2.3 的校验脚本再抽查几张图用 PIL 读实际尺寸和 xml 里的 width、height 对比。现象三验证集 loss 正常但 mAP 为 0。原因类别名或 nc 写错。names 里写的是 height limit pole如果 yaml 里写成 height_limit_pole 或 nc 写成 2标签解析就乱了。解决核对 names 和 txt 里的 class_id单类别 class_id 必须全是 0。现象四训练中途显存爆了。原因batch 太大或 imgsz 太高。解决先把 batch 降到 8还爆就 imgsz 降到 512或者换 yolov8n。别硬扛爆一次显存可能丢一轮进度。现象五推理时框重叠严重。原因限高杆和限高架在图中常同时出现单类别下模型可能对同一目标出多个框。解决推理时加iou0.5做 NMS或者训练时检查标注是否有重复框。4.3 数据增强的取舍ultralytics 默认开了 mosaic、HSV 抖动、翻转等增强。对限高杆这种垂直结构上下翻转要慎用翻过来就不像限高杆了。常见做法是在 yaml 同级加一个 aug 配置或者训练命令里关掉部分增强yolo detect train dataheightpole.yaml modelyolov8n.pt epochs100 fliplr0.5 flipud0.0 mosaic1.0flipud0.0 关掉上下翻转fliplr0.5 保留左右翻转mosaic1.0 保持默认。如果数据里限高杆总是出现在画面上半部分mosaic 可能把目标拼到奇怪位置可以降到 0.5 观察 mAP 变化。这些参数没有绝对最优跑两组对比最实在。5. 进阶技巧把 834 张用到极致与模型导出数据量不大时想把 mAP 再往上推一档我一般从三个方向下手。第一是难例挖掘用训练好的 best.pt 在测试集上推理把漏检和误检的图挑出来人工补标或修正后加入训练集再跑一轮。834 张里通常有几十张是逆光、遮挡、远距离的硬骨头补完这批mAP 往往能涨两三个点。第二是切片推理限高杆在 4K 图里可能只占几十像素直接缩到 640 训练会丢细节。常见做法是把原图切成带重叠的子图分别标注和训练推理时再合并这套流程对小目标检测提升明显。第三是模型导出训练完用yolo export modelbest.pt formatonnx导出 ONNX部署到边缘设备时用 onnxruntime 或 TensorRT速度比 PyTorch 快不少。导出后记得用同一张测试图对比 PyTorch 和 ONNX 的输出确认没有精度损失。# 导出 ONNX动态 batch 方便部署 yolo export modelruns/heightpole/exp1/weights/best.pt formatonnx dynamicTrue opset12opset12 兼容性较好dynamicTrue 允许变 batch 和变尺寸输入。导出后拿一张图跑 onnxruntime 推理和 PyTorch 结果做 IoU 对比低于 0.99 就要查预处理是否一致比如归一化方式、letterbox 填充颜色。这些细节不注意部署后精度掉点会让人找半天。从那以后我每次拿到新数据集都强制先跑一遍完整性校验和格式抽查再开始训练。这份 834 张的限高杆数据集结构干净、标注一致按上面的流程走从解压到跑出可用的 best.pt半天时间足够。希望帮到你。本文还有配套的精品资源点击获取
返回列表