基于视频分类的打架识别

项目说明

2020年全球安防镜头出货量达3.75亿。随着安防摄像头覆盖范围越来越广,通过人工监视镜头画面识别异常行为变得不太现实。AI+安防,智慧城市解决方案受到了越来越多的关注。

图1 全球安防镜头出货量

本项目基于PaddleVideo视频开发套件训练打架识别模型,然后将训练好的模型集成到PaddleDetection的PP-Human中,助力行人行为分析。

项目难点:

  • 行为的动态性:相比于基于静态图像就能判断的行为,如打球、打电话等,打架对时序有着较强的依赖。利用目标检测技术去识别打架行为容易出现误检或者漏检的情况。因此需要引入时序信息来判定是否有打架行为发生。
  • 人员的密集性:监控画面中的人的数目存在多变的情况,如火车站、超市等区域人流量较大,基于骨骼点进行行为识别对骨骼点提取的精准度有着较强的依赖。所以如果人员较密集,则基于骨骼点技术识别打架行为存在着局限性。
  • 环境的复杂性:监控场景多样,如白天、晚上,室内、室外,多种拍摄角度拍摄距离等,这些都对模型的泛化性能提出了更高的要求。
图2 密集人群骨骼点提取局限性(注:图片来自UBI FIGHTS数据集)

安装说明

本项目依赖PaddleVideo和PaddleDetection两个开发套件,下面一一进行安装。

PaddleVideo安装

下载PaddleVideo源码:

# 速度可能较慢
!git clone https://github.com/PaddlePaddle/PaddleVideo.git

或直接解压本项目提供的源码:

%cd /home/aistudio
!unzip PaddleVideo-develop.zip
!mv PaddleVideo-develop PaddleVideo

安装依赖库:

%cd /home/aistudio/PaddleVideo
!pip install --upgrade -r requirements.txt

PaddleDetection安装

本项目提供了用到的PaddleDetection代码,直接解压即可使用:

%cd /home/aistudio
!unzip /home/aistudio/data/data156736/PaddleDetection-develop.zip -d /home/aistudio/

安装环境:

%cd /home/aistudio/PaddleDetection-develop/
!pip install -r requirements.txt
# 编译安装paddledet
!python setup.py install

数据准备

本项目为大家提供了5个公开数据集合并后的数据。5个公开数据集具体如下:

图3 5个公开数据集详情

总共包含打架视频1980个,非打架视频1871个,共3851个视频。数据下载:https://aistudio.baidu.com/aistudio/datasetdetail/149085 。

由于数据量较大,下面的实验仅基于少量数据演示。数据的存放目录为:work/dataset。

为了加快训练速度,将视频进行抽帧。此处借助PaddleVideo套件实现。

%cd /home/aistudio/PaddleVideo
!python data/ucf101/extract_rawframes.py /home/aistudio/work/dataset/ \
   /home/aistudio/work/rawframes/ --level 2 --ext mp4

接下来将视频按照0.8:0.2的比例划分成训练集和测试集:

%cd /home/aistudio
/home/aistudio
import os
import glob
import random
import fnmatch
import re

class_id = {
    "nofight":0,
    "fight":1
}

def get_list(path,key_func=lambda x: x[-11:], rgb_prefix='img_', level=1):
    if level == 1:
        frame_folders = glob.glob(os.path.join(path, '*'))
    elif level == 2:
        frame_folders = glob.glob(os.path.join(path, '*', '*'))
    else:
        raise ValueError('level can be only 1 or 2')

    def count_files(directory):
        lst = os.listdir(directory)
        cnt = len(fnmatch.filter(lst, rgb_prefix + '*')) 
        return cnt

    # check RGB
    video_dict = {}
    for f in frame_folders:
        cnt = count_files(f)
        k = key_func(f)
        if level==2:
            k = k.split("/")[0]

        video_dict[f]=str(cnt)+" "+str(class_id[k])
    
    return video_dict

def fight_splits(video_dict, train_percent=0.8):
    videos = list(video_dict.keys())

    train_num = int(len(videos)*train_percent)

    train_list = []
    val_list = []

    random.shuffle(videos)

    for i in range(train_num):
        train_list.append(videos[i]+" "+str(video_dict[videos[i]]))
    for i in range(train_num,len(videos)):
        val_list.append(videos[i]+" "+str(video_dict[videos[i]]))

    print("train:",len(train_list),",val:",len(val_list))
    
    with open("fight_train_list.txt","w") as f:
        for item in train_list:
            f.write(item+"\n")
    
    with open("fight_val_list.txt","w") as f:
        for item in val_list:
            f.write(item+"\n")

frame_dir = "/home/aistudio/work/rawframes"
level = 2
train_percent = 0.8 

if level == 2:
    def key_func(x):
        return '/'.join(x.split('/')[-2:])
else:
    def key_func(x):
        return x.split('/')[-1]

video_dict = get_list(frame_dir, key_func=key_func, level=level)    
print("number:",len(video_dict))

fight_splits(video_dict, train_percent)

number: 5
train: 4 ,val: 1

