YOLOv8-Pose 姿态估计 | 实时暴力行为检测 | AI 智能监控

github地址:https://github.com/wuyoueeee/APD


在这里插入图片描述

摘要

随着社会公共安全需求的日益增长,智能视频监控技术在城市安防体系中扮演着愈发重要的角色。传统的视频监控依赖人工目视巡检,存在效率低、响应慢、漏检率高等问题。本文设计并实现了一套基于 YOLOv8-Pose 人体关键点检测的斗殴行为智能监控系统,通过对监控画面中人体 17 个 COCO 关键点的提取与分析,自动识别攻击性姿态和暴力行为。系统采用多人贴近度分析算法,对斗殴严重程度进行三级分级评估(低/中/高),并支持单张图像分析、批量筛查、视频逐帧检测和实时摄像头流监控等多种工作模式。系统基于 Gradio 框架构建了专业的安防监控风格 Web 交互界面,支持 LLaVA 多模态大模型的深度暴力行为语义分析,以及事件记录的持久化存储与 CSV 导出。实验表明,系统在 Aggressive_Poses_Dataset 上训练后 mAP@50 达到 0.995,能够有效识别监控场景中的攻击性姿态和斗殴行为。

关键词:斗殴检测;姿态估计;YOLOv8-Pose;深度学习;智能监控;COCO关键点


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、研究背景与意义

1.1 研究背景

近年来,公共场所暴力事件频发,校园欺凌、街头斗殴、娱乐场所冲突等暴力行为对社会治安构成严重威胁。传统的视频监控系统存在以下不足:

  1. 被动监控:摄像头仅负责画面记录,无法主动识别正在发生的暴力行为;
  2. 人工巡检效率低:安保人员难以同时关注几十甚至上百路视频画面,响应延迟严重;
  3. 事后追责而非事前预防:大部分监控录像仅在事发后被调取,缺乏实时预警能力。

1.2 研究意义

本系统利用深度学习姿态估计技术,实现了对监控画面中人体攻击性姿态的自动检测,具有以下重要意义:

  • 实时预警:在暴力行为发生的第一时间触发告警,为安保人员争取宝贵的响应时间;
  • 降低人力成本:自动化检测替代人工巡检,显著降低安保运营成本;
  • 分级响应:根据斗殴严重程度(低/中/高)采取差异化处置策略,避免过度响应或响应不足;
  • 数据留存:完整记录每次检测事件的截图、时间戳与AI分析报告,形成可追溯的安防数据链。

二、数据集介绍

2.1 数据集来源

本系统使用的训练数据为 Simuletic - CCTV Aggressive Poses & Fight Detection Dataset,是一个专为监控场景下的攻击性姿态检测设计的小规模数据集。

2.2 数据格式

数据集采用 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 表示清晰可见。

2.3 COCO 17 关键点定义

数据集采用 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 下肢

2.4 骨架连接定义

系统在可视化时绘制 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) —— 髋-膝-踝连线

2.5 数据集统计

项目 数值
原始图片总数 103 张
训练集 83 张 (80%)
验证集 20 张 (20%)
类别数 1 类(person,攻击性姿态)
关键点数 17 个 COCO 关键点
标注格式 YOLO Pose (x, y, visibility)
图片场景 CCTV 监控视角
数据分割方式 随机打乱后按 80/20 比例分割
随机种子 42(保证可复现)

2.6 数据集目录结构

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 个)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、系统架构设计

3.1 总体架构

系统采用模块化分层架构设计,自上而下分为展示层、业务层、引擎层和数据层:

┌──────────────────────────────────────────────────────┐
│                    展示层 (Presentation)               │
│  Gradio Web UI  │  实时视频流  │  检测结果可视化        │
├──────────────────────────────────────────────────────┤
│                    业务层 (Business)                   │
│  斗殴检测调度  │  严重程度评估  │  LLaVA 深度分析       │
│  事件记录管理  │  CSV 导出     │  HTML 报告生成        │
├──────────────────────────────────────────────────────┤
│                    引擎层 (Engine)                     │
│  YOLOv8-Pose  │  骨架绘制  │  多人贴近度分析           │
│  Ultralytics  │  PyTorch   │  OpenCV                  │
├──────────────────────────────────────────────────────┤
│                    数据层 (Data)                       │
│  Aggressive Poses Dataset  │  SQLite 事件数据库        │
│  训练/验证/测试集  │  配置文件 (YAML)                   │
└──────────────────────────────────────────────────────┘

