☰
YOLOv8目标检测实战:商场扶梯逆行预警系统毕设全解析
2026/10/5 5:23:17 网站建设 项目流程

简介:基于YOLOv8的商场扶梯逆行行为预警系统,是一套面向计算机视觉方向毕业设计、课程设计及初期项目演示的完整方案,资源以目标检测为核心,覆盖数据准备、模型训练、可视化界面与部署文档,适合具备一定Python基础的高校学生或相关从业者直接使用。压缩包内共8个文件,包含3个Python脚本(分别负责模型训练、视频检测与可视化界面)、3个模型权重文件(含YOLOv8n、训练完成的best.pt及YOLO11n)、2个txt说明文档,整体大小15.91MB,按README指引即可快速完成环境配置与运行。系统提供可视化交互界面,支持视频检测与模型训练模式,可产生核心指标曲线、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果及标签分布图,便于论文展示和答辩佐证。目前已有37人学习,适合作为毕设保底方案或提升综合能力的实践项目。

1. 商场扶梯逆行预警:YOLOv8 目标检测的完整毕设交付

在商场这种人员密集场景里,扶梯逆行是最难靠安保肉眼盯住的问题之一。这个项目把「人有没有逆行」拆成两件事来做:先用 YOLOv8 目标检测模型把扶梯区域的行人框出来,再通过连续帧的位置变化判断移动方向,一旦与扶梯运行方向相反就触发报警。

整套资源包含训练源码、可视化界面、完整数据集和部署教程,解压后按 README.txt 的顺序走一遍就能跑。适合计科、人工智能、自动化等专业的毕业设计和课程设计,答辩时直接拿出指标曲线和界面演示,项目里预置的混淆矩阵、F1 曲线、PR 曲线都是现成素材。下面按「原理 → 部署 → 训练 → 避坑 → 验收」的顺序把每个环节拆开讲。

2. 检测原理与选型:逆行判断不是“人往哪走”这么简单

这套系统能跑通,关键不在模型多新,而在把「检测」和「方向判断」两层逻辑拆得干净。先讲原理,再讲三份权重怎么配合,最后落到答辩要用的图表。

2.1 单帧检测解决不了方向问题

扶梯逆行系统要同时回答两个维度的问题:空间维度是「人在扶梯哪个位置」,时间维度是「人朝哪个方向移动」。YOLOv8 这类单帧检测器只回答前者,它输出的每个框是一组坐标、类别和置信度,没有速度也没有方向。要判断逆行,必须把连续若干帧的检测结果串起来看:同一行人出现在哪几帧、中心点怎么移动、移动方向与扶梯运行方向夹角多大。

常见做法是两段式设计。第一段跑 YOLO 检测出行人框,第二段做轻量目标匹配——把当前帧的框和上一帧的框按 IoU 或中心点距离对上号,匹配成功后用相邻帧的中心点位移算方向。方向与扶梯运行方向相反,且持续超过设定帧数,才触发报警。以扶梯向上运行为例,核心判断逻辑大致长这样:

# 以扶梯向上运行为例:屏幕上 y 坐标减小表示向上 def judge_direction(prev_box, curr_box, reverse_th=10): prev_y = (prev_box[1] + prev_box[3]) / 2 # 上一帧中心点 y curr_y = (curr_box[1] + curr_box[3]) / 2 # 当前帧中心点 y if curr_y - prev_y > reverse_th: return 'down' # 实际在往下走,与扶梯方向相反 return 'up'

这里的关键是「持续超过设定帧数」这个条件,它能把偶发的单帧抖动直接过滤掉,比在单帧图像上直接喊逆行可靠得多。为什么不直接用背景差分或光流法?扶梯梯级本身在运动,背景差分会把梯级当成前景;光流法在低纹理区域和密集人流里噪声巨大。YOLO 先检测、再算方向,等于把「找目标」和「算运动」两个难题分开,每个环节都能独立调参。

