☰
车内视角行人检测数据集:6470张YOLO/VOC双格式,直接开训YOLOv8
2026/10/2 14:03:03 网站建设 项目流程

简介:这份车内视角行人识别数据集面向从事目标检测与深度学习的研究者、算法工程师及学生,解决车载场景下行人检测训练数据稀缺的问题。数据取自BDD100K,仅保留行人类别,共6470张图片,同时提供YOLO与VOC两种标注格式,可直接用于YOLOv5至YOLOv10系列以及Faster R-CNN、SSD等模型训练。压缩包约421.52MB,内含2000个文件,以1999个txt标签文件和1个yaml类别配置文件为主,txt为标注框坐标,yaml用于指定类别信息,图片与标签已按训练集、验证集、测试集划分完毕,省去自行切分与格式转换的步骤。目前已有207人学习下载。对于需要快速验证车内行人检测算法、对比不同检测器性能或开展迁移学习的读者,该数据集提供了开箱即用的训练基础,能有效缩短数据准备周期,将精力集中于模型调优与实验分析。

1. 车内视角行人识别数据集:6470 张图,YOLO 和 VOC 双格式直接开训

做自动驾驶感知的同学大概率都经历过这个阶段:想训一个车内视角的行人检测模型,翻遍公开数据集,要么是街景俯拍、要么是路侧固定摄像头,视角跟车载前装差得远。这个数据集解决的就是这个问题——它从 BDD100K 里把行人类别单独抽出来,只保留车内视角的样本,图片数量 6470 张,同时给了 YOLO 的 txt 标签和 VOC 的 xml 标签,还附带指定类别信息的 yaml 文件,训练集、验证集、测试集已经切好。换句话说,你拿到手不用再做格式转换和划分,直接就能喂给 YOLOv5 到 YOLOv10 这一串模型跑起来。适合谁?做自动驾驶感知验证的、想快速验证行人检测算法改动的、以及需要车内视角数据做域适应实验的从业者。下面我按「这份资源到底怎么用、参数怎么设、哪里会翻车」的顺序拆一遍。

2. 数据集结构与格式解析:txt、xml、yaml 三件套怎么配合

2.1 目录组织与文件对应关系

先把压缩包解开,你会看到图片和标签是分开存放的,常见做法是images/和labels/两个大目录,下面再按train、val、test分子目录。VOC 格式的 xml 通常单独放在Annotations/里,yaml 文件放在根目录。这里有个容易忽略的点:YOLO 的 txt 标签文件名必须和图片文件名一一对应,只是扩展名不同。比如0001.jpg对应0001.txt,如果对不上,训练时那批图会被静默跳过,loss 曲线看着正常但实际没学到东西。

我一般拿到新数据集先跑一遍文件名匹配检查,代码不复杂但能省掉后面几小时的排查:

import os img_dir = "images/train" lbl_dir = "labels/train" imgs = {os.path.splitext(f)[0] for f in os.listdir(img_dir)} lbls = {os.path.splitext(f)[0] for f in os.listdir(lbl_dir)} only_img = imgs - lbls only_lbl = lbls - imgs print(f"有图无标签: {len(only_img)}") print(f"有标签无图: {len(only_lbl)}")

这段逻辑就是取两个目录的文件名集合做差集。only_img非空说明有图片没标签,训练时这些图会被忽略;only_lbl非空说明有孤立标签,虽然不影响训练但说明数据切分可能有问题。参数上没什么可调的,目录名按你实际解压后的结构改就行。

2.2 YOLO txt 与 VOC xml 的字段含义

YOLO 的 txt 每行代表一个目标,格式是class_id x_center y_center width height,后四个都是归一化到 0 到 1 之间的浮点数。这个数据集只保留行人类别,所以 class_id 大概率是 0,但别想当然,打开一个 txt 确认一下。VOC 的 xml 则是绝对坐标,xmin、ymin、xmax、ymax四个值,单位是像素。两种格式描述的是同一批标注,只是坐标系和归一化方式不同。

格式坐标类型取值范围典型用途
YOLO txt归一化中心点+宽高0~1 浮点YOLOv5~v10 直接训练
VOC xml绝对左上右下像素整数Faster R-CNN、SSD、mmdetection

