
简介一份面向计算机视觉毕业设计与课程设计的YOLOv8停车场车辆占道违停检测完整项目包适合计算机科学、人工智能、通信工程、自动化等专业学生及不同基础水平的开发者使用。资源内含可直接运行的Python源码、训练好的模型权重、完整数据集及可视化界面支持生成核心指标曲线、混淆矩阵、F1分数曲线、PR曲线、验证集预测结果与标签分布图附部署说明与README下载后按指引即可运行。压缩包共8个文件以py脚本训练、检测及可视化界面、pt模型预训练权重与最佳模型和txt说明为主整体约15.91MB轻量紧凑。目前已有62人在线学习项目代码经测试通过功能完善适合直接用于答辩演示或在此基础上二次扩展。整体上覆盖了从数据准备、模型训练到结果分析的全流程同时支持视频检测与可视化页面交互拿来即用。1. 停车场占道违停检测不是玄学YOLOv8 资源包到手后怎么落地停车场里“占道违停”这个检测难点不在“识别车辆”而在“判断这辆车是不是占了不该占的位置”。基于 YOLOv8 的这套项目正好把最后一公里的可视化、指标图和模型权重都替你打包好了。它不是让你从零写神经网络而是把训练、推理、展示三条链路都准备好你只要把环境配起来先跑通视频检测再决定是直接用现成 weights 还是用自己的数据集重新训练一轮。适合正在做毕设、课程设计或者第一次接触 YOLO 目标检测的同学——你不需要懂底层 C 实现但至少要会看路径、会跑命令、会读报错。这篇文章按“先推理、再训练、边踩坑、后进阶”的顺序把资源包里的真实用法和容易翻车的地方讲透。2. 先跑通推理再看界面环境搭建与首轮检测的四个关键点2.1 压缩包里的文件到底谁管谁先读 README 再动手解压后第一件事不是双击任何一个界面文件而是打开 README.txt。我见过太多人直接运行 Visual_interface.py 然后闪退回头问为什么——原因往往就是没按 README 里写的顺序装依赖。这个包的文件组织并不复杂核心是三个代码文件加两个权重文件。文件/目录作用备注README.txt部署说明、环境要求、运行顺序第一优先读它train_mode.py训练入口封装了数据集加载与 YOLOv8 训练流程改参数前先看懂默认值Detection_video.py用训练好的权重跑视频/摄像头检测输出结果视频推理入口Visual_interface.py可视化界面展示检测结果、生成指标曲线、混淆矩阵依赖 matplotlib / pandas 等best.pt训练好的最优权重推理时优先用这个yolov8n.pt / yolo11n.pt预训练种子权重用于重新训练或对比也可以用它们做纯预训练推理数据集目录包含 images 与 labels按 YOLO 格式组织用自备数据替换时注意类别序号理解这个结构之后你就能把“训练”和“推理”分开。best.pt 是已经训练过的产物Detection_video.py 是消费这个产物train_mode.py 是重新生产这个产物。先跑推理能让你快速确认环境没问题再碰训练就不会被“到底是环境错还是代码错”这种问题绕晕。2.2 搭建 YOLOv8 运行环境CPU 也能跑但别指望实时这个资源对算力要求不高纯 CPU 也能完成推理和训练只是速度慢。建议先用 Python 3.8 到 3.10 之间建一个虚拟环境避免系统 Python 被各种依赖搞乱。安装的核心库是 ultralytics、torch、opencv-python其中 torch 要根据你是否有 NVIDIA 显卡选择对应版本。没有 GPU 就装 CPU 版有 GPU 就先查一下 CUDA 版本再决定 torch 的安装源。# 创建虚拟环境Windows 用 conda createLinux 直接 python3 -m venv conda create -n parking_yolov8 python3.9 -y conda activate parking_yolov8 # 安装基础依赖 pip install ultralytics8.2.0 opencv-python pandas matplotlib gradio # CPU 版 torch直接装官方默认源即可 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu # 如果你有 NVIDIA GPU先确认 CUDA 版本再装对应 torch例如 CUDA 11.8 # pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118装完后用一条命令验证环境是否正确python -c from ultralytics import YOLO; print(YOLO.__module__)。如果输出的是模块路径而不是报错说明 ultralytics 装好了。这里强调虚拟环境是因为很多毕设翻车现场都是把项目直接丢在 base 环境里opencv 版本冲突导致界面起不来。另外如果你的电脑内存小于 8G训练时 batch size 往小了调后文会专门讲。2.3 用 best.pt 跑第一轮视频检测参数含义与输出结果环境就绪后先直接调用 Detection_video.py 对一段测试视频做检测。这个脚本的核心逻辑是加载 best.pt用 YOLO 模型逐帧推理再把标注框和类别名字画到每一帧上最后通过 OpenCV 的 VideoWriter 写回新视频。运行命令如下# 基本用法指定输入视频、权重文件、置信度阈值 python Detection_video.py \ --source parking_lot_test.mp4 \ --weights best.pt \ --conf 0.5 \ --save-dir output # 如果要用摄像头实时检测把 source 改成 0 # 如果只用 CPU建议加 --device cpu 强制指定--conf 0.5表示只有置信度大于等于 0.5 的检测框才会被保留。这个值不是越高越好——调高了漏检尤其是占道车辆往往被部分遮挡调低了误检可能把普通停着的车也画上框。我的习惯是先取 0.4 跑一遍看看如果画面里框特别多、互相重叠再逐步升到 0.6。输出目录里会得到一段带标注的视频同时终端会打印每一帧的检测类别、置信度和坐标。如果你在控制台看到no detections或者几乎没框先检查 source 路径是不是对的再检查 best.pt 是否损坏——用python -c from ultralytics import YOLO; mYOLO(best.pt); print(m.names)打印类别名看一下正常应该输出类似 {0: vehicle, 1: blocking} 的字典。3. 把训练链路走通数据集格式、超参数与指标曲线生成3.1 YOLO 数据集格式目录编排和标签文件必须逐行核对如果你决定用自己的停车场图片重新训练第一步不是改模型结构而是把数据集整理成 YOLO 能读的标准格式。这个资源自带的数据集已经排好直接复制它的目录结构是最省事的方式。标准结构是 datasets 根目录下分 images 和 labels两个目录里各自有 train 和 val 子集images/train 放图片labels/train 放同名 txt 标签文件。datasets/ ├── images/ │ ├── train/ │ │ ├── img_001.jpg │ │ └── ... │ └── val/ ├── labels/ │ ├── train/ │ │ ├── img_001.txt │ │ └── ... │ └── val/ └── data.yaml每个 txt 文件里每一行代表一个目标格式是class_id x_center y_center width height注意坐标全部归一化到 01。比如下面这行表示类别 0普通车辆中心点在图像的 (0.5, 0.5) 处宽高各占图像的 40%0 0.5 0.5 0.4 0.4。最容易踩的坑是用 LabelImg 等工具标注完后导出了绝对值坐标而 YOLO 要的是归一化后的值。资源包里的数据集既然能训练出 best.pt说明它的标签格式是对的——你换数据时一定要用能导出 YOLO 格式的标注工具或者写完脚本转换后再跑yolo check验证标签范围。3.2 train_mode.py 训练参数深度解读epochs、batch、imgsz 的关系train_mode.py 本质上是调用 ultralytics 的 YOLO 接口完成训练。打开脚本你会看到类似下图的参数初始化逻辑from ultralytics import YOLO # 加载预训练权重yolov8n.pt 是 nano 版本速度最快精度偏低 model YOLO(yolov8n.pt) # 核心超参数常见默认值就不建议大改 model.train( datadatasets/data.yaml, epochs100, # 完整遍历训练集的次数 batch8, # 一次迭代喂入的图片张数 imgsz640, # 输入图片缩放到 640x640 patience20, # 连续 20 个 epoch 指标不提升就早停 projectruns/train, nameexp, devicecpu, # 有 GPU 改成 0 或 0,1 plotsTrue, # 生成指标曲线、混淆矩阵等图 )epochs 太小会欠拟合太大容易过拟合但 patience 机制能在指标停滞时自动停止所以设成 200 也不用担心跑过头。batch 是最吃显存/内存的参数CPU 训练建议 48GPU 16G 显存可以设 16 以上。imgsz 默认 640如果你的图片本身是 1920×1080先缩放到 640 会丢失部分小目标信息但调大 imgsz 到 1280 会让训练时间翻倍。停车场占道检测的目标是车辆属于中大目标640 够用。如果训练过程中 loss 出现 NaN优先把 batch 调小大概率是显存溢出导致的。这里还要注意plotsTrue它会自动生成训练曲线图、混淆矩阵、F1 分数曲线、P-R 曲线保存到 runs/train/exp/ 目录下这些图恰好是毕设答辩里最缺的素材。3.3 可视化界面用 Visual_interface.py 生成评审想要的指标图训练结束后runs/train/exp/ 里已经有一堆 png 文件但很多人不会直接看曲线更习惯用界面点两下。Visual_interface.py 这个脚本的作用就是把这些结果从文件变成交互式展示。运行它之前先确认results.csv存在因为曲线图的数据源就是那个 csv。启动命令很简单python Visual_interface.py。脚本内部会启动一个本地服务默认地址是 http://127.0.0.1:7860 打开浏览器就能看到界面。界面上通常有几个区域一个是选择权重文件一个是上传图片/视频还有一个是展示 loss 曲线、混淆矩阵等图表的下拉菜单。如果你不想依赖界面也可以直接从 runs/train/exp/ 里拿图。下面的代码可以把训练过程中的 loss 曲线重新画出来并且合并到一张图里方便放进论文import pandas as pd import matplotlib.pyplot as plt # 训练日志文件由 ultralytics 自动生成 df pd.read_csv(runs/train/exp/results.csv) # 看有哪些列可以画 print(df.columns) plt.figure(figsize(10, 6)) plt.plot(df[epoch], df[train/box_loss], labelbox_loss) plt.plot(df[epoch], df[val/box_loss], labelval_box_loss) plt.xlabel(epoch) plt.ylabel(loss) plt.legend() plt.title(YOLOv8 训练与验证 box loss 曲线) plt.savefig(loss_curve_custom.png, dpi300)这里的列名可能因版本略有差异常见的有train/box_loss、val/cls_loss、metrics/mAP50-95(B)。画图前先 print 列名别直接照抄。可视化界面的价值在于它把“训练结果查看”从命令行变成了点击操作你可以在答辩时现场演示也可以提前把图导出来放进 PPT。需要提醒的是Visual_interface.py 如果报错找不到文件多半是脚本里的相对路径和你的实际路径不一致改脚本里指向 runs/train/exp 的路径常量即可。4. 避坑指南占道违停检测最容易翻车的四个典型场景4.1 现象训练时 loss 一开始就很大最终 mAP 不到 0.3原因大概率是 data.yaml 里的类别数nc和实际标签里的类别 ID 不一致。比如标签文件里出现了 class_id2但 data.yaml 里只写了nc: 2代码会直接崩溃或忽略第 3 类目标。也有可能是标签坐标没有归一化出现 width 大于 1 的情况。解决训练前先跑yolo check或者自己写几行代码扫描标签文件验证所有标签是否在同一范围内。我一般会在训练前打印 data.yaml 内容然后单独检查 labels 目录里全部 txt 的最大 class_id 是多少。如果发现类别号不连续需要用脚本重映射标签编号别手改。4.2 现象用 CPU 推理视频每一帧要 23 秒视频卡成幻灯片原因没有指定设备ultralytics 默认会用 GPU如果没有 GPU 就自动切 CPU但 CPU 推理本来就慢。另外输入视频分辨率太高比如 4K 视频直接喂给 imgsz640 的模型OpenCV 读取原分辨率帧后还要做缩放CPU 忙不过来。解决检测时显式指定--device cpu并把--imgsz 640写在命令里让图片预先缩放到模型输入尺寸。如果还卡可以跳帧检测每 5 帧检测一次中间帧复制上一次的结果用 OpenCV 的 VideoCapture 设置 CAP_PROP_POS_FRAMES 即可。反正占道检测不需要实时连续追踪10 秒一次判定足够。4.3 现象Visual_interface.py 启动后浏览器打不开或者程序直接闪退原因最常见的是缺少 gradio 或 Flask 依赖或者端口被占用。另一种可能是脚本里用了相对路径而你把压缩包解压到了带中文或空格的路径下OpenCV 和 matplotlib 处理中文路径经常出问题。解决先确认安装过pip install gradio然后执行python Visual_interface.py看终端报错。如果是路径相关把整个项目目录复制到D:\project\parking这种纯英文路径下再试。如果端口被占用改脚本里的launch(server_port7861, shareFalse)换个端口。记住界面闪退 99% 是依赖缺失或路径问题不是代码本身坏了。4.4 现象重新训练自己的数据集后用 best.pt 检测框全画在图像角落或坐标完全错位原因训练图片尺寸和推理图片尺寸不一致或者标签归一化基准不对。更隐蔽的是用自己的数据时把类别顺序改了比如原资源里 0 是占道车你新数据里 0 是普通车但忘了同步改 data.yaml 里的 names 顺序。解决训练完先打印model.names确认类别顺序符合预期。然后跑一张验证集图片将推理结果和原始标签对比。如果框错位检查是否在训练前对图片做了裁剪或缩放而标签没有跟着变换。以后每次换数据集我都强制走一遍“标签扫描→类别校验→单图测试”三步这套流程就是我从这几次翻车里攒出来的血泪经验。5. 进阶技巧从检测框到“占道”判定以及模型上限验证5.1 把检测结果转成占道逻辑区域 IoU 才是关键YOLOv8 只告诉你“这里有车”不会告诉你“这车占道”。真正做违停判定需要额外定义一个禁止停车区域然后计算车辆框和禁停区域的交并比。常见做法是在代码里用多边形坐标框出禁停区例如通道、消防通道然后用 shapely 库的Polygon.intersection计算重叠面积占比。from shapely.geometry import Polygon # 定义禁停区域四个顶点按顺时针给出 forbidden_zone Polygon([(100, 500), (700, 500), (700, 900), (100, 900)]) # 假设 YOLO 检测结果给出一个车辆框 vehicle_box Polygon([(200, 450), (600, 450), (600, 800), (200, 800)]) # 计算车辆框与禁停区域的交集占比 intersection vehicle_box.intersection(forbidden_zone).area vehicle_area vehicle_box.area overlap_ratio intersection / vehicle_area # 占道判定超过 15% 就算违停阈值你自己调 if overlap_ratio 0.15: print(检测到占道违停)车辆框本身就带着四个顶点坐标不需要额外转换。这里的阈值 0.15 是我常用的起始值——设太低泊位边缘的车容易被误判设太高真正横在通道中央的车反而漏判。你可以统计一批验证集调整这个比例直到误报率最低。这个逻辑不会写进 Detection_video.py而是写在业务判断层属于你二次开发的部分。5.2 用混淆矩阵和 P-R 曲线验证模型上限训练完生成的 confusion_matrix.png 是最直观的观察入口。如果“占道车”类别被大量识别成“普通车”说明这两类外观太接近需要增加占道车在遮挡、夜间、不同光照下的样本。如果 P-R 曲线里某类别的召回率爬不上去说明漏检多此时应该降低置信度阈值或增加训练轮数。记住混淆矩阵是在验证集上算出来的不代表测试集的真实分布所以最好单独预留一部分没参与训练的视频用做最终评测。5.3 换模型yolov8n 和 yolo11n 哪个更适合占道检测资源里同时放了 yolov8n.pt 和 yolo11n.pt这就是给你做对比用的。yolov8n 是经典基线稳、文档多、报错好查yolo11n 是后出的版本理论上在相同尺寸下速度略快。但实际训练时yolov8n 的收敛曲线更平缓yolo11n 对小目标稍有提升而停车场车辆通常不小优势不明显。我的建议是先用 yolov8n 把整套流程跑通出图、答辩都够了如果你想在论文里写一句“尝试了更新架构”再训练一版 yolo11n 做对比实验。从那以后我每次拿到这类 YOLO 资源包都会强制走一遍固定流程先看 README再查依赖然后用官方权重跑一次推理确认 baseline 正常最后才动训练参数。中间任何一步报错先看终端最后 20 行日志而不是立刻怀疑代码被加密。这套检查习惯让我少走了很多弯路希望帮到你。本文还有配套的精品资源点击获取