2.2 yolov8n / yolo11n / best.pt:三份权重各干什么

压缩包里同时给了 yolov8n.pt、yolo11n.pt 和 best.pt 三份权重,第一次拿到容易懵。其实分工很明确。

yolov8n.pt 是 COCO 预训练权重,n 代表 nano,是 YOLOv8 里体量最小的一档,参数量小、推理快、显存占用低,train_mode.py 拿它当训练起点,收敛速度比从零训练快很多。yolo11n.pt 是 ultralytics 后续 YOLO11 系列的轻量权重,放在工程里主要用来做 backbone 对比实验——毕设里加一组「yolov8n 与 yolo11n 精度与速度对比」是很自然的加分项。best.pt 则是作者用自己的扶梯数据集训练完成后保存的最优权重,Detection_video.py 和可视化界面默认加载的都是它。

权重文件来源使用场景
yolov8n.ptCOCO 预训练train_mode.py 的初始权重
yolo11n.ptCOCO 预训练(YOLO11)backbone 对比实验
best.pt扶梯数据集训练产出视频推理 / 界面演示

推理阶段只认 best.pt。如果你后来重新训练生成了自己的权重,记得先复制到工程根目录再跑检测脚本,否则脚本加载的还是压缩包里那份旧的,指标对比会得出错误结论。

2.3 答辩要的核心曲线图是哪一张

摘要里反复提到的指标曲线图、混淆矩阵、F1 分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图,并不是手工绘制的,而是 ultralytics 训练流程的自动产物。训练一结束,runs/detect 下的实验目录会自动生成一整套图表。

图表文件内容答辩怎么讲
results.pngloss 曲线 + mAP50 / mAP50-95 曲线讲模型收敛过程
confusion_matrix.png真实类别与预测类别的关系讲漏检、误检来源
PR_curve.png精确率-召回率权衡曲线讲阈值选择依据
F1_curve.pngF1 随置信度阈值的变化讲最优置信度区间
labels.jpg训练集标签的位置与数量分布讲数据质量与标注一致性
val_batch_pred.jpg验证集预测框可视化讲模型直观效果

我的建议是答辩时按「数据 → 训练 → 效果」三段来讲:先用 labels.jpg 证明数据集干净、类别分布合理,再用 results.png 证明训练收敛、没有明显过拟合,最后用 val_batch_pred.jpg 证明模型真的把行人框住了。这三张图串起来逻辑闭合,比堆十张曲线更有说服力。

提示:F1_curve.png 的横轴是置信度阈值,曲线峰值对应的阈值可以直接作为部署时的初始 conf 值,之后再拿真实视频微调。

3. 目录结构与环境部署:先读 README,再装依赖

作者在上传说明里强调代码都测试通过,但测试通过不等于换机零配置,环境还是得自己过一遍。拿到压缩包后,目录看一眼、README 读一遍、data.yaml 核对一次,这三件事做完再谈训练。

3.1 压缩包里的文件各自干什么

展开压缩包后是一份「麻雀虽小五脏俱全」的目录:训练、推理、界面、数据四块齐全。刚解压时最忌讳的是直接双击 train_mode.py 开跑,大概率会因为路径没配对报错。先花两分钟把文件职责认一遍。

文件 / 目录职责什么时候用
README.txt部署说明、版本信息、运行顺序第一步必读
train_mode.py训练入口,产出权重与全套图表复现训练时
Detection_video.py用 best.pt 对视频做检测与报警核心演示
Visual_interface.py可视化操作界面答辩展示
yolov8n.pt / yolo11n.pt / best.pt三份权重文件训练与推理
dataset/图像与 YOLO 格式标签训练输入

README.txt 是整个项目里最重要的文件,作者把环境版本、运行顺序和注意事项都写在里面,也是出问题时的第一求助对象。这类资源项目我吃过一次亏:把 ultralytics 升到大版本后训练参数行为全变了,跑出来的结果和作者描述的完全对不上。所以下载后第一件事就是打开 README,严格按里面写的版本装。

