尧图精选

停车位识别YOLOv5数据集:从标注到训练全流程实战

🕒 发布时间:2026/10/2 15:06:38 📁 来源:尧图网络
简介这份停车位识别数据集面向从事深度学习目标检测的开发者与学习者尤其适合用YOLOv5做停车场车位占用状态识别的训练与验证。数据源自PKLot从监控摄像头帧中提取12,416张停车场图像覆盖晴天、阴天和雨天场景每个车位均标注为已占用或空置原始旋转矩形注释已转换为标准目标检测边界框格式可直接投入训练。压缩包共24,834个文件含12,416张jpg图像、12,417个txt标注文件及1个yaml配置文件整体约866.09MByaml用于定义数据集路径与类别txt对应每张图的标注框jpg为原始画面结构清晰便于直接接入YOLOv5训练流程。目前已有2590人学习下载适合需要真实停车场场景数据做模型训练、算法验证或课程实践的中高级读者参考使用。1. 停车位识别数据集到底能省掉多少标注时间如果你正在做智慧停车、园区车位引导或者自动泊车相关的视觉项目第一道拦路虎往往不是模型结构而是标注好的停车位数据。自己从监控视频里抽帧、画框、核对一个中等规模停车场干下来少说两三天还容易漏标斜向车位和遮挡车位。这份停车位识别 yolov5 数据集就是冲着这个环节来的它把已经标注好的车位图像按 YOLO 格式整理成可直接训练的目录结构省掉从零标注的重复劳动。适合两类人——一类是刚接触深度学习、想跑通目标检测全流程的新手另一类是有模型但缺垂直场景数据、想快速验证停车位检测可行性的从业者。拿到手之后你面对的不是一堆散图而是一套能直接喂给 yolov5 训练脚本的工程化素材。2. 拆开压缩包先看什么目录结构与标注格式核对2.1 标准 YOLO 数据集长什么样YOLO 系列对数据组织方式有固定约定拿到任何一份数据集第一件事不是急着训练而是确认它是否符合这套约定。常见做法是 images 和 labels 两个平行目录各自再分 train、val文件名一一对应图片是 jpg 或 png标签是同名 txt。标签文件里每一行代表一个目标格式为类别编号 中心x 中心y 宽 高后四个值都是相对整图宽高的归一化浮点数范围 0 到 1。停车位识别通常只有一个类别所以类别编号基本是 0。如果这份数据集里出现了多类比如区分「空闲车位」和「占用车位」那类别编号就会有 0 和 1训练时的 nc 参数要跟着改。核对时我一般会先跑一段脚本统计图片数量、标签数量、有没有空标签、有没有越界坐标。空标签文件在 YOLO 里是合法的表示这张图没有目标但如果大量出现说明数据质量有问题。import os from pathlib import Path # 指向解压后的数据集根目录 root Path(./parking_dataset) for split in [train, val]: img_dir root / images / split lbl_dir root / labels / split imgs list(img_dir.glob(*.*)) empty, mismatch 0, 0 for img in imgs: lbl lbl_dir / (img.stem .txt) if not lbl.exists(): mismatch 1 continue lines [l for l in lbl.read_text().strip().splitlines() if l.strip()] if not lines: empty 1 continue for line in lines: parts line.split() if len(parts) ! 5: print(格式异常:, lbl, line) continue cls, cx, cy, w, h parts vals list(map(float, [cx, cy, w, h])) if any(v 0 or v 1 for v in vals): print(坐标越界:, lbl, line) print(f{split}: 图片 {len(imgs)} 张, 空标签 {empty}, 缺标签 {mismatch})这段脚本做三件事统计每个 split 的图片总数、找出没有对应标签文件的图片、检查标签行数和坐标范围。参数上只需要改root指向你解压后的实际路径。如果mismatch不为零说明图片和标签没对齐训练时 dataloader 会直接报错或者静默跳过必须先把文件名对齐。2.2 用可视化确认标注框贴合车位数字核对完还不够停车位标注有个特殊之处车位是四边形但 YOLO 用的是水平矩形框。斜向车位用水平框包住时框里会混入大量非车位区域这是 YOLO 做车位检测的先天局限。所以第二步要把标签画回图上肉眼确认框是否合理。import cv2 from pathlib import Path root Path(./parking_dataset) img_dir root / images / train lbl_dir root / labels / train save_dir Path(./vis); save_dir.mkdir(exist_okTrue) for img_path in list(img_dir.glob(*.jpg))[:20]: # 先看前20张 img cv2.imread(str(img_path)) h, w img.shape[:2] lbl lbl_dir / (img_path.stem .txt) if not lbl.exists(): continue for line in lbl.read_text().strip().splitlines(): cls, cx, cy, bw, bh map(float, line.split()) x1 int((cx - bw / 2) * w); y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w); y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(str(save_dir / img_path.name), img) print(可视化结果已存到 ./vis)反归一化公式是x1 (cx - bw/2) * w这是把 YOLO 标签还原成像素坐标的标准做法。跑完打开 vis 目录重点看三类问题框是否把相邻车位也框进去了、斜向车位的框是否过大、有没有漏框的明显车位。这一步花十分钟能避免训练几小时后才发现标注质量不行。提示如果发现大量斜向车位被水平框包得很难看不要急着放弃这份数据。可以先用它跑通流程后续再考虑旋转框方案但那是另一个话题了。3. 从零跑通 yolov5 训练环境、配置与启动命令3.1 环境配置与依赖安装yolov5 对环境不算挑剔但版本错配是新手翻车重灾区。我一般用 conda 建独立环境Python 选 3.8 到 3.10 之间太新或太旧都可能碰到 torch 轮子不匹配。常见做法是conda create -n parking python3.9 -y conda activate parking # 拉取 yolov5 源码用官方仓库即可 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtrequirements.txt里锁定了 torch、torchvision、numpy、opencv-python 等依赖。如果你机器有 NVIDIA 显卡装完后用python -c import torch; print(torch.cuda.is_available())确认输出 True。输出 False 说明装成了 CPU 版训练会慢到怀疑人生。CPU 也不是不能跑但这份数据集如果图片上千张CPU 训练一轮可能要几十分钟建议至少找一张 6G 显存的卡。3.2 写数据配置文件与改模型参数yolov5 用 yaml 文件描述数据集路径和类别。在data/目录下新建parking.yaml# 训练集和验证集路径指向解压后的实际位置 train: ../parking_dataset/images/train val: ../parking_dataset/images/val # 类别数停车位通常只有1类 nc: 1 # 类别名称顺序要和标签里的类别编号对应 names: [parking_space]路径可以用相对路径也可以用绝对路径相对路径是相对于 yolov5 根目录。nc必须和标签里出现的最大类别编号加一一致如果标签里只有 0那 nc 就是 1。names的长度必须等于 nc否则训练启动时会报索引错误。模型配置文件选models/yolov5s.yaml起步s 版本最小最快适合先验证流程。如果要改类别数把 yaml 里的nc改成 1或者训练时用命令行参数覆盖。我一般不改模型 yaml直接在训练命令里传--data和--weights让脚本自动处理。3.3 启动训练与关键参数含义python train.py \ --data data/parking.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --project runs/train \ --name parking_exp逐项说参数--img 640是输入分辨率停车位目标通常不大640 是平衡速度和精度的常用值显存够可以上 1280 但 batch 要降。--batch 16是批大小6G 显存跑 640 分辨率大概能到 16爆显存就降到 8。--epochs 100是训练轮数停车位这种单类任务通常 50 到 100 轮就能收敛看验证集 mAP 不再涨就可以停。--weights yolov5s.pt是加载预训练权重官方仓库会自动下载如果你网络环境下载慢可以手动下载后传路径。--project和--name决定结果存到哪训练日志、权重、混淆矩阵都会落在runs/train/parking_exp下。训练启动后重点盯三个输出box_loss、obj_loss、cls_loss 是否稳定下降验证集 mAP0.5 是否上升。如果 loss 震荡剧烈先把 batch 调小或者学习率降一档。如果 mAP 一直上不去回头检查标注质量而不是盲目加轮数。4. 训练完怎么验证推理、指标解读与效果排查4.1 用验证集跑指标并读懂输出训练结束后runs/train/parking_exp/weights/下会有best.pt和last.pt。best 是验证集表现最好的那轮一般用它。跑验证python val.py \ --data data/parking.yaml \ --weights runs/train/parking_exp/weights/best.pt \ --img 640 \ --task val输出里几个关键指标Precision 是查准率表示模型报出的车位里有多少是真的Recall 是查全率表示真实车位里有多少被找出来mAP0.5 是 IoU 阈值 0.5 时的平均精度停车位任务一般能到 0.9 以上算不错。如果 Precision 高但 Recall 低说明模型保守漏检多可以降低置信度阈值试试。如果两者都低大概率是标注或数据量问题。4.2 单张图片推理看实际效果指标是数字肉眼才是最终裁判。用detect.py跑几张图python detect.py \ --weights runs/train/parking_exp/weights/best.pt \ --source ../parking_dataset/images/val \ --img 640 \ --conf 0.4 \ --save-txt--conf 0.4是置信度阈值低于这个值的框不输出。停车位场景我一般从 0.4 起调太高会漏检被遮挡的车位太低会冒出大量误检。--save-txt会把检测结果存成 YOLO 格式方便后续和真值对比。结果图存在runs/detect/exp下重点看夜间、逆光、车辆遮挡这几类难样本的表现。如果这些场景掉点严重说明数据集覆盖不够需要考虑补充对应场景的图片。注意验证集指标好看不代表实际部署好用。如果验证集和训练集来自同一段视频的相邻帧指标会虚高。理想情况是验证集来自不同停车场或不同时段。5. 避坑与常见问题排查5.1 训练报「No labels found」或标签路径错误现象启动训练几秒后报错提示找不到标签或者 dataset 为空。原因通常是 yaml 里的路径写错或者 images 和 labels 的目录层级不匹配。yolov5 默认会把images替换成labels来找标签如果你的目录结构不是标准的images/train和labels/train它就会找错。解决办法是严格按标准结构摆放或者改 yaml 里的路径指向实际位置。我习惯解压后先tree -L 3看一眼层级再写配置。5.2 显存爆掉「CUDA out of memory」现象训练刚开始就报显存不足。原因无非三种batch 太大、img 太大、模型太大。解决顺序是先降 batch 到 8 或 4还不行就把 img 从 640 降到 416再不行换 yolov5n。另外检查是不是有其他进程占着显存nvidia-smi看一眼。有个玄学情况是第一次跑爆显存重启内核后同样配置又能跑这通常是显存碎片重启能解决。5.3 训练 loss 不降或 mAP 为 0现象跑了几十轮loss 纹丝不动mAP 一直是 0。原因可能是学习率太大导致梯度爆炸也可能是标签格式不对导致模型学不到东西。先回头用第 2 章的脚本核对标签确认坐标都在 0 到 1 之间、类别编号没超。如果标签没问题把学习率从默认的 0.01 降到 0.001 试试。还有一种情况是预训练权重和类别数不匹配用--weights yolov5s.pt时脚本会自动处理但如果你手动改了模型 yaml 的 nc 又没对应改权重就会出问题。5.4 推理时框重叠严重或一个车位多个框现象检测结果里同一个车位被框了好几次。原因是 NMS非极大值抑制阈值不合适或者模型对某些车位不确定。解决方法是调低--conf同时调低--iouiou 默认 0.45可以降到 0.3 让 NMS 更激进地合并重叠框。如果还是不行说明模型没训好回去看训练指标。5.5 换自己的数据后效果骤降现象用这份数据集训练效果很好换成自己停车场的图就一塌糊涂。原因是域偏移——不同摄像头角度、光照、车位线颜色都会让模型懵。解决办法是用自己的数据做微调哪怕只标几百张在预训练权重基础上再训几十轮效果通常比从头训好得多。这也是这份数据集最大的价值它给你一个已经学会「车位长什么样」的起点而不是让你从随机权重开始。6. 把数据集用出复利微调策略与标注复用技巧这份数据集真正值钱的地方不是让你训一个能用的模型就结束而是把它当成预训练起点用少量自有数据微调出贴合自己场景的模型。我自己的习惯是先用这份数据跑一个基线模型记录 mAP 和推理速度然后从自己停车场抽 200 到 300 张图用基线模型预标注人工只做修正标注效率能提升三倍以上。修正完的标签和原数据集混在一起按 8:2 分训练验证再训 50 轮左右模型对自家场景的召回率通常能从五成提到八成以上。微调时有个参数要特别注意学习率要比从头训练小一个量级用 0.001 甚至 0.0005否则会把预训练学到的通用特征冲掉。另外可以冻结 backbone 前几层只训检测头这样小数据量下更稳。命令上就是在 train.py 里加--freeze 10冻结前 10 层。策略数据量学习率预期效果从头训练全量0.01基线收敛慢全量微调全量自有0.001通用场景兼顾冻结微调自有 2000.0005小数据快速适配还有一个容易被忽略的点这份数据集的标签可以反过来当验证工具。当你自己标完一批数据拿基线模型跑一遍如果模型在你标为「有车位」的地方没检测出来要么是模型漏检要么是你标错了。这种交叉验证能揪出不少人工标注的疏漏。从那以后我每次标完新数据都强制用旧模型跑一遍推理做交叉核对省下的返工时间远比跑推理那几分钟多。希望这份数据集和上面的流程能帮你把停车位检测这件事从「想想」推进到「跑起来」。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →