基于YOLOv8的跌倒检测毕设实战:从数据集构建到模型调优全流程 📅 发布时间:2026/8/27 1:57:25 👁 浏览次数: 简介计算机视觉中的目标检测技术在安全监护、智慧养老等领域有着广泛的应用空间。跌倒检测作为其中的典型场景不仅具有现实的社会价值也常被选为毕业设计课题。实现一个可靠的跌倒检测系统需要理解从数据到模型的完整链路数据集的采集与标注决定了效果上限YOLOv8的网络结构则提供了强大的特征提取与检测能力合理的训练与调优策略能让模型在真实场景中稳定工作。这个过程涵盖了数据工程、深度学习和工程化部署的核心知识适合作为入门计算机视觉项目来综合锻炼实践能力。本文以跌倒检测为例系统拆解了基于YOLOv8的目标检测项目从数据准备、环境配置、模型训练到性能优化与答辩展示的每一个环节帮助你构建一个可解释、可复现、可展示的完整系统。 “跌倒检测”这个题目可以说是计算机视觉毕业设计里的常青树。每年都有大量同学拿到这个题目然后第一反应就是去GitHub上翻开源项目下了一堆代码结果环境配了三天三夜训练出来的模型要么完全没法用要么连跑通的流程都没摸清楚。我见过太多人在这上面翻车最后预答辩前一周才慌慌张张找人说“学长我的模型效果特别差怎么办”。这篇文章想做的就是把这个毕设题目从头到尾拆开揉碎讲一遍。我默认你是有一点深度学习基础、但还没真正跑通过一个完整目标检测项目的状态。我会把整个项目拆成几个清晰的阶段技术选型、数据集构建、环境配置、模型训练、性能调优再到最后的源码整理与答辩准备。所有内容都是我在实际完成类似项目过程中验证过的做法不是把官方文档抄一遍给你看。1. 拿到“跌倒检测”毕设题我建议你先盘清楚这几件事1.1 这个题目到底想让你做什么跌倒检测在技术层面上可以被拆成两种完全不同的路线一种是基于姿态估计的跌倒判断一种是基于目标检测的跌倒识别。姿态估计路线通常用YOLOv8-pose或者OpenPose先提取人体骨骼关键点再利用关键点之间的几何关系比如人体中心点高度下降速度、躯干与地面的夹角、头部与脚部的相对位置变化来判断是否跌倒。这种方案的优势在于可解释性强答辩的时候你能清楚说出判断依据但劣势是端到端的pipeline比较复杂关键点提取的精度会直接影响后续判断的准确率。目标检测路线也就是本项目采用的方式直接把“跌倒”看作一个待检出的目标类别用目标检测模型在视频帧中框出“跌倒的人”和“正常的人”。这种方案实现简洁数据集相对好构建训练和推理链路短对刚接触深度学习的学生来说友好得多。毕业设计的核心是“你能完整讲清楚一个系统的所有环节”而不是追求天花板级的精度。所以我的明确建议是走目标检测路线直接基于YOLOv8训练一个“跌倒人”与“正常行走人”的二分类检测模型。这样你既能避开姿态估计里大量琐碎的后处理逻辑又能把整个训练流程做到可解释、可复现答辩时每个环节都有东西可讲。1.2 技术路线确定后工作量怎么分配很多同学做毕设最大的问题不是不会做而是不知道这个项目到底有多大的工程量导致时间分配严重失衡。按照我的经验一个中规中矩的跌倒检测毕设总工作量大概是这样一个比例数据集整理与标注30%环境配置与跑通官方训练脚本15%模型训练与参数调优25%验证与测试、效果展示15%论文撰写与答辩PPT准备15%数据集整理之所以占最大头是因为YOLOv8本身是一个训练框架它不关心你的业务场景是什么。你给它什么样的标注数据它就学会识别什么东西。所以你这个项目的效果天花板从你选好数据集那一刻就已经被决定了。与其在训练阶段反复调参不如在数据集阶段多花心思。另外一个容易被忽略的问题是算力。如果你的电脑只有CPU我不建议你直接训练YOLOv8——哪怕是最小的yolov8n模型仅CPU训练上几百个epoch也会让你怀疑人生。如果你没有NVIDIA显卡至少也要想办法用Google Colab的免费GPU或者租用云GPU服务器。这不算什么丢人的事情很多人做毕设都是这么过来的但千万别等到训练那天才想起来算力不够。1.3 答辩时的展示逻辑要从第一天就设计好这一点是我特别想强调的。毕业设计答辩和工程项目的评审逻辑完全不一样。工程上只看结果好不好用答辩的时候老师更看重你“有没有真正搞懂整个系统”。你得提前想清楚老师可能会问什么问题比如“为什么跌倒检测不用姿态估计而用目标检测”“你的模型在什么场景下会漏检”“数据集中跌倒样本和正常样本怎么保持均衡”“置信度阈值怎么选”——这些问题的起点都在于你对数据、模型、训练逻辑的理解而不是你代码跑出来的那几十个点的mAP。所以从做项目的第一天开始建议你养成记录实验日志的习惯用的是什么数据集、标注了多少张图、训练了多少轮、学习率是多少、最后的mAP50和mAP50-95分别是多少。这些记录不只是为了写论文更是让你在答辩时面对“你试过什么、踩过什么坑、最后怎么解决的”这类开放式问题时能直接说出真实经历。真实经历永远比背模板有说服力。2. 数据集这条主线公开资源、自建标注到目录组织2.1 公开数据集怎么选推荐三个含一个避坑跌倒检测这个方向不算冷门公开数据集其实不少。但选择数据集时有两个核心问题要搞清楚第一YOLO系列训练用的是目标检测格式的标注数据即每个目标对应一个类别和一个边界框坐标不是很多公开数据集里的分类标签或者姿态标签第二数据集的场景和你最终的展示场景尽量要一致。以下三个数据集我实测过按推荐程度排序第一个是Le2i Fall Detection Dataset。这是法国勃艮第大学提供的视频数据集包含多个室内场景家庭客厅、办公室、电梯间等每个场景的视频里都标注了跌倒发生的起止时间。这个数据集的优点是场景真实、跌倒动作发生得很自然缺点是原始标注不是目标检测框而是时间区间——你需要用视频抽帧的方式自己处理它。具体做法是把标注时间片段内的人体框画出来导出为YOLO格式。这个数据集非常适合做毕业设计因为它的场景就是日常生活环境训练出来的模型在答辩演示时有直观性。第二个是UR Fall Detection Dataset。这是土耳其一个大学做的数据集用Kinect摄像头拍摄包含RGB图像和深度图像30个受试者做了一系列日常活动和多种跌倒姿态。它的优点是标注精度高、动作类别丰富侧向跌倒、前向跌倒、后向跌倒等都有缺点是部分视频是深度图像在实际使用时要转成RGB通道或者使用深度图训练。第三个是一个我建议你谨慎使用的——URFD的纯图片版本或者网上流传的各种整理版本。这类数据集有一个致命问题很多发布时间较早图片分辨率较低而且YOLO格式的标注质量参差不齐经常出现框不准、漏标错标的情况。用这种数据集训练你会花大量时间在排查“为什么loss降不下去”上最后发现是数据标注本身出了问题。我在实际训练中还发现一个问题直接用别人的标注结果会导致你对数据分布完全没感觉。比如跌倒这个类别里跌倒姿态有仰面、侧身、趴着等多种情况如果某个姿态在训练集中占比极低模型对这个姿态的检测能力就会很差。这个只有你自己看过数据、动手处理过才能在答辩中应对老师关于“你的模型为什么对侧向跌倒检测效果不佳”这类问题。2.2 标注工具与YOLO格式的转换逻辑说到标注这是整个项目里最容易被低估的一环。很多同学拿现成的数据集而现成数据集不一定恰好标注成YOLO格式。所以你至少得会两件事用标注工具自己标一些数据以及写脚本做格式转换。标注工具推荐 labelImg 它至今仍是目标检测标注里最顺手、部署最简单的工具支持直接导出YOLO格式。启动方式很简单pip install labelImg labelImg打开后设置“Open Dir”指定你的图片文件夹“Change Save Dir”指定标注输出文件夹然后在主界面选择YOLO模式界面右侧有PascalVOC和YOLO两种格式选项。标注的时候按住鼠标左键拖出框弹出对话框里输入类别名称即可。需要用到的类别一开始就定义好比如fall和normal两类不要标到后面再改否则所有标注文件里的类别id都要重新映射很麻烦。自己标注有一个很实用的小技巧不要逐帧标注视频连续帧而是每隔5~10帧抽一帧标注。相邻帧之间的人体位置变化很小标注出来的框几乎一样不仅浪费时间还会让训练集高度冗余。每隔几帧抽一帧可以在不损失有效信息的前提下让数据集多样性更高。YOLO格式的标注文件有一个统一的规范每张图片对应一个同名的txt文件txt文件的每一行代表一个目标格式为class_id x_center y_center width height注意这四个坐标值都是相对于图片宽高的归一化值范围0~1不是像素值。如果你拿到了一个VOC格式XML标签的数据集转成YOLO格式的核心逻辑是根据XML里的bndbox节点计算中心坐标和宽高再分别除以图片宽度和高度。这类转换脚本在网上有很多但要自己看懂它每一步在干什么这对你后续排查标注问题时非常重要。2.3 目录结构一个不出错的标准组织方式训练YOLOv8时你不需要把数据集放在某个强制目录里而是通过一个数据集配置文件data.yaml告诉框架你的图片和标签在哪里。我推荐的目录组织方式是fall_detect_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 ├── labels/ │ ├── train/ # 训练集标注文件txt │ └── val/ # 验证集标注文件txt └── data.yaml # 数据集配置data.yaml的内容大概长这样path: /path/to/fall_detect_dataset # 数据集根目录绝对路径 train: images/train val: images/val nc: 2 names: [fall, normal]这里有几个容易出问题的细节要提醒路径问题。path字段建议写绝对路径尤其是你在不同机器之间迁移项目时相对路径往往会带来莫名其妙的“File not found”错误。如果用了绝对路径换机器时只需要改这一处。图片和标签必须同名。一张叫img_001.jpg的图片它的标签文件必须叫img_001.txt且两个文件所在目录相对路径结构一致。YOLOv8训练时会根据图片路径去寻找对应的txt文件。如果有图片没有对应标注文件你需要在数据清洗阶段处理掉YOLOv8默认会跳过没有标签的图片但会给出一堆warning影响你判断数据集是否真的构建正确。类别数量要仔细核对。nc是类别数量names是类别名称列表。这两个值写错了训练会直接无法启动报错信息还不一定直观。经验是每次配置完data.yaml后先写一个几行的小脚本遍历一下标签文件看看最大类别id是否等于nc-1——因为id从0开始如果你的类别只有fall和normal两类id只能是0和1如果出现2说明标注文件里有类别编号越界。2.4 数据划分与增强保证有效性的两个实操习惯数据集划分上我的习惯是训练集、验证集按照8:2或者9:1切分。验证集不需要太大但一定要保证验证集里包含了所有可能的场景类别。一种很常见的错误是随机划分时不看数据来源导致同一个视频连续帧被同时分到了训练集和验证集。这种“泄漏”会让你的验证集loss看起来很低但实际部署时效果崩掉因为模型其实已经“见过”验证集的画面了。正确的做法是按视频维度划分同一个视频的帧要么全部进训练集要么全部进验证集而不是逐帧随机打散。数据增强方面YOLOv8本身内置了丰富的增强策略马赛克、随机仿射变换、HSV色域增强等训练时默认开启。这个内置增强已经很强了你不需要额外写复杂的增强代码。真正值得自己做的增强是基于业务场景的跌倒检测最常见的误检场景是“蹲下”被当成了“跌倒”所以你可以收集一些蹲下、弯腰、坐下这种“疑似跌倒但不算跌倒”的负样本标注为normal类别这比任何代码层面的增强都更有效。3. YOLOv8的训练环境与网络结构一次讲透3.1 环境配置版本别乱装照着这个来环境配置是这个项目里最磨人但没有技术含量的一关。很多人卡在这里不是因为不会而是因为版本不兼容。我建议的安装顺序是先装CUDA和cuDNN再装PyTorch最后装Ultralytics。因为YOLOv8是建立在Ultralytics这个库之上的而Ultralytics会依赖PyTorch。以目前最常用的组合为例# 创建虚拟环境Python版本建议3.9或3.10 conda create -n yolov8 python3.10 -y conda activate yolov8 # 安装PyTorch这里以CUDA 11.8为例根据你自己的显卡驱动版本调整 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装ultralytics pip install ultralytics安装完成后务必做一个验证确认PyTorch真的能用GPUimport torch print(torch.__version__) print(torch.cuda.is_available()) # True才说明GPU可用 print(torch.cuda.get_device_name(0))如果torch.cuda.is_available()返回False不要急着往下走大概率是PyTorch版本和你CUDA驱动不匹配。一个常见原因是你的显卡驱动版本太老不支持新的CUDA工具箱。这种情况可以到NVIDIA官网查一下你的显卡驱动支持的CUDA版本然后选择对应的PyTorch版本。热搜词里看到有人问“pytorch2.13支持yolov8吗”——Ultralytics对PyTorch版本的兼容性做得很好只要你用的不是特别冷门的版本一般都没问题。如果安装的是最新的PyTorch对应安装最新的ultralytics就对了。真正容易出问题的是PyTorch和CUDA之间的匹配这个权重最高。另外一个和显卡相关的常见疑问是GTX 1660 Ti跑得动YOLOv8吗这个问题我实测过。GTX 1660 Ti是6GB显存的图灵架构显卡跑yolov8n和yolov8s都完全没问题训练batch size调到8~16都可以跑yolov8m会有点紧张但通过调低输入分辨率、减小batch size也能跑起来。如果你用的是这类6GB左右显存的卡建议首选yolov8n或yolov8s不要一上来就冲着yolov8x去那会让训练时间无限拉长。3.2 YOLOv8网络结构里哪些是你答辩时要能讲清楚的既然做这个毕设你至少要对YOLOv8的网络结构有一个基本认知不然答辩时老师问一句“YOLOv8相比YOLOv5改进在哪里”你就卡住了。YOLOv8的整个网络结构可以粗分为三段Backbone、Neck、Head。Backbone主干网络负责从输入图片中提取特征。YOLOv8的Backbone结构沿用了CSPDarknet的思想也就是通过跨阶段局部连接来减少计算量、增强梯度传播。在此基础上YOLOv8把原来的C3模块换成了C2f模块。C2f模块的特点是在输入经过一个卷积之后把特征图分成多个分支每个分支通过若干个Bottleneck模块处理最后再把所有分支的特征拼接起来做融合。这样做的好处是在同样计算量下梯度流向更丰富各层特征复用更充分对小目标的特征提取能力更强。Neck特征融合层YOLOv8用了类似PAN-FPN的结构。PAN的意思是Path Aggregation Network它做的事情是“自顶向下传递语义信息、自底向上传递位置信息”两条路径并行再通过拼接方式融合不同尺度的特征图。YOLOv8在Neck部分也用了C2f模块确保多尺度特征在融合时信息损失更小。你可以这样理解Backbone负责从一张图里提炼出不同尺度的特征Neck负责把这些特征“拼”成一个统一的表示让Head能同时检测不同大小的目标。Head检测头YOLOv8把分类和回归分支彻底解耦使用了解耦检测头的结构。和YOLOv5的耦合检测头一个卷积同时输出类别概率和边界框坐标相比YOLOv8用两条并行的卷积分支分别输出类别预测和边界框预测而且分类分支用Binary Cross Entropy二分类交叉熵而非多分类Softmax。Head部分的另一个重要变化是去掉了Objectness分支。在YOLOv5里每个候选框都会额外输出一个“这个框里有没有物体”的置信度YOLOv8认为这个分支对最终结果的贡献有限直接去掉可以简化结构、减少参数量。代价是框的置信度主要由分类置信度替代。讲清楚这些结构细节不仅是为了答辩也对理解训练过程有帮助。比如你去调anchor相关的参数就会发现YOLOv8已经变成了Anchor-Free的设计不再需要预设anchor的尺寸和数量了。这也意味着你不需要像YOLOv5时代那样去针对自己数据集做anchor聚类分析这一步省掉了。3.3 用官方预训练模型还是从头训我的建议很明确我给大多数人的建议是用YOLOv8官方提供的COCO预训练权重作为起点然后在你自己的跌倒检测数据集上做微调。原因很简单COCO数据集有80类目标其中包含了person类。预训练权重里的Backbone已经学会了人类身体形状、边缘纹理等通用特征这些特征对你的跌倒检测任务是直接有用的。在这个基础上微调可以让模型用很少的轮次就收敛到不错的效果而且不容易过拟合。在Ultralytics的框架里最简单的做法就是在训练命令里指定预训练权重yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch16如果你指定modelyolov8n.pt它会自动下载这个预训练权重并在它的基础上继续训练。如果你指定modelyolov8n.yaml它会从头开始训练一个随机初始化的模型——这在你数据量不大的情况下效果通常明显更差训练时间也更长。所以不要从头训练用预训练权重是你最稳妥的选择。预训练权重里还有一个值得说的点因为你只训练两个类别fall和normal但COCO预训练权的输出层是80类所以Ultralytics在加载预训练权重时会自动把最后一层检测头的类别数从80改成2并随机初始化这一层的参数。这意味着模型前面所有层都继承到了COCO上学习到的通用特征只有最后输出层需要从头学习。这正是微调背后的逻辑也解释了为什么微调只需要很少的数据就能有不错的表现。4. 训练参数、损失曲线调优与性能提升的实操记录4.1 第一次训练前这些超参数必须弄明白训练YOLOv8时你会遇到一批超参数它们对结果的影响权重差异很大。我按重要程度排序给你过一遍imgsz输入分辨率YOLOv8训练时输入图像会被缩放到这个尺寸。默认是640一般不要低于640因为分辨率越低小目标的检测效果越差跌倒的人如果离摄像头远在图像里可能只占很小区域分辨率不够就会漏检。显存不够时可以通过降低batch size来迁就而不是盲目调低imgsz。batch批量大小指每次迭代输入多少张图片。显存足够的情况下尽量大一点因为更大的batch能让梯度估计更稳定。6GB显存跑yolov8nbatch16通常没问题如果你用的显卡只有4GB把batch降到8甚至4。epochs训练轮数这个参数要看你的数据集规模。数据集在几千张级别时100~150个epoch基本足够如果只有几百张图训练轮数要适当增加同时配合早停机制防止过拟合。lr学习率Ultralytics默认使用了余弦退火学习率调度策略初始学习率默认是0.01。在大多数情况下默认的学习率策略表现就不错不建议新手大改。如果你发现loss震荡很厉害可以尝试把初始学习率调低到0.001。patience早停耐心值这是Ultralytics里一个特别重要的参数。它表示如果连续多少个epoch验证集指标没有提升训练就提前终止。默认值是50我的习惯是设成30。早停不是偷懒是防止模型在训练集上无限拟合。如果你设了这个参数训练过程会在某个epoch自动停止这时不要慌张这恰恰说明模型的验证集性能已经到了一个平台期。一个完整可用的训练命令是这样的yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch16 patience30 projectfall_detection nameexp1project和name用来指定训练结果保存路径。训练结束后Ultralytics会在fall_detection/exp1/目录下保存有权重文件、参数配置、训练曲线图、验证结果等文件。其中best.pt是验证集上表现最好的权重last.pt是最后一次epoch的权重。日常使用请认准best.pt。4.2 损失曲线怎么看别一上来就看懵了训练完成后Ultralytics会自动生成results.png文件里面画了多条曲线train/box_loss、train/cls_loss、train/dfl_loss、val/box_loss、val/cls_loss、val/dfl_loss以及metrics/precision、metrics/recall、metrics/mAP50、metrics/mAP50-95。热词里“yolov8画损失函数曲线图”问的就是这个你完全不需要自己画框架已经给你画好了。看这些曲线的正确姿势是这样的看收敛趋势不看绝对数值。train/box_loss和val/box_loss应该随着epoch增加整体下降然后进入一个平台期。如果val损失在下降后开始明显回升而train损失还在继续下降这就是典型的过拟合信号——模型开始机械记忆训练样本而不是学习泛化规律。此时如果你设了早停训练已经自动中止了如果没有你就该考虑减少epoch数量或者增加数据增强。mAP50和mAP50-95是两个不同维度的指标。mAP50是IoU阈值为0.5时的平均精度均值它衡量的是模型“大概框准了没有”mAP50-95是在0.5到0.95多个IoU阈值下的平均值它对边界框的精确度要求更高。对跌倒检测这个项目来说mAP50是主要参考指标因为对安全监护类任务来说检出跌倒事件比把框标得特别精准更重要。但如果你mAP50很高、mAP50-95很低说明模型存在“框的位置不稳定”的问题这对后续还要做摔倒事件精确分析的应用有影响。留意曲线的跳变。训练曲线如果出现异常跳点往往意味着数据中有脏样本标注框画错、类别错标等或者batch size太小导致梯度不稳定。这时候先去检查数据不要急着调模型结构。4.3 效果不好时按这个顺序排查实测下来训练完的效果不好绝大多数情况不是模型的问题而是数据和配置的问题。我总结了三个排查优先级第一个排查点训练集是否足够且均衡。如果你的数据集里normal样本是fall样本的10倍模型会严重偏向正常人的检测。每个类别最少要有几百张图像而且各类别数量不要差出5倍以上。如果确实样本不均衡建议用数据增强或者对少样本类别做过采样不要指望模型自己适应。第二个排查点数据标注质量。这是最常见也最要命的问题。标注框框住的是人的全身还是只有上半身跌倒时人和地面接触物是否被框进去这些不一致会让模型在学到一半时“很困惑”。你可以用一个简单方法快速检查训练完用模型在训练集上进行验证如果模型在训练集上的mAP都很低几乎可以肯定标注有问题。因为模型如果连“背过的题”都做不对一定是题目本身就错了。第三个排查点训练配置是否合理。比如imgsz设置得太小比如320会让小尺寸的目标信息大量丢失或者学习率设得太高导致loss一直不下降。一般来说前两个排查点只要处理好了默认配置的训练结果都不会差到哪去。4.4 想锦上添花这几个改进思路可以写进论文里如果你的项目做完了基础版本想进一步提升或让论文更有亮点可以在现有基础上做几个“小而稳”的改进。这些改进都是目标检测领域公认有效的方向注意力机制嵌入。在YOLOv8的Backbone后面或Neck部分加入SESqueeze-and-Excitation模块或者CBAM模块让模型在通道维度和空间维度上更关注有效特征。这类改动代码量不大但在遮挡场景下比如跌倒时身体被桌椅部分遮挡往往能有几个点的提升。Ultralytics官方代码里提供了多种注意力模块的嵌入方式网上也有大量实现参考。小目标检测层优化。YOLOv8提供的检测头输出有三个尺度分别是下采样8倍、16倍、32倍的特征图。如果你发现视频里远处的人跌倒后目标框特别小、经常漏检可以考虑增加一个更高分辨率的检测头下采样4倍专门检测小目标。做法是在Neck部分把浅层特征图接入检测头同时把模型结构配置中的检测头数量从3个调整为4个。这个改动会增大计算量但小目标检出率会有明显提升。模型融合。简单来说就是把多个模型的预测结果做加权合并——比如把yolov8n和yolov8s两个模型的输出结果做NMS合并或者把不同epoch的权重做Weighted Boxes FusionWBF。这个技巧在竞赛中很常用用在毕设里也能有效提升最终精度。实操要义是两个模型的差异越大比如训练数据增强策略、初始权重不同融合的效果越好完全相同的模型融合是没意义的。从我的经验来说如果时间有限优先做注意力机制改进如果时间充裕可以再加上模型融合。这两个方向逻辑清晰、代码改动有限论文里也很容易展开讲述。5. 源码工程化整理与最后三个高频坑位5.1 源码结构怎么组织才能让答辩老师觉得你“有工程素养”很多人的毕设源码是这样的一个训练脚本、一个训练日志文件夹、一堆权重文件全堆在同一个目录里。答辩时老师打开你的代码第一印象就不太好。不管你的代码本身写得怎么样至少要有一个清晰的目录结构。我推荐的最小可用结构如下fall_detection_project/ ├── data/ │ ├── dataset/ # 数据集images/labels/data.yaml │ ├── split_data.py # 数据集划分脚本 │ └── check_labels.py # 标签检查脚本 ├── models/ │ └── train.py # 训练入口封装yolo命令或调用ultralytics API ├── weights/ # 训练得到的best.pt等权重文件 ├── scripts/ │ ├── detect_video.py # 对视频做推理检测 │ ├── detect_image.py # 对图片做推理检测 │ └── export_onnx.py # 导出ONNX可选 ├── requirements.txt └── README.md不需要多高级但要做到每个文件“看名字就知道干什么”。README.md一定要写清楚项目的环境要求、数据集说明来源、类别、规模、训练命令、推理命令。永远不要低估README的作用——答辩时老师通常会先打开README如果写得清晰他心里对你的评分就会上一个台阶。训练入口建议不要直接敲命令行而是写成一个Python脚本。这样做的好处是你可以把训练参数集中管理并且在训练结束后自动打印出模型在验证集上的指标from ultralytics import YOLO model YOLO(yolov8n.pt) results model.train( datadata/dataset/data.yaml, epochs100, imgsz640, batch16, patience30, projectweights, namefall_detect_exp ) # 训练结束后自动加载best.pt并验证 best_model YOLO(weights/fall_detect_exp/weights/best.pt) metrics best_model.val(datadata/dataset/data.yaml) print(fmAP50: {metrics.box.map50:.4f}) print(fmAP50-95: {metrics.box.map:.4f})推理脚本用YOLOv8做视频检测也很简单核心就几行from ultralytics import YOLO model YOLO(weights/fall_detect_exp/weights/best.pt) results model.predict(test_video.mp4, conf0.5, saveTrue)saveTrue会把检测后的标注视频存下来。这个视频是答辩演示时最直接的素材一定不要删。5.2 三个高频坑位标注格式、显存不够、视频推理卡顿在这里把项目里最容易踩的三个坑位整理成一张排查表每一个我都踩过不想你再花几天时间重走一遍。症状根本原因快速解决方法训练时提示AssertionError: class 2 in labels not in class names标签文件里存在类别id越界标注时类别编号和data.yaml不匹配写一个脚本遍历所有label文件统计最大类别id然后统一修正训练一段时间后显存溢出CUDA out of memory6GB以下显存跑yolov8s以上模型、batch设太大、或者开了过多的workers把batch降到8或4换yolov8n降低imgsz到480把workers设置为0推理视频时每帧都很卡顿FPS非常低模型太大、CPU推理、或者视频分辨率过高未做缩放换yolov8n.pt加device0参数强制用GPU对视频帧做个缩放预处理显存不足这个坑很多人第一次遇到时会特别慌。我实测过GTX 1660 Ti 6GB跑yolov8nimgsz640batch16是可以正常训练的但要换yolov8s时batch就必须降到8不然就会报CUDA out of memory。如果你用的是4GB显存的笔记本显卡建议直接batch4加workers0虽然训练时间会变长但至少不会训练到一半崩掉。5.3 最后的准备权重文件导出与答辩演示素材训练出一个效果满意的模型之后还剩下两件重要的事导出模型用于展示以及录制一份完整的演示素材。如果你希望在答辩现场做实时演示建议把模型导出成ONNX格式它不依赖PyTorch环境部署更轻量。Ultralytics也支持直接导出yolo export modelweights/fall_detect_exp/weights/best.pt formatonnx imgsz640导出ONNX后的推理可以使用ONNX Runtime推理速度在CPU上也比原版PyTorch快不少。如果你对嵌入式部署感兴趣YOLOv8还支持导出成NCNN、TensorRT等格式这一块写到论文的“后续展望”里也是一个加分点。答辩演示素材我建议准备两份一份是静态图片检测效果挑几张不同场景晴天室内、电梯间、走廊的图片让模型分别框出fall和normal另一份是视频检测效果把模型跑在一段包含正常行走和跌倒的视频上输出处理后的视频文件。这两份素材在PPT里的展示效果远好于一堆数字和表格。视频素材最好选一个和你训练集场景不完全相同的视频这样如果模型表现依然良好就是泛化能力的最好证明。做这个项目的过程中我个人最大的体会是跌倒检测这个题目本身不惊艳但它覆盖了一个计算机视觉毕业设计应该包含的所有核心环节——数据采集与标注、模型选型与训练、效果评估与调优、工程化交付。如果你认认真真走完这一整套流程答辩时被问到任何流程细节你都能给出真实且具体的回答那这个毕设就已经合格了。希望这份流程拆解能让你少走一些我走过的弯路把时间花在真正值得钻研的调优和分析上。本文还有配套的精品资源点击获取