3.2 环境安装与硬件参考

yolov8 环境配置是这套流程里小白最容易卡住的一步。常见做法是先建独立 conda 环境,避免污染系统 Python:

conda create -n yolo python=3.9 -y conda activate yolo pip install ultralytics opencv-python pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

第一行创建 Python 3.9 环境,3.8~3.10 之间都行,不建议追新版本 Python,部分老依赖兼容性容易出问题。第三行安装检测框架本体和 OpenCV,前者负责模型加载与训练,后者负责视频读取和画面显示。第四行单独装 CUDA 版 PyTorch,cu118 表示 CUDA 11.8 工具链;如果显卡驱动旧,可以换成 cu117,没有 NVIDIA 独显的话直接pip install torch torchvision装 CPU 版。

硬件方面 yolov8n 对配置相当友好。6G 显存的 GTX 1660 Ti 这类卡训练时 batch 设 4~8 没问题,推理阶段 CPU 也能扛住,只是帧率低一些。真正吃资源的是把 batch 和 imgsz 同时调大之后,跟模型本身关系不大。

3.3 第一次运行前要改的路径配置

数据路径是这套资源里最容易翻车的一个点。训练前先确认 dataset 目录下有没有 data.yaml,再核对里面的 path 字段:

path: D:/myproject/escalator/dataset # 改成你解压后的实际路径 train: images/train val: images/val nc: 1 names: ['person']

path 字段强烈建议写成绝对路径。用相对路径时,如果 train_mode.py 不是从 dataset 的同级目录启动,训练会直接报数据集不存在。names 里的类别名要和标签文件里实际的类别序号对上,序号从 0 开始;如果 labels 里的 class 编号是 0 而 data.yaml 里声明成了 1,训练出的模型类别映射整体错位,指标看起来正常,推理时框全对不上。换电脑之后第一件事就是改这个文件里的 path,这是本资源最常见的必修动作。

这套流程对小白最友好的点在于:只要 README 和 data.yaml 两个文件先搞清楚,剩下的脚本基本不用动。它把「环境、数据、训练、推理」四个环节都给全了,缺的只是按顺序走一遍。

4. 模型训练实操:train_mode.py 的参数与指标产出

训练是整个项目里参数最多、最容易被乱调的一环。train_mode.py 已经把流程封装好了,剩下的是理解每个参数在干什么,以及训练完去哪找产物。

4.1 训练入口和核心参数

train_mode.py 的职责链路是:加载预训练权重 → 读取 data.yaml → 在自己的数据集上微调 → 输出 best.pt / last.pt 和全套指标图表。代码主体的常见写法:

from ultralytics import YOLO if __name__ == '__main__': model = YOLO('yolov8n.pt') # 从 COCO 预训练权重起步,收敛更快 model.train( data='dataset/data.yaml', # 数据集配置路径 epochs=100, # 训练轮数 imgsz=640, # 输入分辨率 batch=8, # 批大小,6G 显存建议改 4 patience=20, # 连续 20 轮不涨则早停 device=0, # 使用 GPU 0,无独显改 'cpu' project='runs/detect', # 输出根目录 name='escalator', # 实验名,产物都会带上这个前缀 plots=True, # 自动生成曲线图与混淆矩阵 )

几个关键参数要讲清楚。YOLO('yolov8n.pt') 会在本地找不到权重时自动从官方源下载,第一次跑如果网络不好会卡在下载阶段,提前把压缩包里的 yolov8n.pt 放回工程根目录就能跳过。epochs 是总轮数,几百张图的数据集 100 轮基本收敛。patience 是早停策略,连续 20 轮验证集指标不提升就自动终止,省电省时间。plots=True 必须保持开启,否则答辩要用的混淆矩阵、PR 曲线、F1 曲线不会生成。

