深度学习-智能视频监控

深度学习-智能视频监控

Deep Surveillance with Deep Learning – Intelligent Video Surveillance

原文地址:

https://data-flair.training/blogs/deep-surveillance-with-deep-learning-intelligent-video-surveillance-project/

监视安全是一项非常乏味和耗时的工作。在本文中,将构建一个自动分析视频监视任务的系统。将实时分析视频反馈,并识别任何异常活动,如暴力或盗窃。             

其中,视频监控行业正在进行大量的研究,央视视频的作用已经过大。监控和保安的地方到处都有闭路电视摄像机。             

近十年来,用于深度监视的深度学习算法有了很大的发展。这些进展已显示出深入监视的一个基本趋势,并有望大幅提高效率。深度监视的典型应用是盗窃识别、暴力检测和爆炸机会检测。

Intelligent Video Surveillance with Deep Learning

 

将使用时空编码器来识别异常活动。

网络架构             

通常看到用于计算机视觉、图像分类和目标检测任务的深层神经网络。在这个项目中,必须将深度神经网络扩展到三维,以学习视频馈送的时空特征。             

针对这个视频监控项目,将介绍一种基于三维卷积网络的时空自动编码器。编码器部分提取空间和时间信息,然后解码器重构帧。利用重建批次与原始批次之间的欧氏距离计算重建损失,识别异常事件。

 

视频监控异常事件检测数据集 The dataset for abnormal event detection in video surveillance

以下是用于训练异常检测任务模型的综合数据集。

CUHK Avenue Dataset

这个数据集包含16个训练和21个测试视频片段。视频总共包含30652帧。             

训练视频包含正常情况下的视频。测试视频包含标准和异常事件视频。             

数据集下载链接:

http://www.cse.cuhk.edu.hk/leojia/projects/detectabnormal/dataset.html

UCSD pedestrian Dataset

这个数据集包含行人视频。包括一组走向、离开和平行于摄像机的人。

异常事件包括              

非行人实体             

异常行人运动模式             

数据集下载链接:http://www.svcl.ucsd.edu/projects/anomaly/dataset.html

Project Source Code

在继续之前,请下载在这个深度学习项目中使用的源代码:视频监控项目代码

Video Surveillance – Anomaly Even Detection Code

视频监控-异常偶数检测代码:

首先,下载上述任何一个数据集并将其放入名为“train”的目录中。

生成新的python文件train.py并粘贴以下步骤中描述的代码:
一. Imports

1.   from keras.preprocessing.image import img_to_array,load_img

2.   import numpy as np

3.   import glob

4.   import os

5.   from scipy.misc import imresize

6.    

7.   from keras.layers import Conv3D,ConvLSTM2D,Conv3DTranspose

8.   from keras.models import Sequential

9.   from keras.callbacks import ModelCheckpoint, EarlyStopping

10. import imutils

二. 初始化目录路径变量并描述处理和存储视频帧的函数Initialize directory path variable and describe a function to process and store video frames:

1.   store_image=[]

2.   train_path='./train'

3.   fps=5

4.   trian_videos=os.listdir('train_path')

5.   train_images_path=train_path+'/frames'

6.   os.makedir(train_images_path)

7.    

8.   def store_inarray(image_path)

9.   image=load_img(image_path)

10. image=img_to_array(image)

11. image=cv2.resize(image, (227,227), interpolation = cv2.INTER_AREA)

12. gray=0.2989*image[:,:,0]+0.5870*image[:,:,1]+0.1140*image[:,:,2]

13. store_image.append(gray)

三. Extract frames from video and call store function:

1.   for video in train_videos:

2.   os.system( 'ffmpeg -i {}/{} -r 1/{} {}/frames/%03d.jpg'.format(train_path,video,fps,train_path))

3.   images=os.listdir(train_images_path)

4.   for image in images:

5.   image_path=framepath+ '/'+ image

6.   store_inarray(image_path)

四. Store the store_image list in a numpy file “training.npy”

1.   store_image=np.array(store_image)

2.   a,b,c=store_image.shape

3.    

4.   store_image.resize(b,c,a)

5.   store_image=(store_image-store_image.mean())/(store_image.std())

6.   store_image=np.clip(store_image,0,1)

7.   np.save('training.npy',store_image)

五. Create spatial autoencoder architecture

1.   stae_model=Sequential()

2.    

3.   stae_model.add(Conv3D(filters=128,kernel_size=(11,11,1),strides=(4,4,1),padding='valid',input_shape=(227,227,10,1),activation='tanh'))

4.   stae_model.add(Conv3D(filters=64,kernel_size=(5,5,1),strides=(2,2,1),padding='valid',activation='tanh'))