3.2 系统检测流程

监控画面输入
    │
    ▼
YOLOv8-Pose 姿态估计模型
    │
    ▼
17 关键点提取 + 人体边界框
    │
    ├─► 绘制红色骨架 (仅限攻击性姿态)
    ├─► 绘制红色边界框 + 置信度
    │
    ▼
多人贴近度分析
    │
    ├─► 1 人 → 低风险 (LOW)     → 记录事件
    ├─► 2 人 → 距离 < 25%帧宽  → 高风险 (HIGH)   → 告警 + 标记
    ├─► 2 人 → 距离 ≥ 25%帧宽  → 中风险 (MEDIUM)  → 记录 + 告警
    └─► 3+ 人                  → 高风险 (HIGH)   → 告警 + 标记
    │
    ▼
输出: 标注画面 + 严重等级 + AI分析报告 + 事件记录

3.3 代码模块划分

模块文件 功能说明
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 硬件检测与信息格式化工具

3.4 入口脚本

脚本 用途
train.py 模型训练入口:自动分割数据集并启动训练
detect.py 命令行检测入口:支持单张/批量检测
validate.py 模型验证入口:输出 mAP 等评估指标
run_web_advanced.py Web 界面启动器
prepare_fight_dataset.py 数据集准备脚本:原始数据 → 训练/验证集

四、核心技术

4.1 YOLOv8-Pose 姿态估计

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 自动混合精度(加速训练、降低显存占用)

4.2 斗殴严重程度评估算法

本系统设计了基于多人空间关系的斗殴严重程度评估算法:

算法:斗殴严重程度评估
输入:检测到的人员列表 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%,此时两个边界框已大量重叠,极可能发生肢体接触,应判定为近距离扭打。

4.3 多人贴近度分析

系统采用 欧氏距离 度量两人之间的空间接近程度:

d = ( c x 1 − c x 2 ) 2 + ( c y 1 − c y 2 ) 2 d = \sqrt{(cx_1 - cx_2)^2 + (cy_1 - cy_2)^2} d=(cx1cx2)2+(cy1cy2)2

其中 ( c x i , c y i ) (cx_i, cy_i) (cxi,cyi) 为第 i i i 个人体边界框的中心点坐标。通过判别人体边界框中心距离是否低于阈值,辅助判断多人是否存在扭打行为。

4.4 LLaVA 多模态深度分析(可选模块)

系统可选集成 LLaVA(Large Language and Vision Assistant)多模态大模型,通过 Ollama 本地部署,对检测到事件的画面进行深度语义分析。LLaVA 能够理解画面中的人物交互关系、肢体动作语义,并生成专业的暴力行为评估报告,包括:

  1. 姿态识别:判断攻击性姿态类型(出拳、踢腿、推搡、扭打等)
  2. 人数确认:识别画面中的涉事人员数量
  3. 暴力等级评估:轻度推搡 / 中度肢体冲突 / 重度斗殴
  4. 处置建议:人工介入、报警、疏散等安保措施建议

五、系统功能

5.1 功能总览

功能模块 说明
单张监控画面分析 上传图片,检测攻击性姿态,可视化骨架,评估严重等级
批量监控截图筛查 批量上传多张图片,批量检测并生成结果 ZIP 包
录像分析 上传视频文件,逐帧检测并输出标注后的视频
实时视频流监控 接入摄像头,实时流式检测斗殴行为
事件记录管理 查看、导出、清空历史检测记录
模型训练 Web 界面直接启动模型微调,实时查看训练进度

5.2 斗殴严重程度分级与响应策略

