航拍路面标志检测数据集VOC+YOLO:566张9类别YOLOv8训练实战
发布时间:2026/9/28 16:44:38来源:尧图网络
简介本资源为航拍路面直行与转弯标志检测数据集面向从事交通标志识别、自动驾驶感知及计算机视觉研究的学生与算法工程师可解决航拍视角下多方向路面指示标志样本稀缺、标注格式不统一的问题。包内共1700个文件包含566张jpg图片、566个VOC格式xml标注文件、566个YOLO格式txt标注文件及少量说明文件压缩包约236.49MB同时兼容Pascal VOC与YOLO两种主流训练流程无需额外转换即可直接投入检测模型训练。标注共9类覆盖left、left_back、left_right、right、straight、straight_back、straight_left、straight_left_right、straight_right等直行与转弯组合方向并已做数据增强适合用于多分类路面标志检测任务。目前已有144人学习下载读者可借此快速搭建训练与验证环境省去自行采集与标注成本并对照图片预览确认样本分布是否符合自身项目需求。1. 航拍视角下的路面标志检测566 张图、9 个类别这套 VOCYOLO 数据集到底怎么用拿到「航拍路面直行和转弯标志检测数据集VOCYOLO格式566张9类别」这个标题第一反应通常是两个问题566 张够不够训一个能用的检测器9 个类别具体是哪 9 个先说结论——566 张在通用目标检测里属于小样本但路面导向标志这类目标具有强形状先验直行箭头、左右转箭头、直行带转、掉头、人行横道预告等类间差异靠几何轮廓就能区分所以只要标注干净、类别定义不重叠用 YOLO 系列做迁移学习是能跑出可用模型的。这套数据集同时提供 VOCXML 标注和 YOLOtxt 归一化坐标两种格式意味着你可以直接喂给 ultralytics 系的训练脚本也可以先用 VOC 做数据审查和可视化核对。它适合三类人做无人机巡检/智慧交通原型的工程师、需要快速验证航拍小目标检测方案的学生、以及想把路面标志识别嵌进已有 YOLO 流水线的开发者。下面按「先看清数据长什么样 → 再跑通训练 → 再处理航拍特有的坑」这条线讲透。2. 先搞懂 VOC 与 YOLO 双格式同一批标注的两种表达2.1 VOC XML 和 YOLO txt 到底差在哪VOC 格式每张图对应一个同名 XML核心字段是size里的宽高和若干object每个 object 里有name类别名和bndboxxmin/ymin/xmax/ymax绝对像素坐标左上角为原点。YOLO 格式每张图对应一个同名 txt每行是class_id cx cy w h全部是相对图像宽高的归一化值0~1class_id 从 0 开始按类别列表顺序编号。两者不是简单缩放关系——VOC 的坐标是整数像素且包含边界YOLO 的中心点坐标是浮点转换时如果直接(xminxmax)/2/width而不做边界裁剪遇到标注框贴边的情况会算出略大于 1 的值训练时会被 ultralytics 直接过滤掉这是最常见的「转换后少框」原因。维度VOC XMLYOLO txt坐标类型绝对像素整数归一化浮点每图文件数1 个 XML1 个 txt类别表达字符串 name整数 class_id类别映射无需额外文件依赖 classes.txt / data.yaml审查友好度高可读低需还原2.2 用脚本核对两套标注是否一致拿到数据集第一件事不是训练是验证 VOC 和 YOLO 两套标注是否一一对应、有没有漏转。下面这段脚本做三件事统计图片数、统计 XML 数、统计 txt 数并抽查前若干张的框数量是否一致。import os from pathlib import Path import xml.etree.ElementTree as ET img_dir Path(images) xml_dir Path(annotations_xml) txt_dir Path(labels_yolo) imgs {p.stem for p in img_dir.glob(*.jpg)} xmls {p.stem for p in xml_dir.glob(*.xml)} txts {p.stem for p in txt_dir.glob(*.txt)} print(图片:, len(imgs), XML:, len(xmls), TXT:, len(txts)) print(有图无XML:, imgs - xmls) print(有XML无图:, xmls - imgs) print(有图无TXT:, imgs - txts) # 抽查框数量是否一致 mismatch [] for stem in list(imgs xmls txts)[:50]: tree ET.parse(xml_dir / f{stem}.xml) n_xml len(tree.getroot().findall(object)) with open(txt_dir / f{stem}.txt) as f: n_txt len([l for l in f if l.strip()]) if n_xml ! n_txt: mismatch.append((stem, n_xml, n_txt)) print(框数不一致样本:, mismatch)逻辑说明用集合运算快速定位缺失文件比逐张打开快得多。参数上img_dir/xml_dir/txt_dir按你解压后的实际目录名改抽查数量 50 是经验值能覆盖大部分转换脚本的系统性错误。如果有图无TXT非空说明转换脚本中途崩了或某些图没有目标YOLO 允许空 txt但 VOC 通常不会为空图建 XML需要人工确认这些图是否真的无目标。2.3 类别映射必须自己建一份YOLO 训练依赖data.yaml里的names列表顺序必须和 txt 里的 class_id 严格对应。数据集自带的 classes 文件如果缺失或顺序可疑最稳的做法是从 XML 里重新抽取类别名并按字母序或自定义序固定下来然后重新生成一遍 txt。常见做法是import xml.etree.ElementTree as ET from pathlib import Path names set() for xml in Path(annotations_xml).glob(*.xml): for obj in ET.parse(xml).getroot().findall(object): names.add(obj.find(name).text.strip()) names sorted(names) print(类别数:, len(names)) for i, n in enumerate(names): print(i, n)把打印结果写进data.yaml的names并确保后续所有转换脚本用同一份映射。这一步不做训练时会出现「类别名对不上但 loss 照降」的玄学现象——模型学的是错的 idmAP 会低得莫名其妙。3. 用 YOLOv8 跑通第一版训练从 data.yaml 到可推理权重3.1 目录结构与 data.yaml 的最小配置ultralytics 对目录结构有约定最省事的组织方式是dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml最小内容如下路径用绝对路径或相对于训练启动目录的相对路径都行但别混用path: /abs/path/to/dataset train: images/train val: images/val nc: 9 names: [crosswalk, left_turn, no_left, no_right, right_turn, straight, straight_left, straight_right, u_turn]nc必须等于 names 长度names 顺序必须和 txt 里的 id 一致。划分比例上566 张建议 8:2即约 453 训练 / 113 验证如果某类样本极少比如掉头标志可能只有二三十个要做分层抽样否则验证集里可能一个该类都没有mAP 直接为 0 不是模型的问题。3.2 训练命令与关键参数怎么设yolo detect train \ datadataset/data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ warmup_epochs3 \ mosaic1.0 \ degrees10 \ translate0.1 \ scale0.5 \ fliplr0.5 \ patience30 \ projectruns_road \ nameexp1参数逐个说modelyolov8s.pt是权衡——n 太小对航拍小目标欠拟合m/l 在 566 张上容易过拟合s 是常见起点。imgsz640是默认但航拍图里标志往往只占几十像素如果原图分辨率高比如 4000×3000直接缩到 640 会让标志变成十几个像素这时要么切图训练要么把 imgsz 提到 1024 并相应降 batch。mosaic1.0对小数据集是有效的增广但航拍图拼接后会出现不自然的视角跳变如果验证 mAP 抖动大可以降到 0.5。degrees10允许小角度旋转因为无人机航向不会永远正对路面但别开太大路面标志的朝向本身是类别信息左转箭头转 180 度就变右转了旋转超过 15 度会制造错误标签。patience30是早停小数据集上过拟合来得快别设太大。3.3 训练过程中该盯哪几个数启动后重点看三处box_loss是否稳定下降前 10 个 epoch 波动正常、mAP50在验证集上的走势、以及cls_loss是否异常高。如果box_loss降但mAP50长期卡在 0.1 以下八成是类别映射错了或标注框大面积越界被过滤。如果mAP50冲到 0.8 以上但mAP50-95很低说明框的位置不够准航拍小目标的定位精度本来就难这属于正常范围。训练完在runs_road/exp1/weights/下拿best.pt做推理验证yolo detect predict \ modelruns_road/exp1/weights/best.pt \ sourcedataset/images/val \ conf0.25 \ saveTrueconf0.25是默认阈值航拍场景如果漏检多可以降到 0.15 看召回但会引入更多误检最终阈值要在业务侧权衡。4. 航拍小目标与类别混淆这套数据集最容易翻车的地方4.1 现象直行和直行带转总是互相误检原因这两类在低分辨率下轮廓高度相似直行带转只是多了一个小分叉当标志在图中只有 20~30 像素时分叉部分可能只占 3~5 个像素卷积特征根本区分不开。解决一是提高输入分辨率或对原图切块比如按 1024×1024 滑窗切重叠 20%让标志在训练时占据更多像素二是在类别定义上做合并如果业务允许把直行和直行带转合成一类等数据量上来再拆。我一般先看混淆矩阵如果这两类的误检占主导就直接合并别硬训。4.2 现象验证集 mAP 很高实际航拍视频推理全是漏检原因数据集里的图可能来自有限几个航段、光照和高度比较单一模型学到了背景相关性而不是标志本身。解决划分验证集时按航段/场景分组别随机打散训练时加强颜色和亮度增广hsv_h0.015, hsv_s0.7, hsv_v0.4并加入erasing0.4随机遮挡逼模型关注形状而非特定纹理。4.3 现象训练到一半 loss 突然变 nan原因小数据集 较大学习率 某些 batch 里全是难样本梯度爆炸。解决把lr0从 0.01 降到 0.005 或 0.001开ampTrue默认开但如果你用的是老显卡不支持混合精度就关掉另外检查标注里有没有宽或高为 0 的框——归一化后 w/h 为 0 会让 loss 计算除零。4.4 现象某些类别在验证集上 AP 恒为 0原因验证集里该类样本数为 0或者该类在训练集里少于 10 个模型根本没学会。解决先统计每类在 train/val 的数量分布样本过少的类要么补充数据要么在训练时用copy_paste或过采样要么直接放弃该类并在 names 里去掉记得同步改 nc 和所有 txt 的 id。4.5 现象VOC 转 YOLO 后框整体偏移原因转换时把xmax/ymax当成了宽高或者忘了减 1VOC 坐标是 1-based 包含边界YOLO 是 0-based。解决转换公式固定为cx(xminxmax)/2/W, cy(yminymax)/2/H, w(xmax-xmin)/W, h(ymax-ymin)/H转换后随机抽 20 张用可视化脚本画框叠在原图上核对别信脚本输出信眼睛。5. 把 566 张用出 5000 张的效果切图、增广与半自动标注数据量小是这套数据集的硬约束但航拍场景有一个天然优势——你可以用训练好的模型去推理同一航段的其他帧做半自动标注再人工修正这是把 566 张滚成几千张最实际的路子。具体做法先用第一版模型对未标注的航拍视频抽帧推理conf0.4保留高置信框导出为 YOLO txt然后人工只做删错和补漏标注速度能提升三到五倍。切图方面如果原图分辨率超过 2000 像素建议按 1024 滑窗切块训练推理时再对整图做滑窗拼接这样小目标的像素占比能翻几倍mAP50 通常有 5~15 个点的提升。增广上航拍特有的可以加perspective0.0005模拟俯仰变化但别加shear路面标志被剪切后形状语义就变了。最后验证别只看 mAP拿一段没参与训练的航拍视频跑一遍统计每类的漏检和误检帧数这才是能不能上线的依据。我自己踩过的最大坑是只盯验证集 mAP 调参结果换一个航段推理直接崩后来养成习惯任何一版权重都必须过一段独立视频才算数。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网