5.   stae_model.add(ConvLSTM2D(filters=64,kernel_size=(3,3),strides=1,padding='same',dropout=0.4,recurrent_dropout=0.3,return_sequences=True))

6.   stae_model.add(ConvLSTM2D(filters=32,kernel_size=(3,3),strides=1,padding='same',dropout=0.3,return_sequences=True))

7.   stae_model.add(ConvLSTM2D(filters=64,kernel_size=(3,3),strides=1,return_sequences=True, padding='same',dropout=0.5))

8.   stae_model.add(Conv3DTranspose(filters=128,kernel_size=(5,5,1),strides=(2,2,1),padding='valid',activation='tanh'))

9.   stae_model.add(Conv3DTranspose(filters=1,kernel_size=(11,11,1),strides=(4,4,1),padding='valid',activation='tanh'))

10.  

11. stae_model.compile(optimizer='adam',loss='mean_squared_error',metrics=['accuracy'])

六. Train the autoencoder on the “training.npy” file and save the model with name “saved_model.h5”

1.   training_data=np.load('training.npy')

2.   frames=training_data.shape[2]

3.   frames=frames-frames%10

4.    

5.   training_data=training_data[:,:,:frames]

6.   training_data=training_data.reshape(-1,227,227,10)

7.   training_data=np.expand_dims(training_data,axis=4)

8.   target_data=training_data.copy()

9.    

10. epochs=5

11. batch_size=1

12.  

13. callback_save = ModelCheckpoint("saved_model.h5", monitor="mean_squared_error", save_best_only=True)

14.  

15. callback_early_stopping = EarlyStopping(monitor='val_loss', patience=3)

16.  

17. stae_model.fit(training_data,target_data, batch_size=batch_size, epochs=epochs, callbacks = [callback_save,callback_early_stopping])

18. stae_model.save("saved_model.h5")

运行此脚本以训练并保存自动编码器模型。             

现在制作另一个python文件“train.py“并在任何自定义视频上观察异常事件检测的结果。将下面的代码粘贴到“train.py”

  1. import cv2
  2. import numpy as np
  3. from keras.models import load_model
  4. import argparse
  5. from PIL import Image
  6. import imutils
  7.  
  8.  
  9. def mean_squared_loss(x1,x2):
  10. difference=x1-x2
  11. a,b,c,d,e=difference.shape
  12. n_samples=a*b*c*d*e
  13. sq_difference=difference**2
  14. Sum=sq_difference.sum()
  15. distance=np.sqrt(Sum)
  16. mean_distance=distance/n_samples
  17.  
  18. return mean_distance
  19.  
  20.  
  21. model=load_model("saved_model.h5")
  22.  
  23. cap = cv2.VideoCapture("__path_to_custom_test_video")
  24. print(cap.isOpened())
  25.  
  26. while cap.isOpened():
  27. imagedump=[]
  28. ret,frame=cap.read()
  29.  
  30. for i in range(10):
  31. ret,frame=cap.read()
  32. image = imutils.resize(frame,width=700,height=600)
  33.  
  34. frame=cv2.resize(frame, (227,227), interpolation = cv2.INTER_AREA)
  35. gray=0.2989*frame[:,:,0]+0.5870*frame[:,:,1]+0.1140*frame[:,:,2]
  36. gray=(gray-gray.mean())/gray.std()
  37. gray=np.clip(gray,0,1)
  38. imagedump.append(gray)
  39.  
  40. imagedump=np.array(imagedump)
  41.  
  42. imagedump.resize(227,227,10)
  43. imagedump=np.expand_dims(imagedump,axis=0)
  44. imagedump=np.expand_dims(imagedump,axis=4)
  45.  
  46. output=model.predict(imagedump)
  47.  
  48. loss=mean_squared_loss(imagedump,output)
  49.  
  50. if frame.any()==None:
  51. print("none")
  52.  
  53. if cv2.waitKey(10) & 0xFF==ord('q'):
  54. break
  55. if loss>0.00068:
  56. print('Abnormal Event Detected')
  57. cv2.putText(image,"Abnormal Event",(100,80),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),4)
  58.  
  59. cv2.imshow("video",image)
  60.  
  61. cap.release()
  62. cv2.destroyAllWindows()

现在,运行这个脚本并观察视频监控的结果,将突出显示异常事件。

 

Summary

在这个深度学习项目中,训练一个异常事件侦测的自动编码器。在普通视频上训练自动编码器。根据自定义视频源的欧氏距离和自动编码器预测的帧来识别异常事件。             

为异常事件设置了一个阈值。在这个项目中,是0.0068;可以改变这个阈值来实验获得更好的结果。

posted @ 2020-06-18 19:06  吴建明wujianming  阅读(1070)  评论(0编辑  收藏  举报