
简介这是一份面向YOLO系列目标检测学习者的行人车辆标注数据集适用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流算法可直接用于模型训练与验证测试帮助初学者和算法工程师快速搭建目标检测实验环境。压缩包共994个文件包含331张jpg图像、331个txt标签、331个xml标签以及1个yaml配置文件整体约19.4MB。其中txt为YOLO格式标注记录类别索引与归一化后的中心点坐标、宽高比例xml为VOC格式标注两种格式分文件夹存放便于按需选用data.yaml则用于配置数据集路径与类别信息。数据集已预先划分好训练与验证集涵盖汽车、行人两类目标省去自行标注与整理的时间成本。目前已有83人学习下载适合需要快速验证检测模型效果、练习数据格式转换或开展小规模目标检测项目的读者参考使用。1. 331张图、汽车与人两类标签这份YOLO数据集到底能跑出什么如果你正在找一份能直接丢进 YOLO 训练、不用自己标注、打开就能看到汽车和行人框的数据集这份 331 张图像带标签的资源值得先下下来看一眼。它的定位很明确不是那种动辄几万张的通用检测大库而是一个小体量的行人车辆二类检测集适合做 YOLO 系列算法的入门验证、课程设计、模型微调前的流程跑通或者作为自建数据集之前的格式参考。我见过太多人卡在第一步——不是模型不会搭而是手里没有一份标注规范、目录结构清晰的数据。这份资源解决的就是这个图像和标签成对出现类别聚焦在汽车和人省掉了从零标注的时间。它适合谁适合刚接触 YOLO 目标检测、需要快速看到 loss 下降和 mAP 输出的新手也适合熟手拿它当 pipeline 的冒烟测试集验证自己的训练脚本、数据增强和推理代码有没有问题。331 张不算多但足够把整个链路走通一遍。2. 拆开这份数据集目录结构、标签格式与类别映射2.1 先搞清楚它长什么样拿到一个带标签的检测数据集第一件事不是急着写训练脚本而是把目录翻一遍。常见做法是图像放一个文件夹、标签放另一个文件夹文件名一一对应。这份资源大概率是这种结构dataset/ ├── images/ │ ├── 0001.jpg │ ├── 0002.jpg │ └── ... └── labels/ ├── 0001.txt ├── 0002.txt └── ...图像是 jpg标签是 txt这是 YOLO 格式的标准搭配。如果你拿到的是 xmlVOC 格式那说明需要先转换但按标题描述“带标签”且面向 YOLO基本可以判断是 YOLO 的 txt 格式。先确认这一点能省掉后面很多返工。2.2 YOLO 标签格式到底怎么读YOLO 的标签文件每一行代表一个目标格式是class_id x_center y_center width height这五个值里后面四个都是归一化到 0~1 的相对值不是像素坐标。这一点是新手最容易翻车的地方——有人直接把标注工具里的像素值写进去训练时 loss 不降反升还找不到原因。归一化的意思是x_center 除以图像宽度y_center 除以图像高度width 和 height 同理。假设一张图是 640×480某个汽车框的像素坐标是左上角 (100, 200)、宽 200、高 150那么x_center (100 200/2) / 640 200/640 0.3125y_center (200 150/2) / 480 275/480 0.5729width 200/640 0.3125height 150/480 0.3125写进 txt 就是0 0.3125 0.5729 0.3125 0.3125。class_id 从 0 开始这份数据集只有汽车和人两类那大概率是 0 和 1 的映射。但具体哪个是 0 哪个是 1不能猜必须去看配套的类别说明文件或者直接统计所有标签里出现的 class_id 分布。2.3 用脚本快速体检数据集在写训练配置之前我习惯先跑一个体检脚本把类别分布、图像尺寸、标签数量都摸清楚。这一步花不了几分钟但能提前发现很多坑import os from collections import Counter from PIL import Image img_dir dataset/images lbl_dir dataset/labels class_counter Counter() size_counter Counter() empty_labels [] missing_labels [] for img_name in os.listdir(img_dir): if not img_name.lower().endswith((.jpg, .png, .jpeg)): continue img_path os.path.join(img_dir, img_name) lbl_path os.path.join(lbl_dir, os.path.splitext(img_name)[0] .txt) # 检查标签是否存在 if not os.path.exists(lbl_path): missing_labels.append(img_name) continue # 统计图像尺寸 with Image.open(img_path) as im: size_counter[im.size] 1 # 统计类别分布 with open(lbl_path, r) as f: lines [l.strip() for l in f if l.strip()] if not lines: empty_labels.append(img_name) for line in lines: cls_id line.split()[0] class_counter[cls_id] 1 print(类别分布:, dict(class_counter)) print(图像尺寸分布:, dict(size_counter)) print(空标签文件:, empty_labels) print(缺失标签文件:, missing_labels)这段脚本做了四件事遍历图像目录、检查标签是否存在、统计图像尺寸分布、统计每个类别的框数量。跑完之后你会得到几个关键信息——类别 id 到底有哪些、图像是不是统一尺寸、有没有空标签或缺失标签。空标签文件在 YOLO 里是合法的表示这张图没有目标但如果空标签占比过高说明数据集质量可能有问题。缺失标签则是硬伤训练时会直接报错。参数说明img_dir和lbl_dir按实际路径改class_counter统计的是 class_id 出现次数不是图像数size_counter能告诉你图像是否需要统一 resize。如果尺寸五花八门训练时要么在 dataloader 里统一 resize要么在预处理阶段就处理好。2.4 类别映射与 data.yamlYOLO 训练需要一个 data.yaml 来描述数据集路径和类别名。这份数据集只有汽车和人那 yaml 大概长这样path: ./dataset train: images val: images nc: 2 names: 0: car 1: person这里有个细节331 张图如果全部拿来训练就没有验证集了。常见做法是划出 10%~20% 做验证比如 280 张训练、51 张验证。可以手动分也可以写个脚本按比例随机拆分。如果只是跑通流程全量训练也能看到 loss 变化但没法评估泛化能力。我一般会拆一份 val 出来哪怕只有三五十张至少能看 mAP 有没有在动。注意names 里的顺序必须和标签里的 class_id 严格对应。如果实际标签里 0 是 person、1 是 car而你 yaml 写反了训练不会报错但推理时框的类别全是错的。这种错误很隐蔽一定要用体检脚本确认。3. 把331张图喂给YOLO训练配置、参数与第一次跑通3.1 环境准备与版本选择YOLO 系列到现在已经有好几个大版本从 v5 到 v8 再到 v11API 差异不小。这份数据集体量小用哪个版本都能跑但新手建议直接用 ultralytics 的 YOLOv8 或 v11安装简单、文档全、报错信息友好。安装命令pip install ultralytics如果你用的是 PyCharm直接在终端里跑这条就行。装完之后yolo命令和 Python API 都能用。GPU 方面331 张图用 CPU 也能跑但会慢很多。如果有 NVIDIA 显卡确认 CUDA 和 PyTorch 版本匹配torch.cuda.is_available()返回 True 就说明能用。3.2 训练命令与关键参数最简训练命令yolo detect train datadataset/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16逐个拆参数data指向 data.yaml 的路径里面定义了训练集、验证集和类别。model预训练权重。yolov8n.pt 是最小的 nano 版本331 张图用 nano 就够了用大模型反而容易过拟合。epochs训练轮数。小数据集 100 轮起步但要看 loss 曲线如果早早就平了加轮数没意义。imgsz输入图像尺寸。640 是默认值如果你的图像本身很小可以降到 416 或 320 加速训练。batch批大小。显存不够就往下调8 或 4 都行不影响最终效果太多。训练开始后终端会打印每个 epoch 的 box_loss、cls_loss、mAP50 等指标。331 张图在单卡上大概几分钟到十几分钟就能跑完 100 轮具体看硬件。3.3 训练过程中该盯什么第一次跑通重点不是追求高 mAP而是确认整条链路没有断。盯三个东西第一loss 有没有在降。box_loss 和 cls_loss 如果一直震荡不降大概率是标签格式有问题回去检查归一化。第二mAP50 有没有从 0 往上走。如果一直是 0说明模型没学到任何东西可能是类别映射错了或者图像和标签没对上。第三有没有报错或警告。比如“no labels found”说明路径配错了“corrupt image”说明有坏图。这些信息在终端里都会打出来别忽略。训练完成后权重默认保存在runs/detect/train/weights/best.pt。这个文件就是后面推理要用的。3.4 推理验证拿几张图看看框训练完不验证等于白跑。用命令行推理yolo detect predict modelruns/detect/train/weights/best.pt sourcedataset/images saveTruesource可以是单张图、文件夹或视频。saveTrue会把带框的结果存到runs/detect/predict/下。跑完之后打开几张看看框的位置对不对、类别标签是不是 car 和 person。如果框全偏了或者类别全反了回到 2.4 节检查类别映射。也可以用 Python API 做更细的控制from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model(dataset/images/0001.jpg, conf0.25, iou0.45) for r in results: for box in r.boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别: {model.names[cls_id]}, 置信度: {conf:.2f}, 坐标: {xyxy})conf是置信度阈值低于这个值的框会被过滤掉iou是 NMS 的 IoU 阈值控制重叠框的合并程度。这两个参数在推理时很关键——conf 调高会漏检调低会误检iou 调高会保留更多重叠框调低会合并得更激进。331 张图训练出来的模型conf 设在 0.25 左右比较稳具体要看实际效果微调。4. 小数据集训练的避坑与排查331张图最容易翻车的五个地方4.1 现象loss 不降mAP 始终为 0原因标签格式错误最常见的是坐标没归一化或者 class_id 从 1 开始而不是 0。YOLO 要求 class_id 从 0 开始连续编号如果标签里写的是 1 和 2而 yaml 里 nc2、names 只有 0 和 1模型就找不到对应类别。解决用 2.3 节的体检脚本统计 class_id 分布确认只有 0 和 1。如果有其他值要么改标签要么改 yaml。坐标归一化的问题检查标签里有没有大于 1 的数有就说明没归一化。4.2 现象训练报错“No labels found”原因data.yaml 里的路径写错了或者图像和标签的文件名没有一一对应。YOLO 找标签的逻辑是把图像路径里的images替换成labels扩展名换成.txt。如果目录结构不是标准的 images/labels 平行结构就会找不到。解决确认目录结构是dataset/images/xxx.jpg对应dataset/labels/xxx.txt。如果标签在别的目录要么移过去要么在 yaml 里用绝对路径。文件名大小写也要注意Linux 下0001.JPG和0001.jpg是两个文件。4.3 现象训练集 mAP 很高验证集一塌糊涂原因331 张图太少模型过拟合了。小数据集上模型很容易记住训练样本而不是学到特征。如果验证集和训练集分布差异大或者验证集本身太小指标波动会很大。解决加数据增强。YOLO 默认开启 mosaic、翻转、缩放等增强但可以手动调强一点比如degrees10、translate0.1、scale0.5。另外用更小的模型nano 而不是 large加 weight_decay早停patience 参数都能缓解过拟合。4.4 现象推理时框的位置整体偏移原因图像在训练时被 resize 了但推理时没有做同样的预处理。YOLO 内部会自动处理 resize但如果你自己写了预处理代码就要保证训练和推理的 resize 逻辑一致。解决用 ultralytics 的 predict 接口它内部会处理。如果自己写推理脚本确保 letterbox 或 resize 的参数和训练时一致。另外检查图像是否被 EXIF 旋转信息影响有些手机拍的图带旋转标记PIL 读取时可能方向不对。4.5 现象某些类别完全检测不到原因类别不平衡。331 张图里如果汽车有 800 个框、行人只有 50 个框模型会偏向检测汽车行人就学不好。这是小数据集的通病。解决统计各类别框数量如果差距太大要么补数据要么在 loss 里给少样本类别加权。YOLO 本身没有直接的类别权重参数但可以通过复制少样本图像来平衡。另外降低 conf 阈值看看是不是只是置信度低被过滤了。5. 从331张到可用模型微调策略、评估方法与一个提点技巧331 张图训练出来的模型直接拿去实际场景用大概率不够。但它是一个很好的起点。我一般会把它当预训练权重在自己的数据上做微调。具体做法是先用这份数据集训练一个 base 模型然后把自己的标注数据加进来用更小的学习率继续训练。这样比从 COCO 预训练权重直接上自己的数据收敛更快尤其是当你的场景和行人车辆相关时。评估方面别只看 mAP50。小数据集上 mAP50 波动很大建议同时看 mAP50-95 和各类别的 precision/recall。ultralytics 训练完会自动生成混淆矩阵和 PR 曲线在runs/detect/train/下能找到。如果某个类别的 recall 特别低说明漏检严重要么补数据要么降低 conf。一个提点技巧TTATest Time Augmentation。推理时对同一张图做多种增强翻转、缩放把结果融合能小幅提升 mAP。ultralytics 支持augmentTrue参数yolo detect predict modelbest.pt sourcedataset/images augmentTrue这个技巧在数据量少的时候效果更明显因为模型见过的样本少TTA 相当于在推理阶段增加了视角。但会拖慢推理速度实时场景要权衡。还有一个习惯每次训练完我都会把 best.pt 和 last.pt 都留着然后在验证集上跑一遍yolo detect val把指标记下来。下次改参数或加数据对比指标变化才知道改动有没有用。331 张图跑一轮很快多试几组参数的成本很低。从那以后我每次拿到新数据集都强制先跑一遍体检脚本、确认类别映射、再开训练。这三步花不了十分钟但能省掉后面几小时的排查。希望帮到你。本文还有配套的精品资源点击获取