简介:本资源是面向计算机视觉初学者与YOLO算法实践者的停车位占用检测专用数据集,聚焦真实场景下的车位状态识别任务,适用于智能停车系统开发、校园/社区安防监控等落地应用。数据集共652个文件,包含217张高质量JPG图像、217个YOLO格式(txt)与217个VOC格式(xml)标注文件,以及1份适配YOLOv5/v7/v8/v9/v10/v11的data.yaml配置文件,总大小仅14.27MB,轻量易部署。所有图像已按标准划分并完成坐标归一化处理,YOLO标签严格遵循中心点比例坐标规范,可直接用于模型训练、验证与测试,无需额外预处理。目前已有107人学习下载,配套双格式标注显著提升兼容性——既支持主流YOLO系列框架快速上手,也便于转换为其他检测框架所需输入,是入门目标检测项目、开展小样本车位识别实验的理想基准数据集。
1. 项目概述:一个专为停车位检测任务打造的数据集
最近在整理硬盘时,翻出了一个自己几年前做项目时用过的老数据集——“yolo算法-停车位占用检测数据集-217张图像带标签-停车位.zip”。这个名字起得相当直白,一看就知道是干什么用的。这是一个专门为基于YOLO(You Only Look Once)算法的停车位占用状态检测任务而准备的数据集。它包含了217张停车场场景的图像,并且每一张都附带了标注好的标签文件。对于想入门计算机视觉、特别是目标检测,或者正在寻找一个具体、可实操的停车管理相关项目练手的朋友来说,这个数据集是个不错的起点。
停车位检测,或者说车位状态识别,是智慧停车、安防监控、自动驾驶寻位等场景下一个非常经典且实用的应用。它的核心任务就是从一张俯视或斜视的停车场图像中,自动判断出每一个划定好的停车位是“空置”还是“已被占用”。这个数据集就是服务于这个目标的。虽然217张图像的数量在今天动辄数万、数十万的数据集面前显得有点“迷你”,但它麻雀虽小,五脏俱全,非常适合用于算法验证、模型快速原型开发以及教学演示。你不需要在数据收集和清洗上花费大量时间,可以直接聚焦于模型训练、调优和部署的完整流程。
2. 数据集深度解析:内容、结构与质量评估
拿到一个数据集,第一步绝不是急着去跑训练脚本,而是要先把它“解剖”清楚,明白里面到底有什么、质量如何、该怎么用。这能帮你避开很多后续的坑。
2.1 图像内容与场景特点
这个数据集的217张图像,大概率来源于一个或几个固定的停车场监控摄像头。图像视角通常是俯视或有一定角度的斜俯视,这能最大化地展示停车位的平面布局。场景可能涵盖了不同的光照条件(白天、傍晚、阴天)、不同的天气状况(晴天、雨天),以及车辆停放的不同密度(从稀疏到满位)。这种多样性对于训练一个鲁棒的模型至关重要,因为模型需要学会排除光照变化、阴影、地面反光等干扰,专注于“车位”和“车辆”这两个核心目标。
图像中的目标主要分为两类:
- 停车位(Parking Space):通常被标注为矩形框,代表一个可供停车的区域。在数据集中,它可能被标记为“parking_space”或类似的类别。
- 车辆(Vehicle/Car):停在车位内或部分停在车位上的车辆。这是判断车位是否被占用的直接依据。
一个高质量的停车位检测数据集,其标注应该确保每个划定的车位都有一个对应的边界框,无论里面是否有车。同时,对于占用车位的车辆,也应有精确的边界框标注。
2.2 标注格式与YOLO适配性
从标题“带标签”和格式“.zip”来看,这个数据集很可能已经准备好了YOLO所需的标注格式。YOLO系列算法(v5, v7, v8, v11等)通常使用一种特定的.txt文本文件来存储标注。每个图像文件(如parking_001.jpg)会对应一个同名的标注文件(parking_001.txt)。
这个.txt文件里的每一行代表图像中的一个目标物体,其格式通常为:
<class_id> <x_center> <y_center> <width> <height>class_id: 类别的整数索引,从0开始。例如,0代表“parking_space”,1代表“vehicle”。x_center,y_center: 边界框中心的x和y坐标,值是相对于整个图像宽度和高度的归一化比例(范围0到1)。width,height: 边界框的宽度和高度,同样是归一化比例值。
例如,一行标注0 0.35 0.52 0.12 0.18表示图像中有一个类别0(停车位)的对象,其中心点位于图像宽度的35%、高度的52%处,边界框的宽度占图像宽度的12%,高度占图像高度的18%。
为什么是归一化坐标?这是YOLO格式的一个关键设计。它使得标注与图像的具体分辨率解耦。无论你将图像从1920x1080缩放到640x640还是416x416,只需要用同样的比例缩放图像,标注信息无需修改即可直接使用,极大地增加了灵活性。
在你解压这个ZIP文件后,预期的目录结构应该是:
parking_dataset/ ├── images/ │ ├── train/ # 训练集图像 │ └── val/ # 验证集图像 ├── labels/ │ ├── train/ # 训练集标注文件 │ └── val/ # 验证集标注文件 └── data.yaml # 数据集配置文件有时数据集可能没有预先划分好训练集和验证集,所有图像和标签都放在同一个文件夹里,这就需要你自己按比例(如8:2)进行划分。
2.3 数据质量自查清单
在投入训练前,花半小时做一次快速的数据质量检查,能省去后面数小时的调试时间。
- 标注完整性:随机打开十几张图像和对应的标签文件,用简单的脚本或工具(后面会介绍)可视化一下,检查是否每个停车位都被框出来了?停在车位上的车是否都被正确标注?有没有漏标、错标(比如把阴影标成了车)的情况?
- 标注一致性:停车位的框,是紧紧贴着车位线,还是包含了部分周边区域?车辆的框是紧贴车体,还是留有一些空隙?整个数据集的标注风格需要基本一致。
- 类别平衡:统计一下
labels/文件夹下所有.txt文件中,类别0和类别1各自出现的次数。如果“空车位”和“占用车位”的数量严重失衡(比如9:1),在训练时可能需要采用加权损失或过采样/欠采样技术来缓解。 - 图像质量:检查是否有极度模糊、过曝、欠曝或严重压缩失真的图像,这些可能会成为模型学习的噪声。
实操心得:对于小数据集,人工抽查可视化是最可靠的方法。我常用一个Python脚本快速完成这件事。这个脚本会随机选取N张图片,将YOLO格式的标签画到图像上显示出来,一目了然。
3. 从数据集到模型:YOLO训练全流程实操
假设我们已经检查并确认了这个217张图像的数据集质量OK,并且已经按8:2的比例分割好了训练集(~173张)和验证集(~44张)。接下来,我们以目前最流行、生态最完善的YOLOv8为例,展示完整的训练流程。
3.1 环境搭建与依赖安装
首先需要一个Python环境(3.8以上为佳),然后安装核心的Ultralytics YOLO库。
pip install ultralytics这个命令会安装YOLOv8以及其所有依赖(如PyTorch, OpenCV等)。确保你的机器有可用的GPU(NVIDIA),并安装了对应版本的CUDA和cuDNN,这将使训练速度提升数十倍。
3.2 准备数据集配置文件(data.yaml)
这是连接你的数据和YOLO训练脚本的桥梁。你需要在数据集根目录(或者任何一个方便的位置)创建一个data.yaml文件。
# data.yaml path: /home/your_username/datasets/parking_dataset # 数据集的根目录绝对路径 train: images/train # 训练集图像路径,相对于 path val: images/val # 验证集图像路径,相对于 path # 类别数量 nc: 2 # 类别名称列表 names: ['parking_space', 'vehicle']关键点解释:
path: 必须使用绝对路径,相对路径在训练时很容易出错。train/val: 这些路径是相对于path的。如果你的images/train文件夹里直接是.jpg文件,这样写就对了。nc和names: 一定要和你的标注文件里的class_id对应上。如果标注里0是车位,1是车,那么这里names的第一个元素就是‘parking_space’。
3.3 启动模型训练
YOLOv8的命令行接口(CLI)非常强大,一行命令就能启动训练。
yolo task=detect mode=train model=yolov8n.pt data=/path/to/your/data.yaml epochs=100 imgsz=640 batch=16让我们拆解这条命令:
task=detect: 指定任务为目标检测。mode=train: 模式为训练。model=yolov8n.pt: 使用预训练的YOLOv8n(nano)模型权重。这是YOLOv8系列中最轻量级的,训练快,适合在小数据集上快速验证。你也可以选择s(small),m(medium),l(large),x(xlarge),模型越大精度潜力越高,但越容易在小数据集上过拟合。data=...: 指向我们刚创建的data.yaml文件。epochs=100: 训练轮数。对于217张的小数据集,100轮可能已经足够,甚至需要警惕过拟合。可以配合早停(patience参数)使用。imgsz=640: 训练时图像被统一缩放到的长边尺寸。YOLO通常使用正方形输入,所以图像会被resize到640x640。batch=16: 批处理大小。如果你的GPU内存不足(出现CUDA out of memory错误),需要减小这个值,比如改为8或4。
执行命令后,训练就开始了。控制台会打印损失曲线、学习率、精度指标(mAP50, mAP50-95)等。所有日志、模型权重(每轮最好的best.pt和最后一轮的last.pt)都会自动保存在runs/detect/train/目录下。
3.4 关键参数调优与策略
对于仅有217张图像的小数据集,默认参数往往不是最优的。我们需要一些策略来防止模型“死记硬背”(过拟合),并提升其泛化能力。
数据增强(Data Augmentation): 这是小数据集的救命稻草。YOLOv8内置了强大的增强功能。我们可以在命令中通过
augment=True开启,或者更精细地配置:yolo detect train ... augment=True --hsv_h 0.015 --hsv_s 0.7 --hsv_v 0.4 --degrees 10 --translate 0.1 --scale 0.5 --shear 0.0 --perspective 0.0 --flipud 0.0 --fliplr 0.5 --mosaic 1.0 --mixup 0.0hsv_h/s/v: 调整色调、饱和度、明度,模拟不同光照。degrees: 随机旋转角度。translate: 随机平移。fliplr 0.5: 50%概率水平翻转,这对停车场场景非常有效,因为左右是对称的。mosaic: 马赛克增强,将四张图拼成一张,极大地丰富了背景和小目标上下文,强烈建议开启。
防止过拟合:
- 早停(Early Stopping): 添加
patience=20参数。如果验证集损失在连续20个epoch内没有下降,则自动停止训练,并恢复到此期间最好的模型权重。 - 权重衰减(Weight Decay): 添加
weight_decay=0.0005,给损失函数增加一个L2正则化项,防止权重变得过大。 - Dropout(仅适用于某些版本或自定义模型): 对于较大的模型,可以在全连接层等位置引入Dropout。
- 早停(Early Stopping): 添加
学习率调整: 使用预训练模型时,我们通常采用较小的学习率进行微调。YOLOv8有自动学习率调整机制,但你也可以手动指定初始学习率
lr0和最终学习率lrf。对于小数据集微调,lr0=0.01可能偏大,可以尝试lr0=0.001。
一个综合了上述策略的强化训练命令示例:
yolo task=detect mode=train model=yolov8s.pt data=/path/to/data.yaml epochs=150 imgsz=640 batch=8 patience=30 augment=True fliplr=0.5 mosaic=1.0 lr0=0.001 weight_decay=0.00054. 模型评估、可视化与问题排查
训练完成后,我们保存在runs/detect/train/weights/best.pt的模型表现如何?不能只看训练日志,必须进行系统评估。
4.1 性能评估与指标解读
使用YOLO CLI可以方便地在验证集上评估最佳模型:
yolo task=detect mode=val model=runs/detect/train/weights/best.pt data=/path/to/data.yaml评估报告会输出关键指标,对于目标检测,最需要关注的是:
- mAP50 (Mean Average Precision at IoU=0.5): 这是最常用的指标。它衡量的是当预测框与真实框的重叠度(IoU)大于0.5时,模型在所有类别上的平均精度。对于停车位检测,这个值通常能达到90%以上才算一个不错的模型。
- mAP50-95: IoU阈值从0.5到0.95(步长0.05)的平均mAP。这是一个更严格的指标,要求预测框更精确。对于车位检测,如果边界框的轻微偏移不影响“占用/空闲”的判断,这个指标可以作次要参考。
- Precision (P) 和 Recall (R): 精确率和召回率。高精确率意味着模型说“这里有车”时,大概率是对的;高召回率意味着真实存在的车,大部分都被模型找出来了。我们通常希望两者平衡。
4.2 预测可视化与错误分析
数字指标是冷的,可视化结果才是热的。对验证集进行预测并可视化,能直观发现模型的问题。
yolo task=detect mode=predict model=best.pt source=/path/to/your/dataset/images/val save=True save_txt=Truesave=True: 保存带预测框的图像。save_txt=True: 保存预测结果的YOLO格式标签文件。
然后,你需要人工仔细查看这些预测图:
- 漏检(False Negative): 明明有车,模型没检测出来。可能原因是车辆太小、颜色与地面接近、被遮挡、或者是训练集中未出现的新型车辆。
- 误检(False Positive): 明明是空地或阴影,模型却认为是车。这往往是过拟合或数据增强不足的迹象,模型将某些固定背景模式误认为是车辆特征。
- 定位不准: 框的位置漂移,或者框的大小不合适。
4.3 常见问题与解决策略实录
根据我使用类似小数据集的经验,以下是几个高频问题及应对方法:
问题1:训练很快,但mAP50很低(比如低于70%),且不再上升。
- 可能原因1:数据标注质量差。这是首要怀疑对象。立刻回到第2.3步,做更严格的数据检查。
- 可能原因2:类别不平衡严重。如果空车位标注远多于占用车位,模型会倾向于把所有区域都预测为空车位,因为这样损失更低。解决:在
data.yaml中尝试设置weighted_loss=True,或者在训练命令中使用class_weights参数(如果YOLOv8支持),或者对少数类样本进行过采样。 - 可能原因3:模型复杂度与数据量不匹配。用
yolov8x这样的大模型去拟合217张图,极易过拟合。解决:换用更小的模型,如yolov8n或yolov8s,并加强数据增强和正则化。
问题2:训练集精度很高(接近100%),但验证集精度很低,差距很大。
- 这是典型的过拟合。模型把训练集,包括噪声,都背下来了,但没学到泛化特征。
- 解决:
- 增强数据增强:大幅增加
degrees(旋转)、translate(平移)、scale(缩放)的范围,启用mixup增强。 - 增加正则化:提高
weight_decay值(如0.001),如果模型结构支持,增加Dropout率。 - 使用早停:确保
patience参数已设置,并可能减小它(如设为10),让训练在过拟合发生前停止。 - 减少模型容量或减少训练轮数:换用更小模型,或减少
epochs。
- 增强数据增强:大幅增加
问题3:模型对某些特定场景(如夜间、雨天)的图片检测效果很差。
- 原因:数据集中缺乏此类场景的样本。
- 解决:这是数据层面的根本问题。要么想办法收集补充这类数据;要么在数据增强中模拟,例如通过调整
hsv_v(明度)来模拟夜间低光照,通过添加模糊或噪声来模拟雨雾天。但这只是“模拟”,效果有限。
问题4:训练时出现“CUDA out of memory”错误。
- 解决:这是硬件限制。依次尝试降低
batch-size(如16->8->4)、降低imgsz(如640->512)、使用更小的模型(如yolov8s->yolov8n)。在训练命令中可以直接调整。
避坑技巧:建立一个简单的实验记录表。每次调整参数(模型、增强、超参)都记录下对应的mAP50和mAP50-95。对于小数据集,训练很快,这样能帮你快速找到相对最优的配置组合,而不是盲目调参。
5. 超越基础:模型优化与部署思考
当我们用一个基础模型在验证集上获得了不错的mAP后,工作并没有结束。从实验模型到稳定可用的系统,还有几步要走。
5.1 模型测试与跨场景验证
用验证集评估后,必须使用一个全新的、从未在训练和验证中出现过的“测试集”进行最终考核。如果原始数据集没有提供,你可以从网上找几张其他停车场的图片,或者在自己公司/小区的停车场拍几张。这一步是检验模型泛化能力的“试金石”。
如果测试集效果暴跌,说明模型过拟合于原有数据集的特定场景(可能是那个摄像头的角度、颜色基调等)。这时,可能需要收集更多样化的数据,或者考虑使用领域自适应(Domain Adaptation)技术,但这已超出小数据集的范畴。
5.2 模型优化与加速
对于部署,特别是边缘设备(如停车场闸机的工控机、树莓派等),模型的大小和速度至关重要。
模型导出:YOLOv8训练出的
.pt文件是PyTorch格式。你可以将其导出为更高效或更适合部署的格式。yolo export model=best.pt format=onnx imgsz=640 simplify=Trueformat=onnx: 导出为ONNX格式,这是一种开放的模型格式,被多种推理引擎(如OpenVINO, TensorRT, ONNX Runtime)支持。simplify=True: 对模型图进行简化,可能提升推理速度。- 还可以导出为
torchscript,coreml,tflite等,根据你的部署平台选择。
模型量化(Quantization): 将模型权重从浮点数(FP32)转换为整数(INT8),可以显著减小模型体积、提升推理速度,对精度影响通常很小。这通常在导出为特定格式时进行(如TensorRT或OpenVINO支持INT8量化)。
5.3 构建完整应用流程
一个完整的停车位检测系统,不仅仅是模型推理。它通常包含以下流水线:
- 图像输入:从摄像头实时拉流(RTSP)或读取图片序列。
- 预处理:图像缩放、归一化(与训练时保持一致)、颜色通道转换(BGR to RGB)。
- 推理:加载优化后的模型(如ONNX),输入预处理后的图像,得到预测框和类别。
- 后处理:
- 非极大值抑制(NMS):YOLO输出通常已包含此步骤,但有时需要调整置信度阈值(
conf)和NMS的IoU阈值(iou)来平衡漏检和误检。在预测时可通过conf=0.25 iou=0.45参数调整。 - 车位状态判断:我们的模型输出了“停车位”和“车辆”两类框。后处理逻辑需要判断:如果一个“停车位”框与一个“车辆”框的IoU超过某个阈值(比如0.3),则该车位状态为“占用”,否则为“空闲”。这个逻辑需要你自己写代码实现。
- 非极大值抑制(NMS):YOLO输出通常已包含此步骤,但有时需要调整置信度阈值(
- 结果输出:将空闲/占用状态可视化在图像上,或者通过网络接口(如HTTP API)发送给停车场管理系统。
5.4 持续迭代与数据闭环
217张图像只是一个起点。当模型部署到真实场景后,必然会遇到新的挑战:新的车型、极端天气、摄像头污损、车位线重新粉刷等等。因此,建立一个数据闭环至关重要:
- 收集模型出错的案例(如漏检、误检的图片)。
- 对这些新图片进行标注,加入到原有的训练集中。
- 用扩增后的数据集重新训练或微调模型。
这个过程循环往复,是模型保持生命力和实用性的关键。一开始的217张图,可以看作是你精心准备的“种子数据”,用它训练出一个可用的初版模型,然后通过数据闭环,让这个模型在真实世界中不断学习和进化。
本文还有配套的精品资源,点击获取