如果你要用 Faster R-CNN 或 SSD,走 xml 那条路;要用 YOLO 系列,走 txt。两边不要混用,我见过有人把 xml 的绝对坐标直接塞进 YOLO 的 txt 里,结果框全跑到图片外面去了,训练 loss 直接爆炸。

2.3 yaml 配置文件的关键字段

yaml 文件是 YOLO 系列训练的入口配置,核心就几个字段:path指向数据集根目录,train、val、test分别指向三个子集的图片路径,nc是类别数,names是类别名列表。这个数据集只保留行人,所以nc: 1,names: ['person']。常见做法是把 yaml 里的路径写成相对路径,这样换机器不用改。但要注意,YOLOv5 和 YOLOv8 对path的解析方式略有差异,v5 是相对 yaml 文件所在目录,v8 是相对你执行训练命令时的工作目录。如果你发现训练时报「找不到图片」,八成是这里路径没对上。

提示:改完 yaml 后先用python -c "import yaml; print(yaml.safe_load(open('data.yaml')))"打印一下,确认路径和类别数符合预期再开训。

3. 从零跑通 YOLOv8 训练:环境、命令与参数调优

3.1 环境准备与依赖安装

YOLOv8 用 ultralytics 包,安装比 v5 那套 requirements 清爽不少。我一般用 conda 建个干净环境,Python 3.9 或 3.10 都行,太新的版本偶尔会有 torch 兼容问题。

conda create -n yolo_person python=3.10 -y conda activate yolo_person pip install ultralytics

装完之后yolo checks跑一下,确认 CUDA 可用。如果显示 CPU only,检查你的 torch 是不是装成了 CPU 版。这一步没什么玄学,就是版本对齐问题。显存方面,6470 张图不算大,8G 显存的卡用yolov8n或yolov8s绰绰有余,想上yolov8m就把batch降到 8 或 16。

3.2 训练命令与核心参数说明

假设你的 yaml 文件叫person.yaml,放在数据集根目录,训练命令就一行:

yolo detect train \ data=person.yaml \ model=yolov8s.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ patience=20 \ project=runs/person \ name=exp1

逐个说参数。data指向你的 yaml;model是预训练权重,用yolov8s.pt比从零训收敛快得多;epochs=100对这个数据量够用,但如果你发现 60 轮之后 mAP 还在涨,可以加到 150;imgsz=640是 YOLO 系列的默认输入尺寸,车内视角行人通常不会太小,640 够用,如果远处行人多可以试 1280 但显存翻倍;batch=16按显存调;lr0=0.01是初始学习率,用预训练权重时这个值比较稳,从零训可以降到 0.001;patience=20是早停耐心值,20 轮没提升就停,省时间。

训练过程中重点看三个指标:box_loss应该稳步下降,mAP50逐步上升,mAP50-95上升慢是正常的。如果box_loss震荡剧烈,先把lr0砍一半试试。

3.3 训练结果解读与验证集评估

训完之后runs/person/exp1/下面会有weights/best.pt和results.csv。results.csv里记录了每轮的 loss 和 mAP,用 pandas 读出来画个曲线最直观:

import pandas as pd df = pd.read_csv("runs/person/exp1/results.csv") df.columns = df.columns.str.strip() print(df[["epoch", "train/box_loss", "metrics/mAP50", "metrics/mAP50-95"]].tail(10))

列名里可能有空格,所以先strip()一下。看最后 10 行的 mAP50 是否稳定在某个值附近,如果还在明显上升,说明训练不够,加轮次。验证集评估用yolo detect val model=best.pt data=person.yaml,会输出每类的 AP。行人类别只有一个,所以看metrics/mAP50就行。这个数据集是 BDD100K 抽出来的,标注质量整体不错,但车内视角有反光、遮挡、夜间低照度的情况,mAP 不会像 COCO 那么高,70 到 85 之间都算正常范围。

4. 避坑与排查:训练不收敛、标签错位、显存溢出怎么破

4.1 现象:loss 不降反升,mAP 始终为 0

