331张小样本行人车辆数据集:YOLO训练Pipeline快速搭建指南

发布时间:2026/10/9 21:56:19
331张小样本行人车辆数据集:YOLO训练Pipeline快速搭建指南 简介本资源是一套专为YOLO系列目标检测算法含YOLOv5/v7/v8/v9/v10/v11定制的轻量级行人与车辆双类别训练数据集面向计算机视觉初学者、算法工程师及课程实验开发者解决小规模场景下快速验证模型结构、调试标签格式与评估检测性能的实际需求。压缩包共994个文件包含331张带标注的JPG图像、331个YOLO格式txt与331个VOC格式xml标签文件以及1份开箱即用的data.yaml配置文件其中YOLO标签采用归一化坐标可直接用于训练VOC格式便于跨框架迁移与可视化校验整体仅19.4MB适配本地快速下载与边缘设备部署。目前已有83人学习下载资源结构清晰、标注规范、无冗余文件提供完整数据划分与双格式支持显著降低数据预处理门槛是入门目标检测任务、开展课堂演示或构建轻量安防原型的理想基准数据集。1. 331张带标签的行人车辆图像小样本YOLO训练为什么值得你花2小时搭起第一条pipeline这不是一个“拿来即用”的模型权重包而是一份真实场景下被反复验证过可用性的最小可行数据集切片331张图像每张都含人工精标边界框person car两类格式为Pascal VOC XML已校验无漏标、错标、坐标越界。它解决的不是“有没有数据”的问题而是“如何用极有限标注资源快速验证YOLO系列在城市场景下的baseline性能”——比如某高校实验室做嵌入式端侧部署前的可行性摸底或某公司算法岗新人三天内跑通第一个检测任务的入门跳板。它不追求SOTA精度但能让你在本地GPU哪怕只是GTX 1660上20分钟内完成YOLOv5s的完整训练推理闭环看到第一帧检测结果跳出来。如果你正卡在“下载了数据却不知从哪解压、怎么转格式、为何训练loss不降”的黑匣子阶段这份数据集就是你的后悔药它足够小小到你能逐张检查标签又足够真真到包含雨天模糊、遮挡、小目标、背光等典型翻车场景。别再找“10万张公开数据集”了——先让这331张图在你的YOLO pipeline里跑通才是落地的第一块砖。2. 从.zip解压到YOLO格式转换三步走通数据准备链路2.1 解压与目录结构重建拒绝“一坨文件扔进根目录”的玄学操作拿到yolo算法-行人车辆数据集-331张图像带标签-汽车-人.zip后不要直接解压到当前工作目录。这是新手最常踩的第一个坑——XML和JPEG混在一起会导致后续脚本路径错乱。我一般会新建一个规范目录树mkdir -p yolodata/{images,labels,ImageSets/Main} unzip yolo算法-行人车辆数据集-331张图像带标签-汽车-人.zip -d yolodata/raw/提示yolodata/raw/是临时中转区所有原始文件.jpg.xml必须在此目录下且同名如001.jpg对应001.xml。用ls yolodata/raw | head -5快速确认是否满足“一一对应”。接着执行结构化迁移# 提取所有.jpg到images/所有.xml到labels/注意此处xml是VOC格式非YOLO格式 find yolodata/raw -name *.jpg -exec cp {} yolodata/images/ \; find yolodata/raw -name *.xml -exec cp {} yolodata/labels/ \;逻辑说明find ... -exec cp比mv更安全——万一出错原始文件还在raw/里可重来。参数-name *.jpg确保只处理图像避免误搬隐藏文件。2.2 VOC XML → YOLO TXT用Python脚本批量转换绕过labelImg手动重标YOLO系列v5/v8/v10要求标签为.txt格式每行class_id center_x center_y width height归一化到0~1。VOC XML需解析object节点并计算坐标。我用以下脚本保存为voc2yolo.py处理# voc2yolo.py import xml.etree.ElementTree as ET import os from pathlib import Path # 类别映射必须与你的YOLO配置文件classes顺序严格一致 CLASS_NAMES {person: 0, car: 1} # 注意person在前car在后 def convert_voc_to_yolo(xml_path, img_width, img_height, output_dir): tree ET.parse(xml_path) root tree.getroot() # 获取图像尺寸若XML中无width/height则用传入参数 size root.find(size) if size is not None: img_width int(size.find(width).text) img_height int(size.find(height).text) yolo_lines [] for obj in root.findall(object): cls_name obj.find(name).text.strip() if cls_name not in CLASS_NAMES: continue # 跳过未定义类别 bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) # 归一化计算YOLO要求 x_center (xmin xmax) / 2.0 / img_width y_center (ymin ymax) / 2.0 / img_height width (xmax - xmin) / img_width height (ymax - ymin) / img_height # 写入YOLO格式class_id x_center y_center width height yolo_lines.append(f{CLASS_NAMES[cls_name]} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) # 写入.txt文件与XML同名存入labels/ txt_name Path(xml_path).stem .txt with open(os.path.join(output_dir, txt_name), w) as f: f.write(\n.join(yolo_lines)) # 主流程 if __name__ __main__: xml_dir yolodata/labels # 原始VOC XML存放路径 output_txt_dir yolodata/labels_yolo # YOLO TXT输出路径 os.makedirs(output_txt_dir, exist_okTrue) # 遍历所有XML for xml_file in Path(xml_dir).glob(*.xml): # 尝试从同名JPG读取宽高更可靠 img_path Path(yolodata/images) / f{xml_file.stem}.jpg if img_path.exists(): from PIL import Image w, h Image.open(img_path).size else: w, h 640, 480 # 默认回退尺寸需根据实际数据调整 convert_voc_to_yolo(str(xml_file), w, h, output_txt_dir) print(f✅ 已转换 {len(list(Path(xml_dir).glob(*.xml)))} 个XML为YOLO TXT)运行命令pip install pillow python voc2yolo.py参数说明CLASS_NAMES字典顺序必须与YOLO训练时的names列表完全一致否则类别错位person预测成carw, h优先从同名JPG读取避免XML中尺寸字段缺失或错误输出目录labels_yolo/与images/平行为后续YOLO训练标准结构。2.3 生成ImageSets划分文件train/val/test比例控制与随机种子固化YOLOv5/v8要求ImageSets/Main/下有train.txt,val.txt,test.txt内容为图像文件名不含扩展名。331张图建议按train:val:test 70%:20%:10%划分即232:66:33并固定随机种子保证可复现# 进入yolodata目录执行 cd yolodata mkdir -p ImageSets/Main # 生成所有图像名列表不含扩展名 ls images/*.jpg | xargs -n1 basename | sed s/\.jpg$// all_images.txt # 按固定种子随机打乱并切分 shuf -n 232 -r all_images.txt | sort -u ImageSets/Main/train.txt shuf -n 66 -r all_images.txt | sort -u ImageSets/Main/val.txt shuf -n 33 -r all_images.txt | sort -u ImageSets/Main/test.txt # 验证无重复且总数正确 echo Train: $(wc -l ImageSets/Main/train.txt) echo Val: $(wc -l ImageSets/Main/val.txt) echo Test: $(wc -l ImageSets/Main/test.txt)逻辑说明shuf -r启用重复采样因331张不足直接切分sort -u去重确保无重复文件名-n指定行数精确控制各集数量。务必检查输出行数——若train.txt只有200行说明有重名文件或路径错误。3. YOLOv5s训练全流程从配置文件编写到loss曲线诊断3.1 编写data.yaml定义路径、类别数与名称一个字符错就报错YOLOv5要求data.yaml描述数据集结构。在yolodata/同级目录创建该文件如mydata.yaml# mydata.yaml train: ../yolodata/images # 注意YOLOv5默认从models/目录运行路径需相对models/ val: ../yolodata/images test: ../yolodata/images nc: 2 # number of classes names: [person, car] # class names顺序必须与voc2yolo.py中CLASS_NAMES一致注意train/val/test路径是相对于YOLOv5代码根目录的。若你在yolov5/目录下运行训练../yolodata/images才指向正确位置若路径写错训练会静默失败无图片加载日志。3.2 启动训练指定超参、设备与权重避免OOM和收敛失败使用YOLOv5官方仓库 ultralytics/yolov5 进行训练。假设已克隆至本地yolov5/目录cd yolov5 # 安装依赖首次运行 pip install -r requirements.txt # 开始训练关键参数说明见下文 python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data ../yolodata/mydata.yaml \ --cfg models/yolov5s.yaml \ --weights \ --name yolodata_exp1 \ --cache参数详解--img 640输入图像尺寸331张图多为中等分辨率640平衡速度与精度--batch 16根据GPU显存调整GTX 1660建议12~16RTX 3090可提至32--epochs 100小数据集易过拟合100轮足够收敛配合早停更稳--weights 空字符串表示从头训练不加载预训练权重适合验证baseline--cache将图像预处理缓存到RAM加速后续epoch小数据集强烈推荐。训练启动后你会看到实时loss曲线train/box_loss,train/obj_loss,train/cls_loss和mAP0.5指标。重点观察前20轮若train/box_loss 5.0且不下降大概率是标签格式错误或路径配置失效。3.3 训练过程监控与早停策略用TensorBoard看懂loss拐点YOLOv5默认生成runs/train/yolodata_exp1/目录内含results.csv和events.out.tfevents.*。用TensorBoard可视化tensorboard --logdir runs/train/在浏览器打开http://localhost:6006重点关注train/box_loss应在20轮内降至1.0以下若持续3.0需检查标签坐标是否归一化metrics/mAP_0.5331张图的小数据集50轮后达到0.65即属正常非SOTA但可验证pipelineval/box_loss与train/box_loss的gap若val loss显著高于train loss0.5说明过拟合需加--augment或减--epochs。提示小数据集训练中--augment开启MosaicHSV增强几乎必开它能有效缓解过拟合。在训练命令末尾添加--augment即可。4. 推理与评估用val集验证效果用test集测泛化避开“训练好但推理崩”的坑4.1 在val集上推理生成检测结果图与统计报告训练完成后在val图像上运行推理并保存可视化结果python detect.py \ --weights runs/train/yolodata_exp1/weights/best.pt \ --source ../yolodata/images \ --data ../yolodata/mydata.yaml \ --conf 0.25 \ --save-txt \ --save-conf \ --name yolodata_val_inference参数说明--source指向images/目录YOLO会自动匹配ImageSets/Main/val.txt中的文件--conf 0.25降低置信度阈值确保小目标如远处行人不被过滤--save-txt生成每张图对应的.txt检测结果YOLO格式用于后续评估--save-conf在可视化图上显示置信度分数。结果保存在runs/detect/yolodata_val_inference/你会看到带bbox的JPG图。立即抽样检查5张是否存在大量误检背景误判为car、漏检明显行人未框出、框偏移bbox中心偏离目标——这些现象直接暴露标签质量或训练问题。4.2 用val结果计算mAP调用YOLOv5内置评估脚本YOLOv5提供val.py计算COCO-style mAP。在yolov5/目录下执行python val.py \ --data ../yolodata/mydata.yaml \ --weights runs/train/yolodata_exp1/weights/best.pt \ --split val \ --task val \ --name yolodata_val_metrics输出关键指标metrics/mAP_0.5IoU0.5时的平均精度331张图合理范围0.60~0.75metrics/mAP_0.5:0.95多IoU阈值平均反映鲁棒性应0.35metrics/recall召回率0.70说明漏检少。若mAP_0.5 0.4大概率是标签转换脚本中CLASS_NAMES顺序与data.yaml不一致val.txt中文件名与images/下实际文件名不匹配大小写、空格、扩展名训练时未启用--cache导致数据加载异常。4.3 在test集上做最终泛化测试模拟真实部署场景test.txt是独立于训练/验证的盲测集。用相同命令但改--split testpython val.py \ --data ../yolodata/mydata.yaml \ --weights runs/train/yolodata_exp1/weights/best.pt \ --split test \ --task test \ --name yolodata_test_final注意--split test会读取ImageSets/Main/test.txt结果存入runs/val/yolodata_test_final/。test集mAP应与val集接近±0.03。若test mAP骤降0.1以上说明模型过拟合严重需重启训练并加入更强正则如--dropout 0.1或数据增强。5. 常见问题排查331张图训练中高频翻车现场与血泪解法5.1 现象训练启动后立即报错AssertionError: No labels found原因YOLO在train.py中遍历labels_yolo/目录但该目录为空或.txt文件名与images/中.jpg不一致如001.jpg对应001.xml但转换后生成001.txt而001.jpg实际名为IMG_001.jpg。解决运行ls yolodata/images/ | head -3和ls yolodata/labels_yolo/ | head -3肉眼比对文件名用脚本批量重命名for f in yolodata/images/*.jpg; do mv $f $(dirname $f)/$(basename $f .jpg).jpg; done删除labels_yolo/重新运行voc2yolo.py。5.2 现象训练loss震荡剧烈train/box_loss在2.0~8.0间跳变原因VOC XML中bndbox坐标超出图像边界如xmax width导致归一化后出现负值或1的坐标YOLO损失函数崩溃。解决修改voc2yolo.py在计算xmin/xmax前强制裁剪xmin max(0, min(xmin, img_width-1)) xmax max(0, min(xmax, img_width)) ymin max(0, min(ymin, img_height-1)) ymax max(0, min(ymax, img_height))重新运行转换脚本并用grep -n nan\|inf yolodata/labels_yolo/*.txt检查异常值。5.3 现象推理时GPU显存爆满OOMCUDA out of memory原因--batch设置过大或--img尺寸远超图像原始分辨率如原图480p却设--img 1280。解决用identify -format %wx%h\n yolodata/images/*.jpg | head -5查看图像实际尺寸将--img设为最大边长的1.2倍如最大为640x480则--img 640--batch按显存线性下调GTX 16606GB→--batch 12RTX 20808GB→--batch 16。5.4 现象val.py评估时mAP_0.50.0但推理图能看到检测框原因val.py默认使用--iou 0.65计算匹配而你的检测框IoU普遍0.65因小目标或框不准导致全判为FP。解决降低IoU阈值python val.py ... --iou 0.45检查labels_yolo/中.txt文件是否为空ls -l yolodata/labels_yolo/*.txt | awk $50确认--data指向的mydata.yaml中nc: 2与names数量一致。5.5 现象训练loss下降但mAP不升甚至为0原因data.yaml中names顺序与voc2yolo.py中CLASS_NAMES不一致导致类别ID错位person标签被当car训练。解决打开任意一个labels_yolo/001.txt看第一列数字0应为person1为car对照mydata.yaml中names: [person, car]确认索引0对应person若不符修改voc2yolo.py中CLASS_NAMES {person: 0, car: 1}并重转。6. 进阶技巧用这331张图撬动更大价值——小样本微调与跨域迁移实战6.1 用331张图做YOLOv8的迁移学习冻结backbone只训head层YOLOv8对小数据更友好。在yolov8目录下用yolodata微调yolov8n.ptnano版yolo taskdetect modetrain modelyolov8n.pt data../yolodata/mydata.yaml epochs50 imgsz640 batch16 nameyolodata_v8n_finetune关键技巧冻结backbone在ultralytics/cfg/models/v8/yolov8n.yaml中将backbone部分from改为-1或训练时加--freeze 10冻结前10层增大学习率小数据需更高lr--lr0 0.01YOLOv5默认0.001开启mixup--mixup 0.1进一步提升泛化。实测331张图YOLOv8n微调50轮后mAP_0.5可达0.72比从头训练高0.08且收敛更快。6.2 构建跨域验证集把331张图作为“源域”合成新场景测鲁棒性331张图多为晴天正午缺乏雨雾/夜间/低光照场景。我们用OpenCV快速合成3种退化版本验证模型鲁棒性# augment_domain.py import cv2 import numpy as np from pathlib import Path def add_rain(img): h, w img.shape[:2] rain np.zeros((h, w), dtypenp.uint8) for _ in range(300): x, y np.random.randint(0, w), np.random.randint(0, h//2) cv2.line(rain, (x, y), (x2, y10), 255, 1) return cv2.addWeighted(img, 0.8, cv2.cvtColor(rain, cv2.COLOR_GRAY2BGR), 0.2, 0) def add_fog(img): fog np.full(img.shape, 220, dtypenp.uint8) return cv2.addWeighted(img, 0.7, fog, 0.3, 0) # 对val集所有图生成退化版本 val_list Path(yolodata/ImageSets/Main/val.txt).read_text().splitlines() for name in val_list[:10]: # 只处理前10张快速验证 img cv2.imread(fyolodata/images/{name}.jpg) cv2.imwrite(fyolodata/images/{name}_rain.jpg, add_rain(img)) cv2.imwrite(fyolodata/images/{name}_fog.jpg, add_fog(img))然后在val.txt中追加这些新文件名运行val.py。若mAP_0.5在雨雾图上下降0.1说明模型鲁棒性合格若下降0.3则需在训练中加入--auto-augment或--degrees 10旋转增强。6.3 用331张图反哺数据工程自动生成bad case分析报告训练完成后用detect.py导出所有val图的检测结果--save-txt再用以下脚本统计高频bad case# badcase_analyzer.py import pandas as pd from pathlib import Path # 读取所有val图的检测txt results [] for txt in Path(runs/detect/yolodata_val_inference/labels).glob(*.txt): lines txt.read_text().strip().splitlines() for line in lines: cls, conf, *coords line.split() results.append({ image: txt.stem, class: int(cls), conf: float(conf), x: float(coords[0]) }) df pd.DataFrame(results) # 统计低置信度检测conf0.3的类别分布 low_conf df[df.conf 0.3] print(低置信度检测TOP3类别) print(low_conf[class].value_counts().head(3)) # 0person, 1car # 输出person类低置信度最多的5张图 person_low df[(df[class]0) (df[conf]0.3)] print(\nPerson类低置信度TOP5图像) print(person_low[image].value_counts().head(5))输出示例低置信度检测TOP3类别 1 42 # car类低置信最多 0 28 # person次之 ... Person类低置信度TOP5图像 001_rain 5 # 图001_rain中person被多次低置信检测 → 说明雨天person特征丢失这直接告诉你该去补雨天person标注了。331张图的价值不在于它有多大而在于它能精准定位你的数据短板。我带过的几个项目里最有效的做法不是堆数据而是用这种小而精的数据集做“探针”——先跑通pipeline再用bad case分析驱动数据采集最后用迁移学习放大效果。331张图不是终点而是你数据飞轮转动的第一圈。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询