基于YOLOv8的停车场违规占道车辆检测系统设计与实现
简介本资源是一套基于YOLOv8的停车场违规占道车辆检测系统完整实现面向计算机、人工智能、自动化等专业的在校学生及初学者解决真实场景中车辆违停识别与可视化分析问题适用于毕业设计、课程设计、大作业及项目立项演示。压缩包共8个文件3个Python主程序、3个PyTorch模型文件.pt、2个说明文档总大小15.91MB涵盖训练、推理、可视化全流程包含可直接运行的图形界面Visual_interface.py、视频检测脚本Detection_video.py、模型训练代码train_mode.py及预训练与最佳权重文件配套README和项目说明文档。已有56人学习下载所有代码均经实测验证支持一键部署并自动生成精确率-召回率曲线、混淆矩阵、F1分数趋势图、验证集预测结果及标签分布统计等核心评估图表开箱即用无需额外调试为毕设答辩提供扎实的技术支撑与可视化成果输出。 又到了一年一度的毕业设计季后台收到不少读者问有没有现成的目标检测项目最好是能直接跑起来的。今天分享的这个题目——基于YOLOv8的停车场违规占道车辆检测系统我断断续续打磨了几个版本从检测逻辑、可视化界面到数据集整理都走通了。如果你正愁选题或者不知道目标检测项目怎么落地这篇内容应该能帮上忙。这个系统能做什么简单说它用YOLOv8模型识别停车场画面中的车辆再结合区域判定逻辑自动判断车辆是否违规占道比如停在通道、消防通道、禁停区域检测结果通过PyQt5可视化界面实时展示支持图片、视频、摄像头三种输入方式。功能覆盖了目标检测、区域判定、告警提示、结果保存整个流程清晰特别适合作为计算机视觉方向的毕业设计或课程设计项目。我用一个打包好的项目压缩包来展开讲解包含源码、UI界面、完整数据集和部署文档部署好环境之后基本开箱即用。接下来我会从整体设计、数据集、核心逻辑、界面实现到常见问题把这个项目的里里外外拆给大家。1. 项目整体设计与技术选型1.1 为什么选择YOLOv8作为检测核心停车场违规占道检测本质上还是一个目标检测问题——先找到“车在哪”再判断“车停的位置对不对”。检测环节的速度和精度直接决定整个系统的体验。我在YOLOv5和YOLOv8之间对比过。YOLOv5确实生态成熟网上教程一抓一大把但YOLOv8在框架结构上做了不少升级比如C2f模块替换了原来的C3模块Detect头和Anchor-Free的回归方式让模型对不同尺寸目标更友好。实际测试下来同样的数据条件下YOLOv8在精度上略有提升推理速度也够快GTX 1660 Ti跑640分辨率输入模型推理单帧大概20毫秒配合界面显示帧率能稳定在20~30FPS之间完全满足实时监控的需求。还有一点很重要Ultralytics官方维护做得非常好训练、验证、导出全链路都有统一的API部署时不用像老版本那样手动拼一堆代码。对于毕设项目来说这种开箱即用的体验能帮你在答辩前省下大量调bug的时间。1.2 系统功能模块拆解整个系统从用户视角看核心就四个模块检测模块加载训练好的YOLOv8权重对输入帧执行推理输出车辆边界框、置信度和类别。区域判定模块定义停车场通道、消防通道等禁停区域根据车辆框与区域的几何关系判断是否违规。可视化界面模块基于PyQt5实现实时显示检测画面、违规标记、帧率和告警信息。结果管理模块支持保存检测结果图片、导出违规记录部分版本我还加了声音告警。这里有个容易踩坑的设计点违规判定逻辑不要写死在检测模型里。模型只负责输出目标位置判定规则用独立的模块实现这样以后换数据集、换场景只需要修改区域配置不用重新训练模型。这也是整个系统扩展性的关键。项目目录我当时是这样组织的大家拿到包之后可以对照着看parking_violation_detect/ ├── main.py # 界面入口 ├── train.py # 训练脚本 ├── detect.py # 检测脚本 ├── config/ │ ├── config.yaml # 全局配置 │ ├── parking_area.json # 禁停区域坐标 ├── models/ │ └── best.pt # 训练好的权重 ├── datasets/ │ ├── images/ # 标注图片 │ └── labels/ # YOLO格式标签 ├── ui/ │ ├── main_window.py # 主窗口逻辑 │ └── resources/ # 图标、样式 └── requirements.txt这种结构的好处是逻辑分离训练、检测、界面各自独立改任何一环都不会影响其他地方。我记得第一次做的时候把所有东西都堆在main.py里到后期加功能时痛苦万分后来才重构成分模块的形式。2. 数据集整理与标注细节2.1 这份数据集包含什么项目包里的数据集我整理了一个以停车场场景为主的车辆检测数据子集同时又补充了一部分公开的车辆数据做扩充。图片都统一处理成了YOLO格式即每张图片对应一个同名txt文件文件里的每一行代表一个目标的标注信息类别id 归一化中心x 归一化中心y 归一化宽度w 归一化高度h比如0 0.5321 0.4812 0.3825 0.2143。如果你只是拿来做毕设这套标注数据可以直接用不需要再从零标注。省下的时间可以投入到调试和论文撰写上。但要提醒大家数据集的规模决定了模型的上限。目前这套数据主要是白天、晴天、清晰视角的停车场画面。如果你的场景更复杂比如夜晚、雨天、俯视角度大、车辆密集遮挡严重就需要补充对应场景的数据。数据量不够的时候模型在陌生场景下的泛化能力会明显下降。我的建议是至少自己额外收集采集300到500张目标场景的图片人工筛选并标注后加入训练集。2.2 数据标注的具体操作流程对于需要扩充数据集的朋友我说一下标注的操作流程。准备标注工具我用的LabelImg开源免费Windows下直接pip安装或者下载免安装版界面操作很直观。创建类别文件classes.txt里写入类别名称这个项目里我定义了两个类别0: vehicle所有机动车1: motorcycle摩托车/电动车你根据自己的实际情况可以调整比如区分小车、大车、行人。开始画框使用Create RectBox按钮在目标车辆上拉矩形框尽量贴合车辆边缘。注意不要把所有车都框进去模型只负责检测无需关心车辆是否违规区域判定是后置逻辑。自动生成标签文件每保存一张图片LabelImg会在同目录下生成对应的txt。如果你的图片放在images目录标签文件放在labels目录两者通过相同的主文件名一一对应。这里有一个常见错误类别ID不对齐。比如你自定义了“car”为类别0但训练时配置文件里类别顺序不一样会导致模型张冠李戴。在训练之前务必打开一个标签文件核对类别序号。2.3 数据增强与平衡技巧YOLOv8自带数据增强能力训练时会自动执行Mosaic、随机翻转、HSV色域变化等操作。但有一个参数容易被忽略hsv_h、hsv_s、hsv_v这三个值控制色调、饱和度和明度的调整幅度。停车场场景光线变化明显我把hsv_v默认的0.4调到0.5提高了模型对明暗变化的鲁棒性实测在阴影区域的漏检率有所下降。如果数据集中车辆类别分布严重不平衡比如“摩托车”只占5%首选方案是增加该类别的图片数量次选方案是调整训练时的类别权重。在YOLOv8中用cls参数控制分类损失的权重但小数据量下效果有限不如老老实实补数据。训练完成后分析一下模型在验证集上的每类AP值如果某一类AP明显偏低优先针对该类补充数据。这个分析报告YOLOv8会输出在results.png的曲线里注意观察。3. 训练环境配置与模型部署3.1 环境配置从零到跑通部署这个项目官方文档推荐的Python版本是3.8到3.11之间。我自己用的3.10稳定没踩坑。依赖安装直接执行pip install -r requirements.txtrequirements.txt里面包含的核心依赖ultralytics8.0.0 torch1.8.0 torchvision0.9.0 opencv-python4.5.0 PyQt55.15.0 numpy1.21.0 pillow9.0.0显卡环境的话需要提前装好CUDA和cuDNNPyTorch版本最好对照官方推荐的组合。如果你用的是集成显卡比如笔记本的核显也可以跑但训练时间会成倍增加建议直接用CPU版本跑推理演示训练的话还是找台带N卡的机器。关于“GTX 1660 Ti能不能跑YOLOv8”这个问题我实测过1660 Ti 6G显存跑YOLOv8nnano版batch size设8训练300轮没问题跑ssmall版batch size设4也勉强可以。如果batch size设太大导致CUDA Out of Memory优先降batch size不要直接换模型。我提供一个参考配置batch8, imgsz640这是1660 Ti平衡速度与精度的甜点值。3.2 训练命令与参数选择准备好数据集后训练命令非常简单python train.py --data parking.yaml --weights yolov8n.pt --epochs 100 --batch 8 --imgsz 640 --device 0parking.yaml是数据配置文件核心内容如下path: /path/to/datasets train: images/train val: images/val nc: 2 names: [vehicle, motorcycle]这里我要把几个关键参数讲透epochs训练轮数。100轮对于中小数据集已经够用但要看早停机制。YOLOv8默认开启了早停如果模型在验证集上连续50轮没有提升会自动停止。别以为训练中断就是报错看控制台输出的Best fitness是否更新即可。patience早停容忍轮数。改小这个值训练会更快结束但不是好事模型可能还没收敛就被停掉了。imgsz输入分辨率。640是默认值改成960会提升小目标检测精度但显存占用和推理耗时也会上升。停车场这种场景车辆目标不算小640够用。device指定训练设备。0表示第一块GPUCPU训练填cpu。训练结束后在runs/train/exp目录下会生成best.pt和last.pt。best.pt是验证集上表现最好的权重部署时就用它。3.3 模型导出适配不同部署需求如果你想把模型部署到嵌入式设备或者做加速推理YOLOv8支持多种导出格式。我常用的是yolo export modelbest.pt formatonnx yolo export modelbest.pt formatengine device0ONNX格式适合跨平台推理和TensorRT转换Engine格式是TensorRT优化后的加速版本推理速度能比PyTorch原生快两到三倍。不过考虑到毕设答辩场景PyTorch原生模型已经够用导出属于加分项。我的建议是先确保基础流程跑通再考虑性能优化。4. 核心检测逻辑与违规判定实现4.1 车辆检测推理流程无论界面端还是命令行端检测核心逻辑都是一样的读取帧 → 预处理 → 模型推理 → 后处理 → 输出结果表。下面这段代码是detect.py的核心部分我加了详细注释from ultralytics import YOLO # 加载模型 model YOLO(models/best.pt) # 推理单张图片 results model.predict( sourcetest.jpg, conf0.35, # 置信度阈值低于该值的目标被过滤 iou0.45, # NMS的IoU阈值用于去除重复框 imgsz640, # 推理分辨率 verboseFalse ) # 提取检测结果 boxes results[0].boxes.xyxy.cpu().numpy() # 四角坐标 confs results[0].boxes.conf.cpu().numpy() # 置信度 clses results[0].boxes.cls.cpu().numpy() # 类别置信度阈值conf要根据场景调节。调低了容易漏检调高了误检多。停车场监控画面相对清晰0.35到0.4之间比较合适。如果部署到远距离模糊摄像头上建议降到0.25到0.3。4.2 违规占道的判定规则这是整个项目里最难说清楚但又最核心的地方。违规判定的思路是检测到车辆后计算车辆框与预定义的禁停区域框之间的几何关系如果满足一定条件就判定为违规占道。我采用的方法是“中心点面积占比”双条件判定计算车辆框的中心点坐标判断中心点是否落在禁停区域内计算车辆框与禁停区域的重叠面积占车辆框面积的比例中心点在禁停区域内且重叠面积占比大于阈值我设为0.3则判定为违规。这个逻辑用代码表达就是def is_violation(vehicle_box, forbidden_zone_box, overlap_thresh0.3): # 判断中心点 x_center (vehicle_box[0] vehicle_box[2]) / 2 y_center (vehicle_box[1] vehicle_box[3]) / 2 center_in_zone (forbidden_zone_box[0] x_center forbidden_zone_box[2] and forbidden_zone_box[1] y_center forbidden_zone_box[3]) if not center_in_zone: return False # 计算重叠面积占比 x1 max(vehicle_box[0], forbidden_zone_box[0]) y1 max(vehicle_box[1], forbidden_zone_box[1]) x2 min(vehicle_box[2], forbidden_zone_box[2]) y2 min(vehicle_box[3], forbidden_zone_box[3]) inter_area max(0, x2 - x1) * max(0, y2 - y1) vehicle_area (vehicle_box[2] - vehicle_box[0]) * (vehicle_box[3] - vehicle_box[1]) overlap_ratio inter_area / (vehicle_area 1e-6) return overlap_ratio overlap_thresh为什么加面积占比这个条件因为如果只看中心点当车辆尾部压线但车身主体已进入车位时中心点有可能落在禁停区但实际“情有可原”。加入面积占比后只有当车辆主体真正侵入禁停区域时才触发告警大幅降低误报率。这个阈值可以在config.py里调整按你的停车位划线情况灵活配置。实测下来0.3在我的场景下效果最好敏感度太高会频繁误报。4.3 禁停区域标注工具区域配置存在parking_area.json里格式如下{ zones: [ {name: 消防通道, points: [[100, 50], [800, 50], [800, 150], [100, 150]]}, {name: 主通道, points: [[150, 400], [1000, 400], [1000, 500], [150, 500]]} ] }points是四边形的四个顶点坐标坐标基于输入画面的像素坐标。在默认测试图片上我预标注了两个禁停区域。如果你换成自己的监控画面需要重新标注。我在界面里做了“区域标注模式”加载一张实景截图后按住鼠标左键拉框松开后自动保存当前四边形区域到JSON。这样比手工改坐标文件直观得多。如果不想做界面标注也可以直接用画图工具打开截图读出关键点的像素坐标填入JSON文件。5. 可视化界面详解5.1 界面功能布局PyQt5写的界面主窗口分三块左侧检测画面显示区域视频帧、检测框、违规标记实时渲染上方显示FPS和模型加载状态。右侧功能控制面板包括“打开图片”“打开视频”“打开摄像头”三个输入按钮以及“开始检测”“停止检测”“导出违规记录”三个操作按钮。底部状态栏显示当前检测状态、累计违规次数、最近一条告警信息。界面布局不复杂核心代码逻辑在于用QThread处理推理任务避免阻塞UI线程。这一点是新手最容易犯的错如果在主线程里执行YOLO推理窗口会直接卡死拖动窗口都费劲。正确的方式是class DetectThread(QThread): update_frame pyqtSignal(QImage) update_violation pyqtSignal(str) def run(self): while self.running: ok, frame self.cap.read() if not ok: break # 在这里调用模型推理和违规判定 annotated_frame self.process_frame(frame) self.update_frame.emit(annotated_frame)QThread把耗时操作放到子线程通过信号槽机制把处理后的帧传回主线程刷新界面。我用这个方案解决了卡顿问题建议大家都采用。5.2 三种输入模式的处理差异图片模式读取静态图片执行一次检测结果展示在界面上适合快速验证模型和区域配置是否正确。视频模式读取视频文件逐帧检测并渲染实时显示累计违规次数。测试视频推荐用720P或1080P帧率不用太高。我测试时用了一段10秒的停车场监控视频1660 Ti跑起来流畅。摄像头模式调用本机摄像头或RTSP网络摄像头。本机摄像头直接cv2.VideoCapture(0)即可网络摄像头用cv2.VideoCapture(rtsp://IP:端口/stream)。需要注意网络摄像头延迟问题如果画面卡顿先把输入分辨率降低比如设置1280x720再不行就降检测分辨率。5.3 告警机制与记录导出违规检测触发后界面会用红色矩形框标出违规车辆框上显示“VIOLATION”标签在右下角弹出一个告警提示条显示违规时间和违规区域名称如果开启声音告警播报警示音声音文件放在ui/resources/alert.wav可以自由替换。记录导出功能会在本地生成一个CSV文件每次违规写入一行时间,违规区域,违规车辆类型,置信度 2025-05-20 14:23:10,消防通道,vehicle,0.87 2025-05-20 14:25:33,主通道,vehicle,0.76这个CSV文件不仅方便答辩展示还能用Excel打开做简单统计分析。如果你论文里需要“系统实际测试结果”这部分数据这个功能就能派上用场。6. 常见问题与排查技巧实录6.1 训练阶段典型问题我把实际操作中遇到最多的五类问题整理成一张表方便大家快速对照排查问题现象根本原因解决办法训练时CUDA out of memorybatch_size或imgsz设置过大降低batch到4或2或换yolov8n模型损失不下降准确率极低数据集标注错乱类别ID不一致检查标签文件确认类别顺序和配置文件一致训练很快被early stoppatience参数太小或数据量过小调大patience到100补充数据模型对某些目标漏检严重该类别样本太少或遮挡严重补充该类样本开启Mosaic增强推理速度慢模型版本太大或推理分辨率太高换yolov8n/s或降imgsz到480有一个容易被忽视的坑训练时图片的EXIF信息会导致OpenCV读取图片方向翻转。在某些手机拍摄的图片上车辆看起来是横着的标注也正常但训练时模型看到的却是旋转后的画面。这个问题在训练前跑一遍图片预处理脚本就能规避我建议统一把数据集图片resize到同一个尺寸并检查是否有旋转。6.2 界面运行常见故障界面打不开、摄像头报错这类问题也很常见。我遇到过的几个案例qt.qpa.plugin: Could not load the Qt platform plugin xcb——这是Linux下缺少xcb库安装对应依赖后解决。Windows下很少见到这个报错如果遇到api-ms-win-crt-runtime-l1-1-0.dll missing这类问题说明系统缺少VC运行库去微软官网装一个就行。摄像头打开时报-5: Bad argument大概率是摄像头编号不对。双摄像头电脑的默认编号不一定是从0开始可以写个小脚本遍历编号0~5找到可用摄像头。界面卡顿的排查思路我建议的优先级是先看CPU和GPU占用率判断是模型推理慢还是界面渲染慢然后检查推理线程是否与主线程存在资源竞争最后降低画面分辨率或检测频率比如每帧检测改为每2帧检测一次。检测频率这个优化见效最快对监控场景根本感知不到差异但CPU占用能降一半。6.3 部署到其他机器时的注意事项把项目拷贝到另一台电脑运行时有几个细节容易出问题绝对路径问题代码里如果写死了数据路径或模型路径换机器就会找不到文件。我的做法是全部用相对路径运行时基于当前目录定位。如果你从压缩包直接解压后运行失败先检查是否在项目根目录下执行。PyTorch版本兼容性问题best.pt是用高版本PyTorch训练出来的低版本环境可能无法直接加载。如果报权重文件不兼容在装高版本PyTorch的机器上重新导出一次模型即可。缺少依赖最稳妥的方式是创建一个虚拟环境然后按requirements.txt逐项安装。不要用系统全局的Python环境否则版本冲突会让人崩溃。如果想把项目打包成exe发给别人演示用PyInstaller打包PyQt5项目时需要额外指定Qt插件目录否则界面上白屏一片。我提供一个简单的打包命令但要注意打包后体积会很大解压释放速度也会变慢一般演示用的话直接跑源码更省事。7. 毕设场景下的扩展方向如果想让这个项目从“能运行”升级到“拿高分”以下几个方向是我实践后觉得投入产出比最高的加入车牌识别在检测到违规车辆后裁剪车辆区域用PaddleOCR或YOLOv8训练一个车牌检测模型识别车牌号并写入违规记录。这个功能在答辩现场演示时非常加分因为它完成了检测到管理的闭环。换成Transformer检测器DETR或RT-DETR-Deformable对比YOLOv8的检测效果并做数据可视化。实际效果未必更好但体现了算法选型的思考深度。多线程视频流处理同一界面接入多路RTSP摄像头通过ThreadPoolExecutor并发检测。这会让系统看起来更像工业级产品。引入跟踪算法用ByteTrack或DeepSORT对车辆ID进行跟踪有效避免同一辆车被重复告警也方便统计车辆停留时长。这个是真实停车场系统必备能力。模型轻量化压缩用TensorRT或者OpenVINO做推理加速。如果你的答辩时间不充裕这一步可以放在最后做。我个人的建议别贪多选一个方向深入做透。比如就做“违规检测车牌识别违规记录导出”这条链路把每个环节测试数据整理好答辩时展示对比表格和效果图导师的评价通常会比堆砌五个Demo但每个都很粗糙要好得多。最后分享一个实操中的体会这个项目做完之后再看停车场场景会有“职业病”路过任何停车场都会下意识观察它的监控视角、车位划线和通道设计想象检测系统在这个场景下能不能正常工作。其实毕设的意义也在这里它不仅是一个要交付的任务更是你第一次把课本上的目标检测、图像处理、界面编程这些知识点串成一条完整流水线的机会。希望这篇拆解能让你少走一些弯路。如果你在部署过程中遇到问题按文中的思路逐项排查大概率都能解决。祝各位答辩顺利。本文还有配套的精品资源点击获取