基于视频分类的打架识别
项目说明
2020年全球安防镜头出货量达3.75亿。随着安防摄像头覆盖范围越来越广,通过人工监视镜头画面识别异常行为变得不太现实。AI+安防,智慧城市解决方案受到了越来越多的关注。
本项目基于PaddleVideo视频开发套件训练打架识别模型,然后将训练好的模型集成到PaddleDetection的PP-Human中,助力行人行为分析。
项目难点:
- 行为的动态性:相比于基于静态图像就能判断的行为,如打球、打电话等,打架对时序有着较强的依赖。利用目标检测技术去识别打架行为容易出现误检或者漏检的情况。因此需要引入时序信息来判定是否有打架行为发生。
- 人员的密集性:监控画面中的人的数目存在多变的情况,如火车站、超市等区域人流量较大,基于骨骼点进行行为识别对骨骼点提取的精准度有着较强的依赖。所以如果人员较密集,则基于骨骼点技术识别打架行为存在着局限性。
- 环境的复杂性:监控场景多样,如白天、晚上,室内、室外,多种拍摄角度拍摄距离等,这些都对模型的泛化性能提出了更高的要求。
安装说明
本项目依赖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个公开数据集具体如下:
总共包含打架视频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 reclass_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 RGBvideo_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_dictdef 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.5mixup_alpha: 0.2cutmix_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/文件夹中。
此文章为搬运
原项目链接