
简介这份车内视角行人识别数据集面向从事目标检测与深度学习的研究者、算法工程师及学生解决车载场景下行人检测训练数据稀缺的问题。数据取自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: 1names: [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 python3.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 \ dataperson.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/person \ nameexp1逐个说参数。data指向你的 yamlmodel是预训练权重用yolov8s.pt比从零训收敛快得多epochs100对这个数据量够用但如果你发现 60 轮之后 mAP 还在涨可以加到 150imgsz640是 YOLO 系列的默认输入尺寸车内视角行人通常不会太小640 够用如果远处行人多可以试 1280 但显存翻倍batch16按显存调lr00.01是初始学习率用预训练权重时这个值比较稳从零训可以降到 0.001patience20是早停耐心值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 modelbest.pt dataperson.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 还是 OOM6470 张图里如果有分辨率特别大的比如 1920x1080 甚至更高即使imgsz640也会在数据加载阶段占显存。解决办法是在 yaml 里加rect: True做矩形训练减少 padding 浪费或者先把图片统一缩放到 1280 宽再存一份。另外workers设太大会导致内存暴涨一般设 4 到 8 就行设 0 是单进程调试用。4.4 现象验证集 mAP 远低于训练集这是过拟合的典型信号。这个数据集只有 6470 张如果训练集占比过高验证集样本少mAP 波动会很大。常见做法是开数据增强YOLOv8 默认已经带了 mosaic 和 HSV 增强你可以再加degrees10、translate0.1、scale0.5。另外检查训练集和验证集是否有同一场景的连续帧BDD100K 是视频抽帧相邻帧高度相似如果切分时没打散验证集里出现训练集近邻帧mAP 会虚高反过来如果验证集全是夜间而训练集全是白天mAP 就会偏低。这个数据集的切分已经做好了但如果你自己重新切记得按场景或时间打散。4.5 现象推理时框重叠严重NMS 压不住车内视角行人密集时NMS 的iou阈值默认 0.7 可能偏高导致相邻行人的框互相抑制或者保留太多重叠框。推理时加iou0.5试试或者换agnostic_nmsTrue。如果还是不行说明模型对遮挡行人区分度不够需要加更多遮挡样本或者用更大的模型。5. 进阶玩法用这份数据做域适应与模型对比实验这份数据集真正的价值不只是训一个行人检测器而是它提供了一个干净的、单类别的、车内视角的基准。我一般会拿它做两件事一是模型横向对比二是域适应验证。模型对比很简单同一份 yaml分别跑yolov8n、yolov8s、yolov8m记录 mAP50 和推理延迟。下面这个表格是我在类似数据量下的经验值你实际跑出来会有出入但量级可以参考模型mAP50 参考单图推理延迟T4显存占用yolov8n65~723~5ms2Gyolov8s72~806~9ms4Gyolov8m78~8512~18ms8G域适应验证的思路是用这份车内视角数据做微调然后在另一个视角的数据集上测看性能掉多少。如果掉得厉害说明模型过拟合到车内视角了需要加多视角数据做混合训练。反过来如果你手头有路侧视角的行人数据也可以拿这份数据做目标域的少量微调验证迁移效果。还有一个容易被忽略的点这份数据同时给了 YOLO 和 VOC 两种格式你可以用它来验证不同框架对同一批标注的解析一致性。比如用 YOLOv8 训一遍再用 mmdetection 的 Faster R-CNN 训一遍对比两者的 mAP。如果差距超过 5 个点大概率是某个框架的坐标转换或增强策略有差异而不是数据本身的问题。最后说个我自己的习惯。每次拿到新数据集不管描述写得多清楚我都会先抽 20 张图把标签可视化一遍确认框的位置、类别、遮挡情况符合预期再开始训练。这个动作花不了十分钟但能避免后面几小时的无效训练。从那以后我每次开新数据集都强制走一遍可视化检查希望帮到你。本文还有配套的精品资源点击获取