资讯动态

基于YOLOv8的行人跌倒检测系统:训练、推理与界面实战

发布时间:2026/10/19 16:33:02 来源:尧图企业网站定制
做视觉检测这几年我最大的感受就是“训练集里跑得再漂亮的模型落到真实的监护场景里总会被各种奇怪的姿势教做人”。行人跌倒检测这个方向尤其典型摔倒的瞬间动作极快、人体姿态剧烈变化有时候半个身子被桌角挡住有时候老人跌倒后静止躺着和正常睡觉、休息从画面上看几乎没有区别。这套基于YOLOv8深度学习的行人跌倒检测系统把“数据集、训练、推理、可视化界面”整条链路都串起来了适合正在做相关课题、参加比赛或者想快速搭建一套监护Demo的开发者参考。这套系统要解决的问题很直接从监控画面或摄像头画面中实时检测出“人”这个目标并在此基础上判断这个人是否正在发生跌倒一旦判定为跌倒界面立刻告警、截图存档。它不只是一个训练好的权重文件而是从数据标注规范、训练配置、推理脚本到界面交互的完整工程。无论你是第一次接触YOLOv8还是已经训练过几个模型但卡在界面集成上这篇文章里的思路和踩坑记录应该都能帮你省下不少时间。1. 项目是什么为什么值得做1.1 跌倒检测的本质难点在哪里传统监控摄像头解决的是“事后查证”而跌倒检测要的是“事中发现”。人在跌倒过程中伴随的是身体中心点快速下移、目标框宽高比剧烈变化、姿态从直立变成水平或者蜷缩。这几件事在单帧画面上互相组合很容易和弯腰、蹲下、坐下、躺下休息这些日常动作混淆。如果只把跌倒当成一个普通的目标类别交给模型学习模型大概率学到的是“躺在地上的人等于跌倒”这样会漏掉大量正在发生的危险动作也会把正常的午睡误报成跌倒。所以这个项目虽然核心网络是YOLOv8但真正的价值在检测之后的判定逻辑。利用连续多帧的信息把单帧检测框演化成行为判据才能区分“正在跌倒”和“已经躺好”的区别。这是整个系统里最核心、也最需要耐心调校的部分。1.2 为什么选YOLOv8而不是其他检测模型单论单帧目标检测精度YOLOv8并不是唯一选择但它可能是这批模型里工程上最顺手的。模型从nano到large各有规格官方Python库直接支持训练、验证和导出不需要自己搭一套训练框架。网络结构上用了C2f模块和anchor-free检测头加上训练时内置了mosaic等数据增强策略对姿态变化敏感、目标尺度不一的跌倒场景表现比前代模型更稳。相比之下两阶段的检测模型精度并不差但推理速度和部署成本在实时监控场景里明显吃亏面对多路视频流时更加明显。如果你手头只有CPU或者嵌入式设备YOLOv8的nano、small规格也可以选后面我会给出不同体型的取舍建议。综合来看YOLOv8是一个精度、速度、工程效率都比较平衡的选择。1.3 系统整体架构梳理这一整套系统可以拆成四条链路理解清楚之后所有后续工作都是往这四条链路里填肉数据链路拿到原始视频后抽帧、筛选、标注划分训练集和验证集。训练链路编写数据集配置文件选择预训练权重训练出能检测person和fall两个类别的模型。推理链路加载训练好的模型对视频帧做检测输出目标框和置信度再叠加连续帧状态来判定跌倒行为。界面链路用PyQt5做窗口程序接入本地视频、摄像头和图片三种输入源实时显示检测结果、告警信息和FPS。如果你是用来做课题或者演示不需要搭服务器一台带独立显卡的电脑就能跑完整条流程。训练好的模型可以导出成ONNX等格式后续想迁移到监控盒子上也比较方便。2. 数据集构建与预处理2.1 数据从哪里来怎么处理跌倒检测数据集不像COCO那种通用目标检测数据集那么容易找到。目前能直接用的公开数据主要是Le2i这类跌倒检测数据集特点是场景相对固定、动作类型比较全但分辨率普遍不高光照和视角单一。所以实际项目里我会把这些公开集当作底料再补充一些自录视频和网络上的公开演示视频抽帧重点补充“跌倒瞬间”“跌倒后侧躺”“跌倒后俯卧”这些容易漏检的动作片段。自己补数据时抽帧密度很关键。一个跌倒动作可能只持续半秒左右如果按每秒抽一帧来采样很容易错过真正关键的过渡姿态。我的做法是正常行走、站立、坐着这类日常动作每隔几秒抽一帧跌倒过程帧尽量全部保留。这样能保证数据集中“跌倒”的样本不只是倒地后的结果状态也有动作发生中的过程状态模型才能学到趋势而不是死记一个姿势。2.2 标注规范和目录结构YOLOv8训练用的标签是txt文件每一行表示一个目标格式是类别id 中心点x 中心点y 目标宽 目标高坐标全部归一化到0到1之间写标签的时候要注意不要出现负数或大于1的越界值。项目里一般建两个类别0表示person1表示fall。这里有一个非常关键的个人经验站立的人不要标成fall但也不要只标“完全倒地”的帧。身体倾斜超过一定角度、膝盖着地但上身还没完全贴地这些中间状态都应该标成fall。否则模型只认识“躺平”的结果认不出“正在倒下”的瞬间。目录结构建议直接按官方习惯来datasets/FallDataset/ images/train/ images/val/ images/test/ labels/train/ labels/val/ labels/test/标注工具可以选择LabelImg这类常见工具导出时注意选择YOLO格式不要存成VOC的xml格式虽然官方库支持转换但多一步转换就多一个出错的可能。2.3 跌倒场景的数据增强策略数据增强这块和通用检测任务不太一样需要针对场景做调整。mosaic拼接增强对提升小目标检测很有帮助在这个项目里人体在画面中的占比通常不会太小所以mosaic可以开但建议训练后期关掉让模型最后适应正常的图像分布。随机翻转可以用跌倒动作左右对称但如果你采集的数据里有“从左侧摔倒”和“从右侧摔倒”语义不同的情况翻转会引入噪声这一点在医疗监护场景要特别谨慎。HSV扰动、随机亮度和对比度调整可以适当加大因为真实监控场景的光照变化非常频繁室内日光灯和自然光的色温差异也会影响模型表现。我自己做的时候喜欢在增强里加一点高斯模糊用来模拟摄像头失焦或者运动拖影这对提升真实场景鲁棒性有帮助。2.4 类别不平衡怎么办数据量上正常行走、站立、坐下这些日常动作的样本数往往会比跌倒样本多很多。跌倒样本少模型容易倾向于把所有目标都预测成person。处理办法有几种第一跌倒样本单独多采样利用视频连续帧生成更多样本第二给fall类别在损失计算中更高的权重第三做针对性的增强比如小幅旋转、局部遮挡、添加模糊效果。实际训练里我建议先调类别权重观察验证集mAP变化不要一上来就疯狂加样本不然后期排查问题时会很难定位瓶颈。3. 模型训练实战3.1 环境准备训练环境推荐直接用YOLOv8官方Python库。依赖主要是PyTorch和库本体。安装PyTorch的时候建议到官网按自己的CUDA版本选择安装命令不要用默认pip源乱装很容易装到CPU版本训练速度差出一个数量级。基础环境大概是Python 3.8以上、PyTorch 1.8以上GPU版建议2.0以上CUDA和cuDNN对应显卡驱动装好。库本体直接pip安装就行OpenCV这类依赖库一般会自动带上。3.2 训练配置文件怎么写训练前要准备一个YAML文件告诉训练脚本数据在哪、类别有哪些path: datasets/FallDataset train: images/train val: images/val test: images/test names: 0: person 1: fallpath的路径要写对相对路径是相对于当前工作目录也可以直接写绝对路径。训练时报找不到数据集大多数情况就是这里配置错了。如果显存不大保持640的输入尺寸就好强行提高分辨率会让显存占用迅速飙升。3.3 超参数选择与训练命令模型选择上YOLOv8n是nano版适合嵌入式和高帧率场景精度会低一些YOLOv8s是small版最推荐的折中方案如果对精度要求高并且显卡足够可以换medium甚至large。第一次跑项目建议直接从s开始训练时间可控结果也够说明问题。实际训练命令可以这样写yolo detect train \ datafall_dataset.yaml \ modelyolov8s.pt \ epochs120 \ imgsz640 \ batch16 \ device0 \ patience20 \ cacheTrue几个关键参数展开说一下。epochs建议至少100轮太少学不到跌倒动作的细节batch要根据显存调整出现OOM就把batch减半patience是早停参数连续多少轮验证集指标不提升就提前结束能省时间但不要设置太小模型还没收敛就被掐断反而浪费时间cacheTrue可以把图片缓存进内存加速训练内存不够的时候不要开。如果训练中途断了重新执行同样的命令官方库会读取最近的权重从断点继续训练这个特性比较省心。3.4 训练过程监控与结果解读训练启动后控制台会定期打印loss值和mAP指标。重点看几个关键数值box_loss代表框回归误差应该随着epoch逐渐下降cls_loss代表分类误差mAP50-95是综合指标比mAP50更严格能反映框的贴合程度。如果loss下降特别慢先怀疑学习率如果loss在某个epoch突然跳高大多数情况是数据里混入了异常样本不是网络本身的问题。训练结束后会在runs/detect/目录下生成权重文件、混淆矩阵、曲线图。混淆矩阵对跌倒检测特别重要它直接告诉我们模型是不是把大量person预测成了fall或者反过来。这两个类别边界本来就模糊看到混淆矩阵交叉值偏高先不要急着加轮数应该回去检查训练集图片找那些标注有争议的样本。3.5 模型导出与格式选择训练完成的best.pt可以直接用Python加载推理但推荐导出成ONNX格式在CPU上的推理效率一般会更好yolo export modelruns/detect/train/weights/best.pt formatonnx dynamicTrue导出成ONNX后可以继续转成OpenVINO、TensorRT等平台需要的格式方便后续迁移部署。注意导出后的模型去掉了NMS后处理逻辑需要在推理脚本里自己处理非极大值抑制这一步比较容易踩坑后面章节会细说。4. 推理与跌倒判定逻辑4.1 单帧检测流程推理阶段加载模型后对每一帧做一次前向计算。流程是读取图像、缩放或者letterbox到模型要求的尺寸、归一化、送入网络、得到预测框类别和置信度、再做NMS去掉重叠框。官方库封装了大量逻辑自己写推理脚本时可以直接用封装好的预测接口。这里有个容易忽视的细节监控画面分辨率往往比较大直接把整帧塞进模型会拖慢速度。更好的做法是把帧缩放到固定尺寸并保持宽高比四周填充灰色边等预测结果出来后再把框坐标映射回原图分辨率。映射的时候缩放系数要按letterbox的实际比例算很多人做完检测发现框对不上画面十有八九就是这里处理错了。4.2 从“检测到目标”到“判定为跌倒”这是整个系统最关键的部分。单帧模型只能告诉你“这个框是人”、“那个框是跌倒姿态”但它没法告诉你“这个人正在跌倒”。因为人在画面里是连续运动的跌倒是一个过程单帧模型单独判出fall类别的某一帧可能只是这个人弯腰捡东西。所以要通过连续帧的特征来判断。我用的特征主要有三个目标类别切换检测类别从person变成了fall。目标框宽高比变化直立时框的宽高比一般小于0.6跌倒后往往大于1宽高比从低到高突变说明姿态剧变。目标中心点位移摔倒瞬间中心点会快速向下移动移动速度比正常行走姿势变化快很多。这三个特征都不需要额外模型计算量很小。但任何一个单一条件都不可靠有人下楼梯时中心点也会快速下降有人蹲下捡东西宽高比也会变化。所以我的判定逻辑是多条规则加权再配合连续帧确认用来减少瞬时误报。4.3 一个可以直接落地的判定思路这里给一个最简单的实现思路不涉及复杂状态机。对每个目标对象维护一个最近若干帧的检测状态列表包含每一帧的类别、框中心坐标、框宽高比。当连续几帧满足以下条件时触发告警当前帧类别是fall或者宽高比超过阈值中心点相对前一帧向下移动的距离超过设定阈值上述条件连续满足至少3到5帧。条件里的“向下移动”需要先做坐标尺度统一否则不同分辨率下阈值不通用。触发之后可以设置一个冷却时间比如60秒内不重复告警同一个对象避免一次跌倒触发几十次报警。tracker_info {} alert_interval 60 # seconds def judge_fall(track_id, cls, cx, cy, ratio, frame_time): now frame_time if track_id not in tracker_info: tracker_info[track_id] [] history tracker_info[track_id] history.append((now, cls, cx, cy, ratio)) history [x for x in history if now - x[0] 1.0] tracker_info[track_id] history if len(history) 5: return False fall_frames sum(1 for x in history if x[1] 1 or x[4] 1.2) cy_start history[0][3] cy_current history[-1][3] if fall_frames 3 and cy_current - cy_start 0.15: return True return False这段代码只演示了核心逻辑没有处理遮挡和跟踪ID切换。真正落到工程里建议用ByteTrack或者简单的IOU匹配来维持ID稳定否则同一个人的ID频繁跳变历史数据就会断掉判定逻辑也就失效了。4.4 误检规避的核心心得很多实际场景里模型会把“躺床上”“坐轮椅”“蹲下抱小孩”判成跌倒。我在项目中总结了几条实用思路。第一结合运动历史正常运行的人忽然跌倒其中心点会有一个明显的先下移后停滞的过程而静止躺卧的人没有这个突变过程这个差异可以用来过滤掉大量静态误报。第二结合目标身份如果画面里同一个ID连续一段时间没有发生大位移就算检测到fall也不立即触发告警因为跌倒后的人通常不再大幅移动但这个条件只作为兜底不能作为主判据。第三引入姿态估计算法做二次确认比如检测到髋关节和足部位置关系异常再配合目标检测结果一起判断精度会更高但会明显增加算力开销适合对准确率要求更高的场景。5. 可视化界面设计与实现5.1 界面技术选型可视化界面是这套系统的门面。我选了PyQt5原因很简单一方面它能方便地在画面上叠加检测框、写中文按钮、弹窗告警另一方面用QThread处理视频流和模型推理可以在不阻塞主界面的情况下实时刷新画面。如果只是为了快速演示Tkinter也能用但界面比较简陋交互不顺手Web方案要额外维护一个本地服务每次打开浏览器操作对单机演示项目来说偏重。界面整体布局建议分成三块左侧是视频显示区域右侧是参数与日志区域底部是输入源切换和启动停止按钮。这个布局演示起来直观也给后续加功能留了空间。5.2 多线程与实时画面刷新PyQt5里最忌讳在UI主线程里跑耗时的模型推理界面会直接卡死。正确做法是单独建一个工作线程在线程里循环读取帧、推理、画框然后把处理好的图像转成QImage通过信号发回主线程显示。核心结构长这样class Worker(QThread): frame_signal pyqtSignal(QImage) alert_signal pyqtSignal(str) def run(self): cap cv2.VideoCapture(self.source) while self.running: ret, frame cap.read() if not ret: break results model(frame) frame draw_results(frame, results) rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) h, w, ch rgb.shape img QImage(rgb.data, w, h, ch * w, QImage.Format_RGB888) self.frame_signal.emit(img)注意摄像头输入时cap.read()是阻塞的摄像头掉线会一直卡住所以最好加上超时判断。实际项目里一个不到500行的界面文件就能完成视频显示、告警提示、截图保存、日志输出这些功能维护起来也很方便。5.3 功能模块拆解我给界面分了几个核心功能模块。输入源选择模块支持本地视频、RTSP摄像头、USB摄像头和单张图片四种输入方式参数面板显示当前FPS、模型推理耗时和告警次数同时提供置信度阈值和宽高比阈值的滑动条方便演示时实时调整日志区记录每次告警的时间、目标ID和截图路径底部按钮负责开始、暂停和退出。这个功能集合对课题演示已经够用。在此基础上可以扩展远程通知模块比如接口推送告警消息或者把告警截图上传到指定服务器。不过凡是涉及网络请求的模块都要放到工作线程里不能占用UI刷新时间。5.4 告警交互与记录告警触发时界面需要同时做三件事视频画面上用红色闪烁框突出目标并叠加FALL文字状态栏显示告警信息自动保存当前帧为JPEG图片并写入日志文件。界面告警可以加一个蜂鸣提示调用系统自带的蜂鸣即可不需要额外引入音频库。如果项目要求更正式的告警再考虑音效文件、弹窗等形式。闪烁框的实现思路是交替改变边框粗细和颜色间隔大约200毫秒这种视觉提示比单纯文字醒目得多。6. 常见问题与排查技巧现象可能原因处理办法训练时OOMbatch太大或输入尺寸过大减小batch、关闭cache、降低imgszloss不断上升学习率过高或标签错乱降低学习率、检查标签坐标训练集mAP高但视频测试效果差数据分布不一致补充贴近真实场景的视频帧摔倒瞬间检测不到动作过程样本少补充中间过程帧不只标结果状态把弯腰、蹲下误判为跌倒单帧判据太少增加时序判据、中心点速度约束多目标时告警错误ID跳变导致历史数据错乱接入跟踪器维持ID稳定界面卡死推理阻塞在UI线程把读取和推理移到QThread6.1 训练不收敛与损失异常跌倒数据量通常不大实际遇到更多的反而是过拟合问题。如果发现训练loss和验证loss差距越拉越大不要盲目增加训练轮数应该加数据增强、加dropout或者减小模型规模。如果验证集loss波动剧烈先检查是不是部分标签框坐标不对很多情况下是标注时把x和y写反了或者归一化后产生了负值。6.2 模型部署到不同设备的坑训练用的电脑是GPU部署到只有CPU的设备时速度会骤降。我的习惯是导出ONNX后先测一遍CPU推理时间达不到实时要求时把输入分辨率从640降到480或者检测频率从每帧一次改成每两帧一次。更高阶的做法是量化ONNX格式可以通过OpenVINO或TensorRT做INT8量化速度能再上一个台阶但精度会有一定损失需要重新评估误检漏检情况。6.3 系统的扩展思路这套系统最值得扩展的方向是接入真实监控场景。建议先小范围测试选一个普通室内摄像头记录不同时间段的检测效果。根据我的实际经验夜间红外模式、逆光场景和多人拥挤场景是最容易翻车的三个地方最好在项目启动时就预留针对这些场景调优的时间。远程告警、多路视频流、存储回放这些功能都可以作为下一阶段的迭代点。做这个项目最大的感触是训练模型只占整个工作量的两成剩下八成时间都花在数据清洗、判据调优和界面联调上。很多人训练完看到mAP很高就以为结束了结果接到真实视频里被误检打脸。我个人建议在项目一开始就准备一批“困难视频”专门用来测试误报率和漏报率而不是只看mAP指标这个习惯能省下大量返工时间。最后再分享一个小技巧把所有阈值参数都集中放在界面侧或者一个配置文件中演示现场随时能调比每次都改代码重新跑要省事得多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