参数参考值什么时候改
epochs100数据量小改 60~80
imgsz640显存不足改 480
batch86G 显存改 4,仍爆改 2
patience20快速验证改 10,想充分训练改 30
device0无独显改 'cpu'

4.2 训练后的指标图表目录

训练结束后,所有产物集中在 project/name 指定的目录下,也就是 runs/detect/escalator。里面既有 best.pt、last.pt,也有 plots=True 带来的全套图表。要在答辩 PPT 里讲「模型效果」,优先抽三张:results.png 证明收敛,PR_curve.png 证明精度,val_batch_pred.jpg 证明直观效果。导师追问错分情况时,再上 confusion_matrix.png。

如果想给论文插图准备一张更干净的损失曲线,可以用 results.csv 重绘:

import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('runs/detect/escalator/results.csv') plt.figure(figsize=(8, 5)) plt.plot(df['train/box_loss'], label='train box_loss') plt.plot(df['val/box_loss'], label='val box_loss') plt.xlabel('epoch') plt.ylabel('box_loss') plt.title('YOLOv8 box loss curve') plt.legend() plt.grid(True) plt.savefig('loss_curve.png', dpi=300)

pandas 读到的 results.csv 每个 epoch 一行,train 和 val 的 loss 分列存放。画成两条曲线能直接看出有没有过拟合:train loss 持续下降但 val loss 掉头向上,就是典型的过拟合信号,这时应该减小 epochs 或增强数据扩增;两条线同步下降并趋于平缓,说明训练健康。dpi=300 是为论文插图准备的,投屏演示用 150 就够。

4.3 best.pt 和 last.pt 怎么选

训练目录里同时存在 best.pt 和 last.pt,别搞混。last.pt 是最后一轮的权重,如果早停触发得早,它未必停在最优位置;best.pt 是训练全程验证集综合指标最高的一份,推理部署一律用 best.pt。

还有一个容易被忽略的细节:ultralytics 选 best 用的是验证集综合分数,并不一定对着你最关心的指标。扶梯逆行场景里漏检比误检更致命,如果验证结果里召回率偏低,可以把 results.csv 里每个 epoch 的 Recall 列拉出来,选 Recall 最高的那一轮权重做部署。答辩时能说出「我的权重不是只看 mAP,还按场景需求优先保了召回率」,这句话比放十张图都管用。

5. 避坑与排查:训练到部署最容易翻车的五个地方

这一章集中写我从这个项目里踩过的五个高频坑,按训练、换机、推理、界面的顺序排,读到哪条正好对应你卡住的环节。

5.1 显存爆掉导致训练中断

现象:训练跑到十几个 epoch,终端直接抛 CUDA out of memory,进程终止,已跑的中间结果只有图表没有权重。

原因:batch=8、imgsz=640 在 6G 显存的 GTX 1660 Ti 这类卡上已经接近上限,DataLoader 预读取图片时还会额外占用显存,峰值比稳态高不少。

解决:batch 降到 4,imgsz 降到 480,必要时在 train 参数里加 workers=2 限制数据加载线程。启动前先确认显存占用:

nvidia-smi --query-gpu=memory.used,memory.free --format=csv

如果已有其他进程占了大半显存,先关闭再训练。快速验证流程时可以先跑 5 个 epoch 看显存占用,确认安全再放全量。

5.2 损失曲线不下降

现象:loss 前几轮下降后一直平走,mAP50 停在很低的水平,甚至验证集 loss 比训练集还高。

原因:最常见的是标签类别序号和 data.yaml 对不上,模型在学一个错误的映射;其次是初始学习率对小数据集偏大,参数来回震荡,loss 曲线像锯齿。

解决:先打开 dataset 目录下的 labels.jpg,确认标注框的位置、类别分布正常;再在 train 参数里加 lr0=0.005 把初始学习率调低一档,epochs 拉长到 120。我的习惯是先跑 20 轮看趋势——loss 在降、mAP 在涨就放全量,前 20 轮都不动的话,直接停下来查数据而不是继续干等。

