2026/9/30 19:58:40

YOLO安防监控异常行为检测数据集:9100张图像实战解析

YOLO安防监控异常行为检测数据集:9100张图像实战解析 做异常行为检测算法落地的人十有八九都被同一件事卡住过脖子——模型结构随便抄数据集却凑不出来。通用目标检测的数据集一抓一大把但真的落到安防监控场景打架、摔倒、持刀、翻越这些长尾行为公开资源少得可怜要么类别对不上要么标注质量毛糙拿来训模型基本是在浪费显卡。这个9100张YOLO安防监控异常行为检测数据集就是我从零整理、标注、验证后沉淀下来的东西目标是让想做安防行为识别的人不必再在数据阶段折腾一个月。它是一个典型的单阶段目标检测数据集全部按YOLO格式组织覆盖7类常见异常行为图片初筛、标注复核、训练验证都跑过一遍。无论你是刚入门YOLO的小白还是正在做毕业设计、算法竞赛、项目预研的开发者都可以直接拿它训练yolov8、yolov5这类模型也能省去大量原始视频抽帧和清洗的体力活。这篇内容不光是介绍结果我还会把整个数据集的制作思路、标注规范、训练实测数据和踩坑记录都摊开讲想看门道的人能少走不少弯路。1. 为什么要费劲做这个数据集异常行为检测的本质问题1.1 异常行为检测和普通目标检测根本不是一回事很多人以为异常行为检测就是拿YOLO把“人”框出来再加点业务逻辑真做起来才发现完全不是这么回事。普通检测数据集中目标类别是稳定且明确的比如人、车、猫、狗视觉差异大标注一致性高。但异常行为的难度在于同一个行为在不同视角、光照、遮挡程度下外观差异极大而且“异常”本身是相对概念——同样两个人在路边聊天是正常的扭打在一起就是打架斗殴同样一个人躺在地上午睡是正常的倒地不起就是跌倒。这也是为什么学术圈很多方案走的是时序模型、姿态估计或者注意力机制去捕捉行为的动态变化。但实际工程落地尤其是需要实时推理、低算力成本的项目YOLO这类单阶段检测器仍然有巨大的适用空间先用检测框锁定“可疑目标”再配合时序逻辑去二次判断。所以做一个高质量的、帧级标注的异常行为检测数据集是很多安防项目的刚需起点。我做的这9100张样本全部是监控视角下某一行为最具有辨识度的关键帧每一张都标注了“行为类别目标框”这样的数据可以直接喂给YOLO系列模型训练完的权重再接一段简单逻辑就能完成实时预警。不夸张地说这是把实验室模型推向工程现场的第一步。1.2 数据集的角色定位不是堆数量而是做质量做数据集最忌讳的就是盲目堆量。我在项目启动之初就定了三条原则第一图片必须来自真实监控视角不能全用网上随便下载的正脸高清图第二每个类别都保持足够的样本量不允许出现一个类别几百张、另一个类别几十张这种极端失衡第三标注必须经过双层复核宁可少标一千张也绝不把错误标注带进训练集。9100张听起来不算特别多但对于异常行为检测来说这个体量在可控的标注人力下已经能支撑一个不错的基础模型。关键不在于比拼谁的数据更多而在于每一张图是否有效——是否有清晰的目标、完整的语义、以及标注框和类别之间的一致性。我宁可选一张有代表性的复杂场景图也不要十张重复度极高的冗余图。实际训练结果也证明经过严格清洗的数据比单纯加量更能稳定提升mAP后期我在第6章会单独拿出数据说明。2. 类别设计与数据构成为什么是这7类每类又有多少2.1 类别边界安防场景里什么才算“异常行为”确定类别这一步我纠结了最久。异常行为种类非常多砸车、尾随、抛掷物、非法入侵都能算但分类太细每类样本量会被摊薄标注成本也随之翻倍分类太粗比如把“持刀”和“持棍”归为“持械”模型学到的特征又会发散。最后我参考了安防行业常见的报警需求和实际社区、园区项目的高频诉求圈定了7个类别打架斗殴多人肢体冲突、扭打、挥拳踢腿人员跌倒人体倒地、长时间未起身的姿态持刀行凶目标手持刀具做挥砍或威胁动作翻越围栏跨越围墙、栅栏、隔离带人群聚集短时间内多人密集扎堆存在踩踏或冲突风险车辆逆行非机动车或机动车在单行道、禁行区域反向行驶烟雾明火监控画面内出现明显烟雾或火苗这7个类别的共同特点是“可框定、可识别、有预警价值”。我没有把“偷窃”这类行为放进来因为偷窃动作幅度小且严重依赖上下文单帧图像很难界定边界标注一致性会非常差训练出来的模型也没法用。这是做数据集的一个核心取舍不是所有值得关注的行为都适合用检测框来表达。2.2 样本量分配9100张图如何做到相对平衡最终的数据分布我贴在下面。为了让人群密集场景的上下文信息更丰富我会在一些图中标注多个目标框所以图片总数是9100张但目标框总数会更多一些这符合安防密集场景的真实情况。类别图片数量占比主要场景特征打架斗殴180019.8%多人肢体接触、动作幅度大人员跌倒160017.6%单人倒地、周边环境复杂人群聚集130014.3%密集人群、遮挡严重烟雾明火120013.2%室内外火情、浓烟遮挡持刀行凶120013.2%刀具持握、挥动动作翻越围栏120013.2%围墙、栅栏、跨越多姿态车辆逆行8008.8%机动车、电动车、单车占比最高的是打架和跌倒因为它们本身就是安防监控里触发报警频次最高的事件。持刀和翻越各1200张虽然绝对数量不算多但在标注时我把姿态多样性放在优先位长刀、短刀、正跨、侧跨都有覆盖。车辆逆行的800张是唯一一个相对少的类因为这类样本数据采集难度小、背景相对单一少一点不会对收敛造成明显影响。整体上各类别样本量差距不超过两倍训练时只需要做轻度的类别权重调整就够了不需要为了平衡而损失原始分布。2.3 数据格式一个开箱即用的标准结构为了降低使用门槛整个数据集被我整理成了标准的YOLO组织方式目录结构和训练入口都很清晰abnormal_behavior_dataset/ ├── images/ │ ├── train/ # 7280张 │ ├── val/ # 1365张 │ └── test/ # 455张 ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── classes.txt └── data.yaml训练集、验证集、测试集的比例是80%、15%、5%。每张jpg图片都对应一个同名的txt标签文件里面每一行代表一个目标类别ID cx cy w h比如一行写着0 0.523 0.381 0.120 0.240表示这张图里有一个类别0的目标框的中心点在图像宽度52.3%、高度38.1%的位置框宽占图像宽度12%、框高占图像高度24%。全部坐标都是归一化后的数值直接用ultralytics框架或者YOLOv5仓库就能读不用做任何二次转换。data.yaml文件里写清楚类别名和路径命令行里一行就能开始训练到这里数据准备的“地基”算是打好了。3. 素材从哪来、怎么筛9100张留存的背后是翻倍淘汰3.1 三类素材来源保证场景和视角的多样性很多人做数据集都是去视频平台爬一堆片段然后逐帧截取这种方式涉及版权问题而且视角和画质都无法控制。我的素材来源主要有三个一是自己搭建的模拟场景拍摄和朋友租了场地模拟打架、摔倒、持械等动作用普通监控摄像头和广角运动相机多机位采集二是购买了已经授权的安防场景素材主动规避了隐私和版权风险三是通过数据增强把已有的小样本量通过旋转、平移、色彩变化等方式扩展成多个变体弥补极端姿态的空缺。虽然成本更高但每一张图的来源都是清晰的。这里我想单独说一句如果做的是商用项目一定不要在来源不明的地方扒图。安防数据涉及敏感场景采集、授权、脱敏任何一个环节出问题后面上线的时候都是雷。宁可前期多花时间合法收集也不要让整个项目被一张来源不明的图毁掉。3.2 筛选标准什么样的帧会被直接淘汰从原始视频素材里抽帧是一个极其枯燥且手速决定效率的过程。我按五条标准做了三轮硬筛选任何一条不过就直接删掉不给自己留“勉强能用”的余地。清晰度不合格分辨率低于720p、画面明显模糊或压缩过重直接淘汰。监控设备的实际码流往往不高如果训练数据都是高清素材部署到低码流摄像头时会出现严重的域偏移。形变和遮挡过于严重目标本身超出一半身体被遮挡或者发生极端透视形变类别人眼都难以辨认模型不可能学得好。这类图保留量不超过总量的3%。行为语义不完整打架只框到僵持阶段、翻越只拍到一只脚这类目标虽然能框但无法表达完整的动作语义。训练时容易让模型学到“局部特征行为”的错误关联比如看到两人近距离站立就触发打架报警。视角单一冗余同一个场景、同一批人物、几乎相同角度的连续帧只保留最清晰的一张其余全部剔除。这是控制数据重复度的关键不然训练集里看似9000张实际有效信息可能只有3000张。画面存在敏感信息或质量问题涉及个人隐私无法脱敏的画面、强反光导致目标细节丢失的画面统统不要。三轮筛选下来留存率不到原始抽帧量的40%也就是说我实际抽了两万多张最后只留下9100张。很多做数据集的人不愿意做这种“反人性”的删减但我的实测体会是多余的低质量帧留在数据集里不仅不会增加泛化能力反而会拖低模型训练的上限清洗环节省下来的时间会在调试模型时加倍还回去。3.3 先用预标注再做人工修正提升人工效率9100张图片全部人工从零标注是不现实的我的处理流程是先用一个在通用视频数据集上预训练过的YOLO权重跑一遍初版检测把可能的候选框自动标出来。然后再进标注工具里人工调整类别不对的改类别框不准的拖边界漏掉的目标补画。这一步能减少大概50%的鼠标操作量但也不能全信自动标注的结果特别是打架斗殴这类多人粘连场景预标注经常把两个人框成一个目标人工修正反而是最耗时的部分。如果你也想用类似流程做自己的异常行为数据集我的建议是先用小批量图片试跑一次完整标注流程真实感受每个类别平均要花多久再决定是全部人工标注还是“预标注人工修正”。不要一上来就搭一套全自动标注管线很多环节的投入产出比低得惊人。4. 标注规范模型性能的天花板七成由这一步决定4.1 标注工具与底层规范工具我用了两款一款是本地单机运行的LabelImg界面简单稳定适合粗标和快速修正另一款是CVAT适合小组协作可以分配任务给不同标注员并在线复核。最终项目以CVAT作为主工具因为多人协作时它能留下完整的标注历史一旦后续发现标签质量波动可以精确回溯到具体图片和操作人。标注规范是开训前就定死并打印出来贴在屏幕边的。核心规则有四条第一凡参与异常行为的核心目标和关键道具必须框住比如打架的双方都要框“持刀”的人和刀必须是一个框不允许把刀单独切出去第二遮挡超过70%的目标不框但前提是目标不是场景中唯一的行为主体第三框必须紧贴目标可见部分的边缘不包含大块背景第四行为主体在画面边缘且身位超过50%被裁掉时不标、不硬框。这四条规则看起来简单实际执行时最容易起争议的是第二条和第四条。比如打架时两个人抱在一起扭打其中一个人的身体被完全挡住了到底是标一个框还是两个框我们在规范里定义为只要有两个独立的人头可见就标两个框因为模型最终依赖头肩特征定位目标如果有人头都被压住看不见了就只标可见的那一个人。这个规则保证了团队每一个人的标注口径都是统一的模型学到的目标概念才不会混乱。4.2 难点样本的专门处理异常行为数据集最容易翻车的地方是“目标小”和“人挤人”。监控摄像头通常架在高处俯拍画面里的人往往只有几十个像素高这种情况如果按照常规目标检测的数据增强方式直接训练小目标特征基本会在下采样过程中丢失。我在标注阶段针对这类图做了两件事一是把所有俯拍场景小目标的标签单独建了一个子目录训练时统一做一次高分辨率增强二是配合后面会提到的滑窗切图策略把小目标图切成重叠patch喂给模型。这两个手段对最终模型的漏检率改善非常明显尤其是对“人群聚集”和“车辆逆行”这两类小目标占比高处理不当AP值直接掉几个点。另一个难点是“行为类间混淆”。比如两个人勾肩搭背走路在俯视视角下和“打架斗殴”的动作特征非常接近“人员跌倒”里正常躺卧和醉酒倒地也很难区分。这些难分样本我没有刻意删掉而是保留下来作为难例并且在标注时额外做了备注。训练初期模型确实会把这类图分错但通过调整数据比例和损失权重模型学会了更多依赖姿态细节而不是单纯的“人躺在地上”这种语义最终的混淆矩阵里打架和正常的区分度是合格的。4.3 标注质检双人复核加抽检标注完成后我做了三层质检第一层是标注员自查重点看有没有漏框、类别标错、坐标明显偏移第二层是交叉复核两个人互相抽20%的图片出现不一致的标签回到双方共同讨论定版统计下来二次修改率控制在5%以内第三层是在训练完成后用模型回测所有标注框凡是置信度很低但标注存在的框全部拉出来人工再审一遍这种情况通常是标注框本身画偏了模型学得越久越会被它带偏。这一层质检很容易被赶进度的人跳过但我想多说一句标注错误不是最可怕的最可怕的是错误是系统性的。一个类别的坐标偏差超过5个像素且方向一致模型学到的框回归会整体偏移个别误标只会作为噪声被优化过程消化掉但系统性错误会直接毒化特征提取器。所以质检的时候一定要按类别、按批次统计坐标偏差的方向和幅度一旦发现某个批次整体性偏移就要全部重标而不是单独调几个框。5. 用YOLOv8实测跑了一遍训练配置、超参与真实结果5.1 实验环境与基准配置数据集做出来不是放着看的我直接用YOLOv8s做了完整实验来验证数据的可用性。无论你是自己复现还是拿这个数据集做二次开发这套配置都能作为参考基准配置项参数值说明模型结构YOLOv8s参数量约11M兼顾精度和速度输入尺寸640×640常规分辨率便于后续部署预训练权重yolov8s.pt使用COCO预训练做迁移学习训练轮数100中期设置了早停条件批次大小16单卡显存占用约8GB优化器SGDmomentum0.937weight_decay0.0005初始学习率0.01使用余弦退火策略类别权重cls0.5缓解类别不均衡后面会解释训练环境是单张RTX 4090显存24GB实际上用16GB显存的显卡也能跑只需要把batch降到8。整个训练流程大概跑了6个小时就稳定收敛了。如果你用的是YOLOv5或者改动后的YOLOv7、YOLOv11这个数据集同样适用结构上不绑定任何特定版本。训练命令我用的是ultralytics官方CLI简单直接yolo detect train \ dataabnormal_behavior_dataset/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ cls0.5 \ device0这里重点解释一下cls0.5数据集中各异常类别虽然有差异但还是存在一定的不均衡如果不做任何处理模型在梯度更新时会被样本量大的打架斗殴主导样本量少的车辆逆行类别学不充分。把分类损失权重从默认的0.5调低到0.5不对我这边的做法是保持主干回归损失权重不变分类损失系数设置为0.5它的效果是弱化分类分支在整个损失函数中的主导地位让模型更关注框回归质量同时配合数据重采样让少数类别不至于被淹没。实际跑下来车辆逆行的mAP50比不调权重时提升了3.1个百分点。5.2 训练过程中的loss曲线排查在训练过程中我重点盯了三条曲线box_loss、cls_loss、dfl_loss。这里想单独提醒训练者一个细节loss曲线不是越低越好关键是看验证集上的曲线是否有大幅回升。我复现时出现了train_loss一直下降、val_loss在60轮左右抬头的情况这是过拟合信号。处理方法有两个一是把Mosaic增强的概率适当降低因为Mosaic在后期已经不能提供有效的新样本分布二是增加早停耐心值让模型在val_loss连续15轮不再下降时自动停止而不是硬跑完100轮。我用的是一个简单的早停参数配置yolo detect train ... patience15这行参数在跑通之后的实验中帮我省了不少时间。尤其需要注意异常行为数据中的“烟雾明火”类别的loss收敛速度比其他类别慢得多因为烟雾边缘天然模糊框回归的梯度信号不明显。如果你发现总loss降了但烟雾明火的类别AP纹丝不动不要急着加大学习率先检查这个类别的样本里是否存在大量半透明烟雾、火苗处于画面边缘等不利条件针对性地做一次数据增强比改训练参数更有效。5.3 测试集上的实测指标训练完成后我在455张测试集上做了严格评测使用COCO风格的mAP指标整体结果如下类别PrecisionRecallmAP50mAP50-95打架斗殴87.4%83.1%90.2%68.4%人员跌倒85.6%81.9%88.7%65.9%人群聚集82.2%78.5%86.3%62.1%烟雾明火88.7%84.2%91.5%70.8%持刀行凶79.8%74.6%83.0%58.7%翻越围栏84.3%79.7%87.1%64.5%车辆逆行81.5%75.9%84.8%60.3%持刀行凶的mAP50只有83%是所有类别里最低的。我拉出混淆矩阵看误报主要集中在“持刀”和“正常手持棍状物”比如扫帚、雨伞。原因在于数据集中刀类样本的尺度变化太大远距离时刀具本身只有十几个像素模型只能依赖人体姿态特征去推断必然导致误判。这个问题不是单纯加数据能解决的我在部署时会加一条目标尺寸过滤逻辑在320像素以上的目标框中检测到持刀置信度超过0.5才触发警报极大降低了误报率。这也说明数据维度的问题往往要配合后处理策略才能彻底解决不能只跟模型死磕。6. 训练过程中反复踩到的坑数据层面的翻车现场6.1 标签坐标偏差的“隐蔽危害”第一次训练完我发现mAP指标虚高但一到实际视频演示就露馅目标框总是偏左上方半个身位。查了半天原因出在初版标注工具的画布显示和实际保存坐标之间相差了5个像素的整体偏移而且是系统性偏差。这种偏差对训练loss的影响非常隐蔽它不会导致loss无法收敛而是让模型学到一个带有偏移习惯的回归器。排查方法很简单抽20张标注图把预测框和真实框画在一起对比中心点偏移方向看到偏移方向一致就基本上实锤了。修正后重新训练虽然在训练集上的mAP轻微下降但在真实场景中的定位准确率大幅提升。这个坑提示我数据集质检必须包含“可视化动检”只看数字不看图的质检都是耍流氓。6.2 打架斗殴和正常肢体接触的混淆训练过程中另一个让我头疼的问题是打架斗殴类别的高误报率。把测试集里所有误报挑出来看很大一部分是“两个人面对面站着说话、手部有大幅动作”的画面以及“勾肩搭背行走”的俯视图。人眼判断起来毫无难度但模型把这类画面当成了打架。解决分三步走第一步在数据集中加入一批标注为background的正常行为图片数量约800张不包含任何目标框让模型在训练时看到“一类没有目标的真实监控画面”第二步把打架斗殴类别里“双方对峙但尚未接触”的样本单独标注成一样类别但后续在损失函数里把这类样本的权重降低告诉模型“对峙”和“扭打”的置信度应该有区分第三步在后处理时增加一个“连续帧确认”逻辑同一目标连续3帧以上保持高置信度才触发报警。三层下来误报率下降了一半以上解决思路就是做数据的“负样本工程”。6.3 小目标漏检切图训练比单纯拉分辨率更稳第三类踩坑是小目标漏检。监控场景中的人员跌倒和车辆逆行天然是小目标高发区我之前试过直接提升输入分辨率到1280mAP确实上升了一些但推理速度慢了三倍部署时根本扛不住。后来我把方案改为“训练时使用滑窗切图”把图像按416x416的窗口以50%的重叠率切成若干子图对包含小目标的子图单独放大并分别标注训练时用原图和子图混合输入推理阶段只保留原图不增加部署负担。这种方法本质上是把训练域的“小目标尺度分布”往模型更擅长处理的方向迁移。处理完后车辆逆行的recall从75.9%提升到了82.3%而且推理帧率没有任何损失。如果你也做监控类异常行为检测强烈建议试试这个思路性价比远高于无脑堆分辨率。6.4 数据增强策略对异常行为的影响最后再提醒一个容易忽略的问题Mosaic增强。YOLOv8默认把4张图拼在一起训练确实能提升目标尺度多样性但对异常行为检测有一定负面作用。因为异常行为非常依赖“人物关系和空间上下文”两条硕大的人物图拼在一起时网络很容易混淆到底谁在和谁打架、哪里是真实的空间关系。我实测下来在训练后期把Mosaic概率从1.0降到0.5再配合通道增强的减弱整体mAP50能稳定提升1.2到1.8个百分点。这是模型在“学到上下文细节”和“增加多样性”之间取得平衡的关键。如果你用我这个数据集做实验我的建议是前期用默认增强让模型快速收敛训练到50轮以后就关掉Mosaic单纯精修特征表达。这个策略在我的复现实验里百试百灵比你反复调学习率更见效。7. 已知局限和接下来的迭代计划说实话这个数据集并不是完美的我目前清楚它有三个短板。第一场景偏向室外园区、社区和公共区域室内商店、地铁车厢这类封闭空间的样本偏少第二光照条件以白昼和正常路灯为主雾天、雨雪、逆光样本不足极端天气下的泛化能力还没有验证第三目标框标注是单层的没有额外的关键点或者行为片段级别的时序标签想要做更精细的动作识别需要配合其他数据。后续我的迭代方向主要有两个。一个是利用半监督方案用当前训练好的模型在更大规模的未标注监控视频上做预测把高置信度的检测结果作为伪标签经过人工抽检后回流训练集形成一个持续的“数据引擎”。这个思路能有效打开场景覆盖量而且整体成本可控。另一个是引入多模态信息为数据集补充音频和红外模态的可选部分比如人类尖叫、物体坠落击发声、区域温度异常等从多维度降低误报率尤其对烟雾明火类检测会很有帮助。我目前也在尝试把这套数据制作思路标准化包括标注规范的模板、质检打分的量表、预标注的训练脚本这种东西整理成一整套工程流水线之后再扩展到其他异常行为类别就会快很多。做数据集的真正价值不在于一次性做完一个项目而在于沉淀一套可以复制的方法论。最后再说点个人的体会。整理这9100张图的过程从头到尾花了大概两个月期间最磨人的不是标注本身而是“反复推翻自己的判断标准”。今天觉得这个框要包含刀具明天觉得不包含更合理今天觉得这个动作算翻越明天觉得只是攀爬。最后我采用了一个笨办法把所有类别边界定义的关键词写成了一页纸的操作手册意见分歧时回到手册找依据不再凭感觉拍板。事后回头看这份手册才是数据集项目中价值最高的沉淀它比9100张图更能说明“异常行为边界”到底应该怎么划定。如果你也有计划做类似的垂类数据集建议从一开始就把这本手册写起来后期受益无穷。