原因通常有两个:一是标签格式不对,比如把 VOC 的绝对坐标当 YOLO 格式用了;二是 yaml 里nc和实际类别数不一致。解决方法是随机抽几张图把标签画出来看,用 OpenCV 把归一化坐标还原成像素框,叠在图上。如果框的位置明显偏移或大小离谱,就是格式问题。另外确认 txt 里没有空行或多余空格,YOLO 解析器对格式比较敏感。

4.2 现象:训练报「No labels found」

这个报错说明 dataloader 没找到任何有效标签。先检查labels/train目录是否存在且非空,再检查 yaml 里train路径指向的是图片目录还是标签目录——YOLO 的 yaml 里train要指向图片路径,它会自动把images替换成labels去找标签。如果你的目录结构不是标准的images/和labels/并列,就需要手动调整路径或者用path字段重新映射。

4.3 现象:显存溢出,batch 调到 1 还是 OOM

6470 张图里如果有分辨率特别大的,比如 1920x1080 甚至更高,即使imgsz=640也会在数据加载阶段占显存。解决办法是在 yaml 里加rect: True做矩形训练,减少 padding 浪费;或者先把图片统一缩放到 1280 宽再存一份。另外workers设太大会导致内存暴涨,一般设 4 到 8 就行,设 0 是单进程调试用。

4.4 现象:验证集 mAP 远低于训练集

这是过拟合的典型信号。这个数据集只有 6470 张,如果训练集占比过高,验证集样本少,mAP 波动会很大。常见做法是开数据增强,YOLOv8 默认已经带了 mosaic 和 HSV 增强,你可以再加degrees=10、translate=0.1、scale=0.5。另外检查训练集和验证集是否有同一场景的连续帧,BDD100K 是视频抽帧,相邻帧高度相似,如果切分时没打散,验证集里出现训练集近邻帧,mAP 会虚高;反过来如果验证集全是夜间而训练集全是白天,mAP 就会偏低。这个数据集的切分已经做好了,但如果你自己重新切,记得按场景或时间打散。

4.5 现象:推理时框重叠严重,NMS 压不住

车内视角行人密集时,NMS 的iou阈值默认 0.7 可能偏高,导致相邻行人的框互相抑制或者保留太多重叠框。推理时加iou=0.5试试,或者换agnostic_nms=True。如果还是不行,说明模型对遮挡行人区分度不够,需要加更多遮挡样本或者用更大的模型。

5. 进阶玩法:用这份数据做域适应与模型对比实验

这份数据集真正的价值不只是训一个行人检测器,而是它提供了一个干净的、单类别的、车内视角的基准。我一般会拿它做两件事:一是模型横向对比,二是域适应验证。

模型对比很简单,同一份 yaml,分别跑yolov8n、yolov8s、yolov8m,记录 mAP50 和推理延迟。下面这个表格是我在类似数据量下的经验值,你实际跑出来会有出入,但量级可以参考:

模型mAP50 参考单图推理延迟(T4)显存占用
yolov8n65~723~5ms2G
yolov8s72~806~9ms4G
yolov8m78~8512~18ms8G

域适应验证的思路是:用这份车内视角数据做微调,然后在另一个视角的数据集上测,看性能掉多少。如果掉得厉害,说明模型过拟合到车内视角了,需要加多视角数据做混合训练。反过来,如果你手头有路侧视角的行人数据,也可以拿这份数据做目标域的少量微调,验证迁移效果。

还有一个容易被忽略的点:这份数据同时给了 YOLO 和 VOC 两种格式,你可以用它来验证不同框架对同一批标注的解析一致性。比如用 YOLOv8 训一遍,再用 mmdetection 的 Faster R-CNN 训一遍,对比两者的 mAP。如果差距超过 5 个点,大概率是某个框架的坐标转换或增强策略有差异,而不是数据本身的问题。

最后说个我自己的习惯。每次拿到新数据集,不管描述写得多清楚,我都会先抽 20 张图把标签可视化一遍,确认框的位置、类别、遮挡情况符合预期,再开始训练。这个动作花不了十分钟,但能避免后面几小时的无效训练。从那以后我每次开新数据集都强制走一遍可视化检查,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询