5.3 换电脑就报 CUDA 错误

现象:自己电脑跑得好好的,拿到答辩用的笔记本上 import torch 直接报错,或者推理速度骤降。

原因:torch 的 CUDA 版本跟笔记本显卡驱动不匹配,或者笔记本压根没有独立显卡,而代码默认走了 device=0。

解决:换机后按 README 里的版本说明重装一次环境,别图省事直接拷贝 conda 目录,路径对不上反而更折腾。先跑一段诊断代码确认环境可用:

import torch print(torch.__version__, torch.cuda.is_available())

输出 False 就说明没识别到 GPU,把 device 改成 'cpu'。yolov8n 在 CPU 上跑扶梯视频的帧率够演示用,conf 适当调高还能减少无效计算。

5.4 扶梯场景误报多

现象:没逆行的人也被报警,站在扶梯上不动的人偶尔也触发,报警日志刷屏,演示现场很尴尬。

原因:单帧检测的中心点抖动被直接当成位移;conf 设太低把远处行人误判进扶梯区域;扶梯梯级本身的纹理会干扰边缘定位。

解决:推理置信度 conf 提到 0.35 以上;方向判断加「连续 N 帧同方向」的确认逻辑,比如连续 5 帧位移方向一致才报警,单帧抖动直接被滤掉。这个 N 值建议做成配置项写在脚本头部,答辩时现场调大调小对比误报率,是很直观的演示环节。

5.5 可视化界面打开后黑屏

现象:Visual_interface.py 正常启动,按钮可点,但画面区域一直是黑色,终端也没有明显报错。

原因:界面脚本里模型权重用的是相对路径,脚本从别的目录启动后 best.pt 加载失败,程序又没有抛异常;或者视频源路径本身失效。

解决:把界面脚本里的模型路径和视频源路径全部改成绝对路径;启动界面之前先单独跑一遍 Detection_video.py,命令行能正常出框再进界面,这样能把问题快速定位在界面层还是模型层。

以上五条按出现频率排,训练期集中在 5.1 和 5.2,换机后集中在 5.3,推理和演示阶段则是 5.4、5.5。如果只留一个心眼,记住这条:任何一步出问题,先回 README 核对版本和路径,再上手段调参。

注意:如果你打算把训练好的模型往 rk3588 这类边缘设备上搬,YOLO 导出 ONNX 再做 NPU 转换是另一套流程。毕设阶段尽量不要同时铺开,先把 PC 端这条链路跑完,边缘部署可以作为论文的展望部分。

6. 部署验证的正反例习惯:先让正常画面闭嘴,再让逆行画面报警

6.1 用正反例视频做系统验收

如果你正在找能直接跑起来的 YOLOv8 毕设资源,这套压缩包解压之后直接进下面的验收流程就行。拿到 best.pt 后先别急着开界面,准备两段视频:一段是扶梯正常上行、行人站立或随梯上行,另一段是有人从扶梯上往回走。先跑 Detection_video.py,把 conf 从 0.25 往上调到 0.35 再到 0.5,观察同一画面里误报框和漏检框的变化。验收标准只有一条:正常段全程零报警,逆行段在行人越过扶梯中线后很快触发报警。

6.2 界面联调时先锁参数

Visual_interface.py 本质上是把 Detection_video.py 的推理封装成按钮、文件选择和显示区域。联调时最容易出事的是界面线程和推理线程互相排队,画面卡住不动。我一般会在命令行先把 conf、模型路径、视频路径确认好,再进界面只动参数不动逻辑,避免一边调界面一边排查模型问题。

这套流程走完后,我对 YOLOv8 这类项目形成了一个固定习惯:模型表现「好」和「能验收」是两回事。每个新数据集、每次调参,我都强制走一遍「正常视频零报警、逆行视频必报警」的正反例验证,并把 conf 和报警延迟记到 README 末尾。以后换任何检测项目,我都先按这个步子来,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询