随着社会公共安全需求的日益增长,智能视频监控技术在城市安防体系中扮演着愈发重要的角色。传统的视频监控依赖人工目视巡检,存在效率低、响应慢、漏检率高等问题。本文设计并实现了一套基于 YOLOv8-Pose 人体关键点检测的斗殴行为智能监控系统,通过对监控画面中人体 17 个 COCO 关键点的提取与分析,自动识别攻击性姿态和暴力行为。系统采用多人贴近度分析算法,对斗殴严重程度进行三级分级评估(低/中/高),并支持单张图像分析、批量筛查、视频逐帧检测和实时摄像头流监控等多种工作模式。系统基于 Gradio 框架构建了专业的安防监控风格 Web 交互界面,支持 LLaVA 多模态大模型的深度暴力行为语义分析,以及事件记录的持久化存储与 CSV 导出。实验表明,系统在 Aggressive_Poses_Dataset 上训练后 mAP@50 达到 0.995,能够有效识别监控场景中的攻击性姿态和斗殴行为。
关键词:斗殴检测;姿态估计;YOLOv8-Pose;深度学习;智能监控;COCO关键点
近年来,公共场所暴力事件频发,校园欺凌、街头斗殴、娱乐场所冲突等暴力行为对社会治安构成严重威胁。传统的视频监控系统存在以下不足:
- 被动监控:摄像头仅负责画面记录,无法主动识别正在发生的暴力行为;
- 人工巡检效率低:安保人员难以同时关注几十甚至上百路视频画面,响应延迟严重;
- 事后追责而非事前预防:大部分监控录像仅在事发后被调取,缺乏实时预警能力。
本系统利用深度学习姿态估计技术,实现了对监控画面中人体攻击性姿态的自动检测,具有以下重要意义:
- 实时预警:在暴力行为发生的第一时间触发告警,为安保人员争取宝贵的响应时间;
- 降低人力成本:自动化检测替代人工巡检,显著降低安保运营成本;
- 分级响应:根据斗殴严重程度(低/中/高)采取差异化处置策略,避免过度响应或响应不足;
- 数据留存:完整记录每次检测事件的截图、时间戳与AI分析报告,形成可追溯的安防数据链。
本系统使用的训练数据为 Simuletic - CCTV Aggressive Poses & Fight Detection Dataset,是一个专为监控场景下的攻击性姿态检测设计的小规模数据集。
数据集采用 YOLO 姿态关键点标注格式,每张图片对应一个同名 .txt 标签文件。标签文件中每一行代表一个人体实例,格式如下:
<class_id> <x1> <y1> <v1> <x2> <y2> <v2> ... <x17> <y17> <v17>
- class_id:目标类别编号,本数据集仅有
0(person,攻击性姿态); - x, y:关键点归一化坐标,范围为 [0, 1],表示关键点在图像中的相对位置;
- v:关键点可见性标志,
0表示不可见,1表示可见但被遮挡,2表示清晰可见。
数据集采用 COCO(Common Objects in Context)标准人体关键点格式,共 17 个关键点:
| 序号 | 关键点名称 | 英文名称 | 所属部位 |
|---|---|---|---|
| 0 | 鼻子 | nose | 头部 |
| 1 | 左眼 | left_eye | 头部 |
| 2 | 右眼 | right_eye | 头部 |
| 3 | 左耳 | left_ear | 头部 |
| 4 | 右耳 | right_ear | 头部 |
| 5 | 左肩 | left_shoulder | 上肢 |
| 6 | 右肩 | right_shoulder | 上肢 |
| 7 | 左肘 | left_elbow | 上肢 |
| 8 | 右肘 | right_elbow | 上肢 |
| 9 | 左腕 | left_wrist | 上肢 |
| 10 | 右腕 | right_wrist | 上肢 |
| 11 | 左髋 | left_hip | 躯干 |
| 12 | 右髋 | right_hip | 躯干 |
| 13 | 左膝 | left_knee | 下肢 |
| 14 | 右膝 | right_knee | 下肢 |
| 15 | 左踝 | left_ankle | 下肢 |
| 16 | 右踝 | right_ankle | 下肢 |
系统在可视化时绘制 16 条骨架连线,形成完整的人体姿态骨架:
- 面部:(0-1), (0-2), (1-3), (2-4) —— 鼻-眼-耳连线
- 上肢:(5-7), (7-9), (6-8), (8-10) —— 肩-肘-腕连线
- 肩部:(5-6) —— 左右肩连线
- 躯干:(5-11), (6-12), (11-12) —— 肩-髋连线
- 下肢:(11-13), (13-15), (12-14), (14-16) —— 髋-膝-踝连线
| 项目 | 数值 |
|---|---|
| 原始图片总数 | 103 张 |
| 训练集 | 83 张 (80%) |
| 验证集 | 20 张 (20%) |
| 类别数 | 1 类(person,攻击性姿态) |
| 关键点数 | 17 个 COCO 关键点 |
| 标注格式 | YOLO Pose (x, y, visibility) |
| 图片场景 | CCTV 监控视角 |
| 数据分割方式 | 随机打乱后按 80/20 比例分割 |
| 随机种子 | 42(保证可复现) |
data/
├── Aggressive_Poses_Dataset/ # 原始数据集
│ ├── data.yaml # 数据集配置文件
│ ├── images/ # 103 张原始图片
│ │ ├── aggressive_pose_1.jpg
│ │ ├── aggressive_pose_2.jpg
│ │ └── ...
│ └── labels/ # 103 个关键点标签
│ ├── aggressive_pose_1.txt
│ ├── aggressive_pose_2.txt
│ └── ...
└── fight_dataset/ # 处理后的训练/验证集
├── data.yaml # 训练用数据配置
├── images/
│ ├── train/ # 训练集图片 (83 张)
│ └── val/ # 验证集图片 (20 张)
└── labels/
├── train/ # 训练集标签 (83 个)
└── val/ # 验证集标签 (20 个)
系统采用模块化分层架构设计,自上而下分为展示层、业务层、引擎层和数据层:
┌──────────────────────────────────────────────────────┐
│ 展示层 (Presentation) │
│ Gradio Web UI │ 实时视频流 │ 检测结果可视化 │
├──────────────────────────────────────────────────────┤
│ 业务层 (Business) │
│ 斗殴检测调度 │ 严重程度评估 │ LLaVA 深度分析 │
│ 事件记录管理 │ CSV 导出 │ HTML 报告生成 │
├──────────────────────────────────────────────────────┤
│ 引擎层 (Engine) │
│ YOLOv8-Pose │ 骨架绘制 │ 多人贴近度分析 │
│ Ultralytics │ PyTorch │ OpenCV │
├──────────────────────────────────────────────────────┤
│ 数据层 (Data) │
│ Aggressive Poses Dataset │ SQLite 事件数据库 │
│ 训练/验证/测试集 │ 配置文件 (YAML) │
└──────────────────────────────────────────────────────┘
监控画面输入
│
▼
YOLOv8-Pose 姿态估计模型
│
▼
17 关键点提取 + 人体边界框
│
├─► 绘制红色骨架 (仅限攻击性姿态)
├─► 绘制红色边界框 + 置信度
│
▼
多人贴近度分析
│
├─► 1 人 → 低风险 (LOW) → 记录事件
├─► 2 人 → 距离 < 25%帧宽 → 高风险 (HIGH) → 告警 + 标记
├─► 2 人 → 距离 ≥ 25%帧宽 → 中风险 (MEDIUM) → 记录 + 告警
└─► 3+ 人 → 高风险 (HIGH) → 告警 + 标记
│
▼
输出: 标注画面 + 严重等级 + AI分析报告 + 事件记录
| 模块文件 | 功能说明 |
|---|---|
src/yolo_detector.py |
YOLOv8-Pose 检测器核心:模型加载、训练、预测、骨架与边界框绘制 |
src/fight_detection_system.py |
斗殴检测业务逻辑:严重程度评估、单图/视频/批量/实时帧处理 |
src/llava_analyzer.py |
LLaVA 多模态大模型接口:暴力行为深度语义分析 |
src/history_manager.py |
事件记录数据库:SQLite 存储、查询统计、CSV 导出 |
src/web_interface_advanced.py |
Gradio Web 界面:6 个功能 Tab 的完整交互逻辑 |
src/gpu_utils.py |
GPU 硬件检测与信息格式化工具 |
| 脚本 | 用途 |
|---|---|
train.py |
模型训练入口:自动分割数据集并启动训练 |
detect.py |
命令行检测入口:支持单张/批量检测 |
validate.py |
模型验证入口:输出 mAP 等评估指标 |
run_web_advanced.py |
Web 界面启动器 |
prepare_fight_dataset.py |
数据集准备脚本:原始数据 → 训练/验证集 |
YOLOv8-Pose 是 Ultralytics 在 YOLOv8 目标检测架构基础上扩展的姿态估计模型。与标准 YOLOv8 不同,姿态估计模型在检测边界框的同时预测每个人体实例的 17 个 COCO 关键点及其置信度。
本系统选用 yolov8n-pose.pt(nano 版本)作为基础模型,该模型在 COCO-Pose 数据集上预训练,具备良好的人体姿态先验知识。通过在 Aggressive_Poses_Dataset 上进行迁移学习微调,模型能够有效识别监控画面中的攻击性姿态。
关键训练参数:
- 输入尺寸:640×640 像素
- 优化器:SGD with momentum
- 学习率策略:余弦退火衰减
- 早停机制:patience=30(30 轮无改善自动停止)
- 混合精度训练:AMP 自动混合精度(加速训练、降低显存占用)
本系统设计了基于多人空间关系的斗殴严重程度评估算法:
算法:斗殴严重程度评估
输入:检测到的人员列表 detections,帧宽度 frame_width
输出:严重等级 (LOW/MEDIUM/HIGH),描述文本
1. count = len(detections)
2. if count == 0:
return "NONE"
3. if count >= 3:
return "HIGH", "多人斗殴" // 3人及以上直接判定为高危
4. if count == 2:
// 计算两人的中心点距离
cx1, cy1 = (bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2
cx2, cy2 = (bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2
dist = sqrt((cx1 - cx2)^2 + (cy1 - cy2)^2)
close_threshold = frame_width * 0.25 // 帧宽的25%为近距离阈值
if dist < close_threshold:
return "HIGH", "近距离扭打"
else:
return "MEDIUM", "可疑活动"
5. if count == 1:
return "LOW", "攻击性个体"
阈值设定依据:当两人中心距离小于画面宽度的 25% 时,考虑到人体边界框本身约占画面宽度的 10%-15%,此时两个边界框已大量重叠,极可能发生肢体接触,应判定为近距离扭打。
系统采用 欧氏距离 度量两人之间的空间接近程度:
其中
系统可选集成 LLaVA(Large Language and Vision Assistant)多模态大模型,通过 Ollama 本地部署,对检测到事件的画面进行深度语义分析。LLaVA 能够理解画面中的人物交互关系、肢体动作语义,并生成专业的暴力行为评估报告,包括:
- 姿态识别:判断攻击性姿态类型(出拳、踢腿、推搡、扭打等)
- 人数确认:识别画面中的涉事人员数量
- 暴力等级评估:轻度推搡 / 中度肢体冲突 / 重度斗殴
- 处置建议:人工介入、报警、疏散等安保措施建议
| 功能模块 | 说明 |
|---|---|
| 单张监控画面分析 | 上传图片,检测攻击性姿态,可视化骨架,评估严重等级 |
| 批量监控截图筛查 | 批量上传多张图片,批量检测并生成结果 ZIP 包 |
| 录像分析 | 上传视频文件,逐帧检测并输出标注后的视频 |
| 实时视频流监控 | 接入摄像头,实时流式检测斗殴行为 |
| 事件记录管理 | 查看、导出、清空历史检测记录 |
| 模型训练 | Web 界面直接启动模型微调,实时查看训练进度 |
| 等级 | 条件 | 视觉标识 | 响应方式 |
|---|---|---|---|
| 高 (HIGH) | 3 人以上 或 2 人近距离扭打 | 深红色 (#dc2626) | 记录 + 蜂鸣告警 + 屏幕标记 |
| 中 (MEDIUM) | 2 人中等距离 | 橙色 (#f59e0b) | 记录 + 蜂鸣告警 |
| 低 (LOW) | 1 人攻击性姿态 | 黄色 (#eab308) | 仅记录事件 |
| 无 (NONE) | 未检测到人员 | 绿色 (#10b981) | 无操作 |
| 依赖项 | 版本要求 | 说明 |
|---|---|---|
| Python | 3.9 - 3.11 | 推荐 3.10 |
| PyTorch | 2.1.2+ (CUDA 11.8) | GPU 训练推荐,CPU 推理可用 |
| CUDA | 11.8 (可选) | GPU 加速需要 NVIDIA 显卡 |
| Ultralytics | 8.3.162 | YOLOv8 核心框架 |
| Gradio | 4.8.0 | Web 界面框架 |
| OpenCV | 4.12.0 | 图像与视频处理 |
| Ollama | 最新版 (可选) | LLaVA 多模态分析依赖 |
cd APDpip install -r requirements.txt核心依赖将自动安装:torch, ultralytics, gradio, opencv-python, numpy, pandas, PyYAML, Pillow
如需启用 AI 深度暴力行为分析功能:
# 访问 https://ollama.com 下载并安装 Ollama
ollama pull llava# 分割数据集
python prepare_fight_dataset.py
# 开始训练(CPU)
python train.py --epochs 200 --batch 8
# 开始训练(GPU - 需修改 config.yaml 中 device 为 0)
python train.py --epochs 200 --batch 16训练完成后,最佳模型权重将保存在 runs/train/fight_detect/weights/best.pt。
python run_web_advanced.py在浏览器中访问 http://localhost:7860 即可使用。
默认配置使用 CPU 进行推理和训练。如需启用 GPU 加速:
- 编辑
config.yaml,将yolov8.train.device修改为0(单卡)或0,1(多卡); - 确保 CUDA 版本与 PyTorch 版本兼容;
- 训练时使用
python check_gpu.py验证 GPU 可用性。
系统通过 config.yaml 进行全局配置,关键配置项:
- yolov8.model_size:模型规格(n/s/m/l/x),影响精度与速度的权衡
- yolov8.train.epochs:训练轮数,小数据集建议 200
- yolov8.train.batch_size:批次大小,CPU 建议 8,GPU 可调至 16-32
- yolov8.train.device:
cpu或 GPU 索引0 - yolov8.inference.conf_threshold:检测置信度阈值(默认 0.4)
- llava.ollama_model:LLaVA 模型名称
- web.port:Web 界面端口号
- system.output_dir:检测结果输出目录
- 打开 Web 界面,进入「单张监控画面」标签页;
- 上传监控截图(支持 JPG/PNG)、粘贴剪贴板图片或使用摄像头拍照;
- 调节「检测灵敏度」滑块(建议 0.35-0.5,值越低越敏感);
- 可选勾选「AI 深度行为分析」以启用 LLaVA 分析;
- 点击「立即扫描」;
- 查看标注结果与 AI 评估报告。
- 进入「批量监控截图」标签页;
- 上传多张监控截图;
- 点击「开始扫描」;
- 下载
fight_results.zip获取全部标注结果; - 查看事件统计表格。
- 进入「录像分析」标签页;
- 上传视频文件(支持 MP4/AVI/MOV/MKV);
- 点击「分析视频」;
- 查看并下载标注后的视频。
- 进入「实时视频流监控」标签页;
- 点击「启动监控」以激活摄像头;
- 系统实时检测画面中的攻击性姿态并标注;
- 点击「停止监控」以关闭摄像头。
- 进入「事件记录」标签页;
- 查看监控概览统计数据;
- 点击「导出 CSV」下载事件记录;
- 点击「刷新」更新记录列表;
- 点击「清空记录」删除所有历史数据。
- 进入「模型训练」标签页;
- 点击「检查硬件环境」确认设备信息;
- 设置训练参数(训练轮数、批次大小等);
- 点击「启动训练」开始微调;
- 实时查看训练进度与终端日志;
- 训练完成后点击「重载模型」加载最佳权重。
在 Aggressive_Poses_Dataset 上使用 yolov8n-pose.pt 预训练权重进行微调:
| 指标 | 数值 |
|---|---|
| mAP@50 | 0.995 |
| mAP@50-95 | 0.946 |
| 训练集 | 83 张 |
| 验证集 | 20 张 |
| 训练轮数 | 200 |
| 批次大小 | 8 |
| 输入尺寸 | 640×640 |
| 训练设备 | CPU |
系统在多类测试场景下的检测表现:
- 单人攻击性姿态:置信度 > 90%,骨架可视化准确
- 双人近距离场景:正确识别为高风险,两人边界框中心距离 < 25% 帧宽
- 多人场景(3+):自动判定为多人斗殴,触发最高级别告警
APD/
├── config.yaml # 系统全局配置文件
├── requirements.txt # Python 依赖清单
├── README.md # 项目文档(本文档)
│
├── train.py # 训练入口脚本
├── detect.py # 命令行检测入口
├── validate.py # 模型验证入口
├── run_web_advanced.py # Web 界面启动器
├── prepare_fight_dataset.py # 数据集预处理脚本
├── check_gpu.py # GPU 环境检测
│
├── src/ # 核心源代码
│ ├── __init__.py # 模块导出
│ ├── yolo_detector.py # YOLOv8-Pose 检测器
│ ├── fight_detection_system.py # 斗殴检测核心逻辑
│ ├── llava_analyzer.py # LLaVA 多模态分析器
│ ├── history_manager.py # 事件记录数据库
│ ├── web_interface_advanced.py # Gradio Web 界面
│ └── gpu_utils.py # GPU 工具函数
│
├── data/ # 数据集
│ ├── Aggressive_Poses_Dataset/ # 原始数据集 (103 张)
│ │ ├── data.yaml
│ │ ├── images/ # 原始图片
│ │ └── labels/ # 关键点标注
│ └── fight_dataset/ # 训练/验证集 (80/20 分割)
│ ├── data.yaml
│ ├── images/
│ │ ├── train/ # 训练图片 (83 张)
│ │ └── val/ # 验证图片 (20 张)
│ └── labels/
│ ├── train/ # 训练标签
│ └── val/ # 验证标签
│
├── outputs/ # 检测结果输出
├── runs/ # 模型训练输出
│ └── train/fight_detect/weights/
│ └── best.pt # 最佳模型权重
├── logs/ # 系统日志
└── models/ # 模型存储







