简介这是一份面向停车场车位检测任务的数据集资源基于PKLot公开数据整理为YOLO格式覆盖晴天、阴天和雨天等多样化场景共包含12416张监控视角图像车位均已标注为占用或空闲适合用于训练车位占用状态识别模型也可作为智能停车、交通管理方向的算法验证数据。资源包内共2000个文件其中1994张jpg为统一尺寸的标注图像3个txt与3个json文件分别存放类别与标注信息整体压缩包约842MB解压后可直接接入YOLO训练流程。同时附带配套源码与训练好的车位占用模型免去自行从零训练的繁琐过程方便快速迁移到自己的项目中。目前已有677人在CSDN学习下载适合希望快速上手YOLO目标检测或需要高质量停车位数据集的学生和开发者使用。 停车位识别这个任务做停车场管理、车位引导、智慧停车的人应该都不陌生。我最近在搞一个基于Yolo格式的停车位识别数据集简单说就是把摄像头拍到的停车区域里的每个车位标出来同时区分它是空着还是被占用。这个数据集和通用目标检测数据集不太一样关键在于“车位”本身是固定不动的需要识别的是车位状态而不是在任意场景里找任意物体。今天我把数据集的结构、标注细节、训练步骤和踩过的坑整理成文给同样在做车位检测、停车引导或者想用Yolo跑业务落地的朋友做一个参考。1. 停车位识别到底在解决什么问题1.1 从车位检测到占用状态识别先说清楚任务定义。普通车辆检测是找画面中的车而车位识别是找画面里预先画好的停车位区域然后判断每个车位当前是否有车。实际场景里这个任务往往包含两个子任务车位线/车位区域的定位以及车位占用状态分类。用Yolo做的话通常直接把“空车位”和“占用车位”作为两个类别来检测也可以先检测所有车位区域再用一个分类头判断状态。工程上我建议前者端到端一个模型输出所有目标省去后处理复杂度。这个任务适合谁停车场管理系统、车位引导屏、手机端车位查询、收费系统联动都会用到。园区、医院、商场的无人值守停车场也很需要。企业客户通常要求“在停车场入口屏上实时显示每层还有多少空位”这就必须靠视觉识别实时统计车位占用情况。1.2 为什么是Yolo而不是传统图像处理或更复杂的检测模型传统车位检测用边缘检测、角点检测、颜色分割、直线检测等办法在固定摄像头、光照稳定的室内场景还能凑合但一到露天停车场强光阴影、雨天反光、夜间补光不均传统方法就崩了。Yolo这类深度学习检测模型直接学习特征鲁棒性好得多而且换场景后只要补数据重新训练泛化能力远高于手写规则。相比Faster R-CNN这类两阶段模型Yolo在实时性上优势明显。车位识别往往需要实时推送状态一个停车场几十路摄像头推理速度很关键。Yolo的工程生态也成熟从训练、导出到部署都有现成工具Jetson、RK3588这类边缘设备上都有很好的支持。综合准确率、速度和部署成本用Yolo做车位识别是目前最务实的选择。2. 数据集的构成与标注细节2.1 数据来源与场景分布我手上这个Yolo版停车位数据集核心内容就是把不同场景下的停车位标注成Yolo格式的txt文件。图片主要来自停车场监控的俯视和斜视画面也有少量无人机视角的车位图。场景覆盖室内地下车库、露天地面停车场、路边划线车位时间上白天、傍晚、夜晚都有天气上晴天、阴天、雨天都包含。数量上整体在几千到一万多张不等关键是要保证类别平衡空车位和占用车位的样本量不能差太多而且不能一张图里全是空位、另一张图里全是占用那样训练很容易偏向某一个类别。我一般会统计训练集里两个类别的框总数控制在1:1.2以内如果不足就做针对性的复制增强或者额外采集。场景图片数空车位框数占用车位框数室内地下车库约3500约12000约14000露天地面停车场约4200约15000约16000路边划线车位约1800约6000约7000这是基于常见实践的参考分布实际数据集可能略有偏差但原则上每个场景至少要有几百张图否则模型很容易对摄像头视角和地面材质过拟合。2.2 Yolo格式标注的要点Yolo格式每张图对应一个同名txt文件每行一个目标格式是class_id x_center y_center width height坐标都是归一化到0-1的。停车位识别里最常见的坑是车位是矩形但摄像头视角往往有透视畸变车位在图像里是梯形甚至不规则四边形。Yolo默认用矩形框如果要严格贴合车位边界就得用分割标签但那样标注成本会大幅上升。很多工程落地其实还是用矩形框框住车位的有效区域稍微包含一点旁边区域也没关系只要标注一致性做得好模型是能学会的。一致性指的是所有空车位都用同一个规则框所有占用车位也用同一个规则框比如都以车位线内沿为基准。如果同一个场景一会儿框内沿一会儿框外沿模型就会被搞糊涂。类别定义也有讲究。我建议直接用两个类别0表示空车位1表示占用车位检测结果直接就是车位状态不需要再做后处理。如果业务还需要区分车道上有没有车、有没有障碍物那再加类别但类别之间要有清晰的互斥关系避免歧义。比如“空车位”严格定义为车位线清晰且没有车辆的区域“占用车位”定义为有车辆停放的车位区域车道上的行驶车辆不要标成占用车位否则模型会把停在旁边的车和车位的关联学错。2.3 数据清洗与类别平衡拿到数据集后第一步不是训练而是清洗。常见问题有重复图片、标注框超出边界、类别标错、模糊严重的图。我习惯用脚本检查每张图的txt文件确保所有坐标在0-1范围同时统计每类的框数、每张图的框数把明显异常的样本挑出来人工复核。车位识别还有个特殊问题空车位往往特征稀疏尤其远处空车位就是几条白色或黄色线条很容易漏检。我的做法是把小尺寸的目标单独挑出来做复制粘贴增强或者对空车位区域用更高的mosaic概率让模型每轮都看到更多空车位样本。清洗时我还做过一个Excel表格记录每张图的文件名、尺寸、标注框数量、类别分布方便追踪。这个工具习惯帮我节省了大量排查时间。3. 基于Yolov8训练停车位识别模型3.1 环境准备与依赖安装训练我用的Yolov8ultralytics这个库集成度高安装简单一条命令就能跑训练。环境上推荐Python 3.9、PyTorch 2.0以上GPU显存8G以上会比较舒服。如果只有CPU也能跑就是慢适合先跑通流程。安装就是pip install ultralytics。如果有NVIDIA显卡记得安装匹配CUDA版本的PyTorch不要直接装默认的CPU版。先执行python -c import torch; print(torch.cuda.is_available())验证GPU可用。AMD显卡用户建议先查一下ROCm兼容性很多时候会卡在环境上别浪费太多时间先CPU小批量验证代码能跑通再上GPU加速。3.2 数据集结构组织与配置Yolov8要求的数据集结构如下parking_lot/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── parking.yamlparking.yaml内容train: parking_lot/images/train val: parking_lot/images/val nc: 2 names: [empty, occupied]注意路径要写实际路径可以用绝对路径也可以把数据集放在项目目录下用相对路径。划分训练集和验证集时我建议尽量按摄像头ID分而不是全程随机打乱。因为同一个场景的相邻帧非常相似随机划分容易导致验证集和训练集高度重叠mAP虚高部署到新场景立刻露馅。3.3 训练参数选择与调优基础训练命令yolo train dataparking.yaml modelyolov8s.pt epochs200 imgsz640 batch16 device0 cacheTrue车位识别我从yolov8s起步n模型速度最快但精度差一截l和x模型精度高但边缘设备跑不动s是均衡选择。输入尺寸imgsz640是默认如果车位远、目标小可以试imgsz800或960能明显提升小目标召回率但训练和推理都会变慢。显存不够就把batch调小同时开cacheTrue把图片缓存到内存加速训练。训练轮数epochs我一般设置150到300如果数据集几万张150轮左右就收敛。重点是要开早停patience20避免后面过拟合。自动增强方面Yolo默认的mosaic、fliplr、hsv调整都适合车位场景但注意不要开启flipud上下翻转因为停车场画面有重力方向上下翻转会生成大量倒着的车位线。参数推荐值说明imgsz640或800目标小用800速度快用640batch8-32按显存调整显存不足减小epochs150-250配合早停一般够用optimizerauto让Yolo自动选SGD或AdamWlr00.01以下loss爆炸时降到0.0013.4 训练结果评估指标训练中主要看几个指标box_loss、cls_loss、dfl_loss以及验证集上的mAP50和mAP50-95。车位识别不用过分追求mAP50-95通常mAP50在0.9以上、mAP50-95在0.7以上就足够落地。更关键的是漏检率和误报率尤其是空车位漏检一个用户走到跟前才发现没位置体验很差。所以我都会额外统计每个类别的召回率。如果空车位召回低于0.85就得回头做数据增强、调整输入分辨率或者换更大的模型。有时候mAP看起来很高但其实是占用车位被大量识别空车位大量漏检导致平均数被拉平。只看总mAP是看不出来的必须按类别看。4. 部署与实战应用4.1 轻量化部署选型模型训练完要导出部署格式。Yolov8支持导出onnx、tensorrt、openvino等。边缘设备上我常用Jetson Orin Nano或者RK3588这类板子。Jetson上用TensorRT先用yolo export modelbest.pt formatonnx再把onnx转engine精度用FP16速度比PyTorch推理快2到4倍。RK3588用的是RKNN格式ultralytics也支持导出但要注意量化校准数据集的选择一般取几百张代表性图片做校准否则精度掉得厉害。如果只要在普通CPU服务器上跑onnxruntime加int8动态量化也能做到720p单路十几毫秒满足中小停车场需求。我做过一个极端配置用OpenVINO在i5主机上跑yolov8n单路1080p大概20毫秒完全够用。4.2 实时识别流程部署后识别流程不只是跑模型。因为摄像头固定可以预先划定每个车位的ROI再让模型检测出的目标与ROI匹配这样能消除抖动、避免一辆车被两个车位框同时命中。我的流程是读取帧模型推理得到空车位和占用车位检测框对每个预划的ROI根据检测框中心点是否落在ROI内判断该车位当前状态更新车位状态表推送状态到应用端车位状态表要做时间平滑。比如连续5帧都是occupied再置为占用车辆经过时瞬时误判就会被过滤掉。用代码表示核心逻辑if frame_count % 5 0: status infer_one_frame(frame) smoothed_status majority_vote(recent_status) update_display(smoothed_status)这里majority_vote就是取最近N帧的众数能有效避免单帧闪烁。5. 常见问题与排查技巧5.1 远处小车位漏检漏检是车位识别最头疼的问题。解决思路提高输入分辨率、训练时把远处区域裁剪放大做增强、用更大模型。如果摄像头安装位置和角度已经固定尽量调整监控视野让远处车位在画面里不要太小目标像素尺寸小于24x24就很难检测了。我试过把imgsz从640提到960后远处空车位召回率从0.78提升到0.88效果立竿见影。5.2 光照变化和阴影误检把影子当占用车位是典型误检。解决方式有三个加ROI约束只检查车位线内部的固定区域影子往往超出车位范围在数据增强里增加随机亮度、对比度和HSV色相扰动提升模型对光照的鲁棒性采集数据时专门多收集强光影、树枝晃动阴影的图片。5.3 训练不收敛或loss爆炸一般原因包括学习率过大、标签坐标越界、类别严重不平衡。先把学习率降到0.001再检查所有归一化坐标是否在0-1之间尤其是手动改标注文件时容易把width和height写成像素值。类别不平衡时启用Yolo的loss scale或者对少数类样本做重采样。我在一个雨天数据集上遇到过loss反复震荡最后发现是几百张图的jpg和txt文件名不匹配导致读取了空标签修正文件名后训练立刻稳定。5.4 同一辆车跨两个车位框的重叠问题大车停进来经常同时压到两个车位线模型可能对两个车位都输出高置信度的“占用”。这个问题用后处理解决NMS置信度阈值设高一些比如0.5判定是否占用时只看检测框中心点落在哪个ROI内如果一个检测框覆盖两个车位只允许它命中中心点所在的ROI。这个方法实测效果很好基本杜绝了重复计数。以下是常见问题速查表现象可能原因解决方法远处空车位经常漏检目标太小、分辨率不足提高imgsz用小目标复制增强阴影导致误报占用光照复杂、数据不足加光照增强用ROI约束训练loss不降学习率过大或标签错误降lr检查坐标范围同一辆车重复计数多框命中冲突用中心点匹配ROI夜间漏检严重夜视图较少补充夜间数据开启Yolo的hsv增强6. 实操心得与扩展方向做车位识别项目我最大的体会是前期把摄像头视角下的车位ROI标精细比调模型更管用。很多同学直接拿通用目标检测数据集来训练效果不好就拼命调参其实问题出在标注不一致和场景覆盖不足上。先把每个摄像头画面里的车位都手工标出固定ROI再让模型输出与ROI匹配准确率能提升一大截。另一个心得是数据集要尽量覆盖不同地面材质和不同划线颜色。水泥地上白线、沥青路上黄线、地坪漆绿线模型见过的越多越稳。如果后面换新场地先把新场地的几十张图拿来做快速微调比重新训练整个模型效率高很多。扩展方向上可以做车位线分割与车位状态联合建模自动映射停车位编号可以结合车辆跟踪实现单车位占用时长统计也可以用ONNX Runtime在Web端做一个车位实时展示Demo。如果要做整个停车场级别的应用还得考虑多摄像头联合判断防止同一辆车在相邻摄像头画面里被重复计数。最后再分享一个小技巧。训练完导出模型时固定好输入尺寸不要用dynamic shape。固定分辨率能让TensorRT和RKNN把吞吐优化到极致部署时稳定性也好很多。做车位识别这个领域数据比模型重要坑比理论多多跑实验、多记录结果你会比我更快把模型稳定地落到停车位上。本文还有配套的精品资源点击获取