基于机器学习的监控视频中人类异常行为检测小程序。
这个程序能做的事就是读取一段视频流,然后判断内容是否属于异常行为。
利用高斯核对视频的帧进行背景减差,做镜像翻转以扩充样本,并分类存放。
效果大概如下图所示:
如下图所示:
(训练阶段已完成,过程可以通过代码了解)
模型与Tensorboard: http://pan.baidu.com/s/1jHPdMFc
分类和预处理好的数据: http://pan.baidu.com/s/1kV1B0sZ
将数据和模型解压到根目录下,然后在UI内操作,每隔5帧启动一个20帧的SEQ用来预测:
python UI_video.py
cd ActionDetection
tensorboard --logdir=Board/
模型是收敛的。 单帧预训练的TensorBoard如下:
Loss/Validation
Accuracy
Accuracy_validation
硬件:i7-6700HQ + GTX1060 + 16G DDR4
系统与组件:Win10-64-bit + Cuda-8.0 + Anaconda3-4.1.1 (Python3.5 .ver)
软件包:Tensorflow-gpu-1.0 + Tflearn-0.3.0 + OpenCV-3.2.0 + Numpy-1.12.0
ICPR 2010 Contest on Semantic Description of Human Activities (SDHA 2010)
相关链接:SDHA 2010
单帧预训练:AlextNet (tflearn, 步长0.001)
概率序列训练:双隐层网络 (tensorflow)
用于存放Tensorboard文件
用于存放单帧图训练集, 存放格式为:
---- / binary_frame
--- /0
-- 1.png
-- 2.png
..
--- /1
-- 3.png
-- 4.png
..
--- /2
-- 5.png
-- 6.png
..
...
...
...
本项目有六个类别,对应 0~5 :['handshake', 'hug', 'kick', 'quiet', 'hit', 'push']
文件夹下有两个文件:
1, seq.csv, 第一次预训练后,对每个视频隔帧取得的概率序列
2, video_labels.csv, 整段视频原有的标签(正常0, 异常1),用作第二次训练的标签
预训练时Tflearn使用build_image_dataset_from_dir()产生的dataset文件(data.pkl)
所有视频每隔5帧取一帧,帧上注明该帧所属的视频序号和帧数
文件存放格式:
---- /frame2
--- 0_5.png
--- 0_10.png
...
--- 5_15.png
--- 5_20.png
...
用于存放第一次训练结束后的tflearn model
用于存放第二次训练结束后的 tensorflow model
所有视频文件,存放格式为:
---- /video
--- 0_1_4.avi
--- 0_11_4.avi
--- 1_1_2.avi
...
1, 读取/video下的视频单帧
2, 执行镜像和背景减除操作
3, 存入对应标签的文件夹 /binary_frame
1, 对/binary_frame下的单帧图进行预训练
2, 并将结果模型存入/model_alexnet
3, 并对/frame2下所有视频对应的单帧打上概率标签
4, 将每个视频对应的标签概率序列写入seq.csv
5, 将seq.csv存入/csv_file
1,/video下的视频对应的标签写于/csv_file/video_labels.csv
2,每个视频的概率序列已由Generate_data生成于seq.csv
3,将seq.csv作为训练集,video_labels.csv作为标签,使用双隐层进行训练
4,训练结果模型存入/model_nn
二次训练的预测模块
启动一个PYQT5写成的简单UI,可以读取视频文件并进行预测