资讯动态

基于YOLOv8的站立-跌倒-吸烟行为检测模型构建与部署实战

发布时间:2026/9/8 10:32:53 来源:尧图企业网站定制
简介面向安全监控与异常行为识别场景的YOLOv8站立、跌倒、吸烟检测模型及配套数据集适合目标检测开发者和算法研究人员快速搭建实验。压缩包整体约207.75MB共2000个文件以txt格式的YOLO标注为主1865个另有md说明文档、yaml配置、Python训练脚本和C推理源码等。数据集目录已划分好train、valid、test并附data.yamlYOLOv5、YOLOv7、YOLOv8都可不做额外调整直接训练省去数据整理和格式转换时间。数据覆盖站立、跌倒、吸烟三类目标约2000张图像标签为yolo格式可用于安全监护、行为分析等模型迭代优化。包内还包含配置说明、推理实现和少量源码文件便于复现检测结果或二次开发。压缩包目录结构清晰预处理工作基本完成可快速投入实验。目前已有488人学习使用适合需要获取完整数据与代码的读者参考。 做行为检测这几年我越发觉得“跌倒”和“吸烟”这两个场景特别有意思一个是安全刚需中的刚需另一个是特定场所的合规红线把它们跟“站立”这个正常态放在一起做三分类能一下子解决很多实际的监控需求。这篇文章我想从项目整体设计、数据集构建、模型训练踩坑到最终部署推理把我实际做 YOLOv8 站立-跌倒-吸烟行为检测模型的完整过程拿出来聊聊里面有不少坑和土办法希望给正在上手类似项目的人一些参考。1. 项目整体设计与思路拆解1.1 核心需求解析为什么选这三类行为先把这个项目的本质说清楚。站立、跌倒、吸烟粗看是三个独立的目标检测类别但实际上它覆盖了一个非常典型的场景闭环一个房间里的人正常状态是站立或行走如果突然倒地且短时间内不起来那是需要告警的跌倒事件如果掏出烟点燃那是需要合规提醒的吸烟行为。把这三类放到同一个模型里本质上是在用一次推理解决场景里的“安全监控”和“合规监控”两个目标。类别定义看起来简单实际操作时有一个坑很多人会把“跌倒”定义成“躺在地上的人”但这个理解会在数据构建阶段带来很大麻烦。因为在监控画面里一个人躺在地上可能是在睡觉、在休息、在做康复运动并不都是跌倒。我最终的方案是把它建模成“姿态异常”加“空间位置异常”的组合模型只负责检测“地面附近非水平的人体姿态”真正的跌倒告警逻辑放在后处理里结合连续帧状态机去判断是否触发。这个思路在后面推理部分还会细说。1.2 技术选型YOLOv8在行为检测任务里的优势目标检测算法现在可选的很多YOLOv5、YOLOv6、YOLOv7、YOLOv8甚至YOLOv9、YOLOv10都有人用。这个项目我选了 YOLOv8核心原因有三个第一YOLOv8 的模型结构里引入了 C2f 模块相比 YOLOv5 的 C3 模块梯度流动更丰富在训练自己的小数据集时收敛速度和稳定性都有明显改善。第二YOLOv8 的检测头是解耦头分类和回归分支分开在做“站立 vs 跌倒”这种外观差异不大但姿态差异明显的任务时收敛更稳。第三Ultralytics 生态顺手训练、验证、导出 ONNX、TensorRT 一条龙省去大量工程时间。这里顺便说一句模型尺寸的选择。当时我在 YOLOv8n 和 YOLOv8s 之间犹豫过。n 版本速度快CPU 都能跑到接近实时但小目标检测能力弱一点s 版本精度更好但推理耗时更高。最终选的是 YOLOv8s因为在真实监控场景里吸烟这种目标有时候很小n 模型容易出现漏检这个取舍在后面效果验证里被证明是值得的。2. 数据集构建这是整个项目的隐形大头2.1 数据来源与标注策略说实话行为检测项目最耗时间的不是训练模型而是搞数据集。市面上跌倒检测的公开数据集不少比如 UR Fall Detection、Le2i Fall Detection但大部分是实验室场景分辨率低、场景单一。吸烟检测的数据集就更少了基本得自己标。我的做法是“三步走”公开数据打底收集 UR Fall、Le2i 中可用的视频帧做清洗后使用主要用来补充跌倒姿态的多样性。自采数据扩充用手机和普通网络摄像头在办公室、走廊、楼梯口等场景录制视频模拟站立、行走、跌倒、蹲起、躺卧、吸烟等动作。这一步很关键自采数据的场景和设备更接近实际部署环境模型泛化性会好很多。数据增强补量对图像做随机旋转、平移、缩放、色彩抖动、马赛克增强Mosaic。YOLOv8 自带的 Mosaic 增强效果很好能显著提升小目标的检测能力。标注策略上我用的 LabelImg 和 Roboflow 结合去重之后最终拿到大约 1.2 万张有效图片。类别分配上站立和吸烟的样本量较为充足跌倒的样本量稍微少一些所以对跌倒做了过采样处理让三个类别在训练时基本均衡。注意自采数据要特别注意光线条件的覆盖。我一开始只在白天采结果模型在晚上灯光下的检测效果明显下滑。后来补了一批夜间、逆光、强光下的帧mAP 直接涨了三个点。2.2 提高精度的关键细节类别分层与小目标策略数据准备有一个细节特别值得说就是“吸烟”这个类别怎么定义边界。初期我标数据时把拿着烟的手、嘴边的烟、手里的打火机全算成了“smoking”结果模型训练出来特别混乱频繁误检。后来把类别定义收敛成“正在吸烟”要求烟在嘴边且伴随烟雾或吸食动作“手持香烟”仅限手部持有。最终模型只保留“smoking”这个类别手持状态不参与推理输出用这种方式降低标注噪声。还有一个关键点不少吸烟检测的画面里人脸区域很小烟更小。YOLOv8s 对小目标召回能力一般除了前面提过的 Mosaic 增强还可以额外生成一些放大裁剪的局部样本把吸烟区域单独裁剪出来粘贴到不同背景上Copy-Paste 增强这些小技巧叠加对 mAP 的提升非常明显。3. 模型训练与调优实战3.1 环境配置与硬件要求很多初学者问用 YOLOv8 训练需不需要 GPU。我的回答是如果你是认真的一定要有 GPU哪怕只是入门级的。YOLOv8n 在 CPU 上用小数据集跑几十个 epoch 也能出结果但速度慢到让人怀疑人生一张 640x640 的图CPU 训练一个 batch 可能要好几秒一个 epoch 几百张图跑完就要半小时起步。我当时用的是一块 RTX 309024GB 显存。如果只是入门GTX 1660 Ti / RTX 3060 6GB 也完全能跑只要把 batch size 调小。Ultralytics 的环境安装很省心简单说就是创建虚拟环境、安装 PyTorch 对应版本、安装 ultralytics测试 GPU 可用性。下面是典型的最小环境配置conda create -n yolov8 python3.9 conda activate yolov8 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics装完以后可以顺手跑一下yolo predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg能输出检测结果就说明环境OK。3.2 训练参数与损失曲线解读训练阶段直接上 YOLOv8s 预训练权重做迁移学习。数据集路径按 Ultralytics 的 dataset.yaml 格式组织这里提个醒路径最好写绝对路径因为它内部会多次拼接路径相对路径特别容易踩坑。核心训练命令如下yolo train datafall_smoke.yaml modelyolov8s.pt epochs150 imgsz640 batch16 device0 patience20 projectruns namefall_smoke_v1几个参数的实际经验imgsz640默认值平衡精度和速度。如果你发现烟头这种小目标检不出来可以试 960但推理帧率会明显下降。patience2020 个 epoch 没有改善就提前停止防止过拟合。batch16取决于显存。显存不够就降到 8 或 4配合梯度累积效果类似。训练过程里一定要盯住两个重要曲线Box Loss 和 Cls Loss。正常情况下两个 Loss 应该在前 50 个 epoch 快速下降之后进入平台期并伴随验证集上 mAP 的缓慢提升。如果 Box Loss 还在下降但 Cls Loss 开始回升说明过拟合了要么加数据增强要么增加数据量。从训练结果看我最终训练出模型的 mAP0.5 在 0.94 左右mAP0.5:0.95 在 0.72 左右三类别里吸烟的 AP 最低符合预期毕竟目标尺寸小。数据增强和类别均衡调整后整体的误检率有明显下降。3.3 画损失函数曲线与可视化评估Ultralytics 训练完会自动产出results.png里面包含了 box_loss、cls_loss、dfL_loss、precision、recall、mAP 的曲线。这个图在项目汇报时非常好用能直观地说明模型质量。如果你想要更自由的画图方式可以读取训练目录下的results.csv用 pandas 和 matplotlib 自己画。小技巧画曲线时把横轴换成学习率可以清晰看到余弦退火和预热策略对 Loss 下降的影响这能帮你判断当前学习率设置是否合理。4. 模型部署与场景化推理4.1 导出 ONNX 并在边缘设备部署训练只是第一步落地部署才是真正见真章的地方。我的部署目标是一台带 RK3588 的边缘计算盒子为此需要把 PyTorch 模型导出成 ONNX再转成 RKNN 格式。导出 ONNX 的命令比较简单yolo export modelbest.pt formatonnx opset12 simplifyTrue导出以后务必用onnxruntime做一遍推理验证确认输出张量 shape 是[1, 84, 8400]YOLOv8 的 8400 是三个尺度特征图上的 anchor 点总数。有时候简化导出的模型在 RKNN 转换时会有兼容性问题这时候一般建议在转 RKNN 时关掉部分优化开关逐个排查。在 RK3588 上实测下来YOLOv8s 在 NPU 上单次推理大约 20-30ms换算成帧率大概 30-40 FPS取决于预处理开销完全够用。如果追求更低延迟可以进一步用 TensorRT对 NVIDIA 平台或 RKNN 量化对瑞芯微平台做 INT8 量化一般能把延迟再压一半左右但精度会有一些损失。4.2 行为状态机与跌倒告警逻辑这里要讲一个纯目标检测搞不定的问题单帧检测只能告诉你“这一刻画面里的人是站立还是倒地”但没法直接下结论“某个人在跌倒”。实践里我加了非常简单的状态机在检测框的后处理基础上逐帧跟踪并判断第 N 帧检测到人形状态为异常躺倒记录异常帧开始时间。后续连续帧继续检测若异常持续超过 1.5 秒判定为一次跌倒事件。若中途检测到正常站立姿态则清空累计状态不触发。这个逻辑看起来很简单但能过滤掉大量误报尤其是那种“弯腰捡东西”“躺下休息”的非跌倒场景。同理吸烟检测也可以加逻辑连续 0.5 秒检测到吸烟才触发告警避免单帧误检导致频繁弹窗。这样的后处理逻辑在真实安防系统里比单纯提高模型阈值要高效得多。4.3 常见问题与排查技巧实录项目过程中我踩了不少坑整理成一份速查表这里挑几个典型的讲问题现象可能原因排查与解决方案跌倒检测频繁误检类别定义模糊收紧标注标准只标倒地姿态不在标注中包含卧床、蹲坐吸烟小目标漏检原图目标过小提高输入分辨率、增加小目标增强、单独裁剪补充样本训练 Loss 不降学习率过高或数据噪声大调低学习率、清洗标注错误、降低 batch sizeRKNN 转换报错模型中含不支持的算子降低 opset、关闭 parse 优化、逐层定位算子类型测试精度高但现场误判场景光线变化数据集中加入现场光照帧、做色彩归一化增强还有一个独家经验想分享如果你用“跌倒”做告警不要把阈值调太低。我在真实场景测试时把置信度阈值从 0.25 提高到 0.45 后跌倒误报率大幅下降而因为真正的跌倒姿态特征很明显对召回率的影响微乎其微。不同类别完全可以分开设阈值YOLOv8 后处理阶段可以这样定制。5. 项目复盘与扩展5.1 模型迭代方向目前这个模型已经能稳定识别站立、跌倒、吸烟三类行为但我后续还打算做几件事一是把检测升级成“检测跟踪”接入 ByteTrack 或 BoT-SORT这样能拿到每个人在连续时间内的运动轨迹跌倒判断可以加入速度突变特征进一步提高准确率。二是往“行为识别”方向走。目标检测本质上是空间感知对时间维度不敏感。如果想把“跌倒”识别做得更专业可以考虑在 YOLOv8 检测框基础上再接一个轻量级动作识别分类头比如用 SlowFast 或 TimeSformer 的思想对时序信息建模。这样即使某一帧因为遮挡没检出前后帧的信息也能辅助判断。三是在小目标检测上继续优化。吸烟这种细粒度目标可以考虑在 YOLOv8s 基础上加一层微小目标检测头P2 层代价是计算量增加 20% 左右但在远距离监控场景收益很大。5.2 踩坑心得最后分享几个这个项目让我印象比较深的教训不要迷信公开数据集。公开数据集适合起步和验证想法最终泛化能力靠的还得是自己场景下的数据。数据清洗比数据量更重要。2000 张干净标注图片效果好过 5000 张标注混乱的图片。后处理才是灵魂。很多团队模型都训练出不错的精度但告警逻辑没做好落地后天天误报最后项目被砍。能稳稳落地的方案往往是“模型精度中等 逻辑过滤优秀”。做这个项目的过程中我最大的体会是行为检测对工程化的要求远高于一般目标检测。模型只负责视觉感知的一半剩下的一半要靠场景理解、连续帧状态推理和告警策略来补齐。如果你正在做类似的需求我建议一开始就把整个闭环想清楚不要只顾着把 mAP 刷高。模型精度是水桶的一块板工程逻辑才是把所有板箍在一起的那道圈。本文还有配套的精品资源点击获取

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

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

免费获取报价