☰
YOLO安防监控异常行为检测数据集:9100张图像实战解析
2026/9/30 19:58:22 网站建设 项目流程

做异常行为检测算法落地的人,十有八九都被同一件事卡住过脖子——模型结构随便抄,数据集却凑不出来。通用目标检测的数据集一抓一大把,但真的落到安防监控场景,打架、摔倒、持刀、翻越这些长尾行为,公开资源少得可怜,要么类别对不上,要么标注质量毛糙,拿来训模型基本是在浪费显卡。这个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
优化器SGDmomentum=0.937,weight_decay=0.0005
初始学习率0.01使用余弦退火策略
类别权重cls=0.5缓解类别不均衡,后面会解释

训练环境是单张RTX 4090,显存24GB,实际上用16GB显存的显卡也能跑,只需要把batch降到8。整个训练流程大概跑了6个小时就稳定收敛了。如果你用的是YOLOv5或者改动后的YOLOv7、YOLOv11,这个数据集同样适用,结构上不绑定任何特定版本。

训练命令我用的是ultralytics官方CLI,简单直接:

yolo detect train \ data=abnormal_behavior_dataset/data.yaml \ model=yolov8s.pt \ epochs=100 \ imgsz=640 \ batch=16 \ cls=0.5 \ device=0

这里重点解释一下cls=0.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 ... patience=15

这行参数在跑通之后的实验中帮我省了不少时间。尤其需要注意,异常行为数据中的“烟雾明火”类别的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 小目标漏检:切图训练比单纯拉分辨率更稳

第三类踩坑是小目标漏检。监控场景中的人员跌倒和车辆逆行天然是小目标高发区,我之前试过直接提升输入分辨率到1280,mAP确实上升了一些,但推理速度慢了三倍,部署时根本扛不住。后来我把方案改为“训练时使用滑窗切图”:

  • 把图像按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张图更能说明“异常行为边界”到底应该怎么划定。如果你也有计划做类似的垂类数据集,建议从一开始就把这本手册写起来,后期受益无穷。

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

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

立即咨询