生成fight_train_list.txt和fight_val_list.txt两个文件。

模型选择

行为识别常用的技术有检测技术、骨骼点技术、时空动作检测技术等,下面简单介绍了这三种技术在打架识别任务中的局限性:

  • 检测技术:缺少时序信息,容易出现误检或漏检的情况。
  • 骨骼点技术:人员密集骨骼点提取效果不好,对最终识别结果造成影响。
  • 时空动作检测技术:速度慢、难度高,实际应用非必需。

基于视频分类的方法进行打架识别可以利用时序信息和场景信息,泛化能力相对较强,而且推理速度适当。因此,本项目采用基于视频分类的方法识别打架行为。

考虑到速度和精度,本项目采用具有飞桨特色的高精度2D实用视频分类模型PP-TSM模型进行视频二分类。

模型训练

下载预训练模型:

%cd /home/aistudio/
!wget https://videotag.bj.bcebos.com/PaddleVideo/PretrainModel/ResNet50_vd_ssld_v2_pretrained.pdparams

模型训练:

# 单卡训练
%cd /home/aistudio/PaddleVideo/
!python main.py --validate -c /home/aistudio/pptsm_fight_frames_dense.yaml
# 多卡训练
!export CUDA_VISIBLE_DEVICES=0,1,2,3
!python -B -m paddle.distributed.launch --gpus=0,1,2,3” \
   --log_dir=log_pptsm_dense  main.py  --validate \
   -c /home/aistudio/pptsm_fight_frames_dense.yaml

模型评估

本项目提供了训练好的模型,路径为:/home/aistudio/ppTSM_fight_VideoMix_target_size_320_best.pdparams。

%cd /home/aistudio/PaddleVideo/
!python main.py --test -c /home/aistudio/pptsm_fight_frames_dense.yaml \
   -w /home/aistudio/ppTSM_fight_best.pdparams

模型推理

导出inference模型:

%cd /home/aistudio/PaddleVideo/
!python tools/export_model.py -c /home/aistudio/pptsm_fight_frames_dense.yaml \
                                -p /home/aistudio/ppTSM_fight_best.pdparams \
                                -o inference/ppTSM

使用预测引擎推理:

%cd /home/aistudio/PaddleVideo/
!python tools/predict.py --input_file /home/aistudio/work/fight.mp4 \
                           --config /home/aistudio/pptsm_fight_frames_dense.yaml \
                           --model_file inference/ppTSM/ppTSM.pdmodel \
                           --params_file inference/ppTSM/ppTSM.pdiparams \
                           --use_gpu=True \
                           --use_tensorrt=False

模型优化

VideoMix

VideoMix是视频数据增强的方法之一,是对图像数据增强CutMix的扩展,可以缓解模型的过拟合问题。

与Mixup将两个视频片段的每个像素点按照一定比例融合不同的是,VideoMix是每个像素点要么属于片段A要么属于片段B。输出结果是两个片段原始标签的加权和,权重是两个片段各自的比例。

在配置文件中对应:

MIX:
    name: "VideoMix"
    cutmix_prob: 0.5
    mixup_alpha: 0.2
    cutmix_alpha: 1.0

本项目在baseline的基础上加入VideoMix数据增强后,精度由87.53%提升至88.01%。

更大的分辨率

由于监控摄像头角度、距离等问题,存在监控画面下人比较小的情况,小目标行为的识别较困难,本项目尝试增大输入图像的分辨率,具体修改如下:

transform: #Mandotary, image transfrom operator
            - Scale:
                short_size: 340 #256
            - MultiScaleCrop:
                target_size: 340 #256
            - RandomCrop:
                target_size: 320 #224
            - RandomFlip:
            - Image2Array:
            - Normalization:
                mean: [0.485, 0.456, 0.406]
                std: [0.229, 0.224, 0.225]

通过增大输入图像分辨率,模型精度由88.01%提升至89.06%。

基于PaddleDetection pipeline实现打架识别

将打架识别功能整合到PaddleDetection的PP-Human中,助力行人行为分析。

开启打架识别功能需修改配置文件deploy/pipeline/config/infer_cfg_pphuman.yml中VIDEO_ACTION的enable为True

下载打架识别预测部署模型,并解压:

%cd /home/aistudio/PaddleDetection-develop/
!wget https://videotag.bj.bcebos.com/PaddleVideo-release2.3/ppTSM_fight.zip
!mkdir /home/aistudio/PaddleDetection-develop/output_inference
!unzip ppTSM_fight.zip -d /home/aistudio/PaddleDetection-develop/output_inference

运行下面的命令进行打架识别,参数说明如下:

  • config:配置文件路径;
  • video_file:视频路径;
  • device:推理环境。
%cd /home/aistudio/PaddleDetection-develop/
# 打架识别,指定配置文件路径和测试视频
!python deploy/pipeline/pipeline.py --config deploy/pipeline/config/infer_cfg_pphuman.yml \
 --video_file=/home/aistudio/work/72.mp4 \
 --device=gpu 

输出结果在/home/aistudio/PaddleDetection-develop/output/文件夹中。

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