等级 条件 视觉标识 响应方式
高 (HIGH) 3 人以上 或 2 人近距离扭打 深红色 (#dc2626) 记录 + 蜂鸣告警 + 屏幕标记
中 (MEDIUM) 2 人中等距离 橙色 (#f59e0b) 记录 + 蜂鸣告警
低 (LOW) 1 人攻击性姿态 黄色 (#eab308) 仅记录事件
无 (NONE) 未检测到人员 绿色 (#10b981) 无操作

六、项目部署说明

6.1 环境要求

依赖项 版本要求 说明
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 多模态分析依赖

6.2 安装步骤

Step 1:克隆/解压项目
cd APD
Step 2:安装 Python 依赖
pip install -r requirements.txt

核心依赖将自动安装:torch, ultralytics, gradio, opencv-python, numpy, pandas, PyYAML, Pillow

Step 3:(可选)安装 Ollama 并拉取 LLaVA 模型

如需启用 AI 深度暴力行为分析功能:

# 访问 https://ollama.com 下载并安装 Ollama
ollama pull llava
Step 4:准备数据集并训练模型
# 分割数据集
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

Step 5:启动 Web 界面
python run_web_advanced.py

在浏览器中访问 http://localhost:7860 即可使用。

6.3 GPU 配置说明

默认配置使用 CPU 进行推理和训练。如需启用 GPU 加速:

  1. 编辑 config.yaml,将 yolov8.train.device 修改为 0(单卡)或 0,1(多卡);
  2. 确保 CUDA 版本与 PyTorch 版本兼容;
  3. 训练时使用 python check_gpu.py 验证 GPU 可用性。

6.4 配置文件说明

系统通过 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.devicecpu 或 GPU 索引 0
  • yolov8.inference.conf_threshold:检测置信度阈值(默认 0.4)
  • llava.ollama_model:LLaVA 模型名称
  • web.port:Web 界面端口号
  • system.output_dir:检测结果输出目录

七、使用手册

7.1 单张监控画面分析

  1. 打开 Web 界面,进入「单张监控画面」标签页;
  2. 上传监控截图(支持 JPG/PNG)、粘贴剪贴板图片或使用摄像头拍照;
  3. 调节「检测灵敏度」滑块(建议 0.35-0.5,值越低越敏感);
  4. 可选勾选「AI 深度行为分析」以启用 LLaVA 分析;
  5. 点击「立即扫描」;
  6. 查看标注结果与 AI 评估报告。

7.2 批量监控截图筛查

  1. 进入「批量监控截图」标签页;
  2. 上传多张监控截图;
  3. 点击「开始扫描」;
  4. 下载 fight_results.zip 获取全部标注结果;
  5. 查看事件统计表格。

7.3 录像分析

  1. 进入「录像分析」标签页;
  2. 上传视频文件(支持 MP4/AVI/MOV/MKV);
  3. 点击「分析视频」;
  4. 查看并下载标注后的视频。

7.4 实时视频流监控

  1. 进入「实时视频流监控」标签页;
  2. 点击「启动监控」以激活摄像头;
  3. 系统实时检测画面中的攻击性姿态并标注;
  4. 点击「停止监控」以关闭摄像头。

7.5 事件记录管理

  1. 进入「事件记录」标签页;
  2. 查看监控概览统计数据;
  3. 点击「导出 CSV」下载事件记录;
  4. 点击「刷新」更新记录列表;
  5. 点击「清空记录」删除所有历史数据。

7.6 模型训练

  1. 进入「模型训练」标签页;
  2. 点击「检查硬件环境」确认设备信息;
  3. 设置训练参数(训练轮数、批次大小等);
  4. 点击「启动训练」开始微调;
  5. 实时查看训练进度与终端日志;
  6. 训练完成后点击「重载模型」加载最佳权重。

八、实验结果

8.1 训练结果

在 Aggressive_Poses_Dataset 上使用 yolov8n-pose.pt 预训练权重进行微调:

指标 数值
mAP@50 0.995
mAP@50-95 0.946
训练集 83 张
验证集 20 张
训练轮数 200
批次大小 8
输入尺寸 640×640
训练设备 CPU

8.2 检测效果

系统在多类测试场景下的检测表现:

  • 单人攻击性姿态:置信度 > 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/                             # 模型存储

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