一个项目让你实现智能监控摄像头
本文涉及内容
-
- 项目背景
-
- 传统方式实现
-
- 深度学习方式实现
-
- 总结
1.项目背景
-
视频监控主要硬件是摄像头,随着监控设备的近十年的快速更新换代,摄像头像素快速增长,高像素高帧率摄像头给我们带来高清视频监控效果的同时,也伴随着视频信息文件过大的问题。而在部分的安防和公共安全领域,如人脸打卡、刷脸支付、人流密度检测,车辆违规检测等,对检测视频信息的实时性要求高,高精度图像传输对网络带宽提出了极高的要求,且易造成网络拥堵,而网络一旦拥堵,传输受阻,返回数据延时则会产生一些无法预估的影响;在另外更常见的普通监控领域,如校内监控,长时间的监控包含的有用信息确较少,如学校在寒暑假时,校内监控24小时监控,但实际有用信息且很少,占据了过多的存储资源……这个时候如果我们在摄像头近端设置一个具有计算能力的边缘设备,在上传到云服务器前将收集到的信息进行一定的计算和过滤,如在监控领域只在检测到人时进行数据的储存/上传,则可以获得更快的相应时间,同时传输时对网络带宽的要求也会降低,达到更好的传输效果与实际体验感。
2.传统方式实现
传统方式主要是基于传统的图像方法进行筛选判断,在咱们智能监控,往往采用帧间差分法和三帧法来提取动态特征,随后再对提取出的特征进行膨胀与腐蚀和形态学闭环检测,来判断是否监控时是否有人移动,如果是,则将该帧信息判为有用信息;否则丢弃。那这里呢我就采用帧间差分法来实现。
2.1 帧间差分法原理
帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法。当监控场景中出现异常目标运动时,相邻两帧图像之间会出现较为明显的差别,两帧相减,求得图像对应位置像素值差的绝对值,判断其是否大于某一阈值,进而分析视频或图像序列的物体运动特性。其数学公式描述如下:
看公式还是比价easy好理解的吧,当然这里做两帧相减是在两帧图片都做了灰度化之后进行操作,这样可以避免不同通道的影响,生成的差值也可以直接用opencv的二值化函数处理,简简单单。
2.2 帧间差分法原理
原理比较好理解的话,那咱们就直接开始上手代码了,根据原理分析,首先我们得有一下几个步骤:
-
1.得有两帧连续的图像
-
2.两帧图像都得进行灰度化
-
3.将灰度化后的两帧图像相减
-
4.对相减后的图像进行滤波去除噪点
-
5.对4处理后的图像进行二值化得到输出图
-
可以看到中间2345步是每帧都需要的,所以直接给定义一个函数方便调用:
import cv2
def process(img1, img2, threshold):
gray_image_1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)#灰度化
gray_image_1 = cv2.GaussianBlur(gray_image_1, (9, 9), 0)#高斯滤波
gray_image_2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #灰度化
gray_image_2 = cv2.GaussianBlur(gray_image_2, (9, 9), 0)#高斯滤波
out = cv2.absdiff(gray_image_1, gray_image_2)#做差
ret,output = cv2.threshold(out, threshold, 255, cv2.THRESH_BINARY)#二值化
return output
capture = cv2.VideoCapture(0)
threshold = 5 #自己设置的阈值
flag = 0
while(True):
success, frame1 = capture.read()
if(flag == 0):
flag = 1
continue
if(success):
success2, frame2 = capture.read()
if(success2):
output = process(frame1, frame2, threshold)
cv2.imshow('output', output)
cv2.waitKey(10)
capture.release()
大家可以把程序复制到自己电脑上试试效果,如果效果不好可以调两个地方:
2.3 如何实现智能监控
-
大家把看明白跑了之后可以看到输出图的效果,动的地方会是白色,静止的地方是黑色,那如何去判断监控时到底有没有人过呢?
-
嘿嘿其实方法有很多,也是一个很激发大家想象力和创造力的一个问题,这里我提出一个可行的办法,大家也可以去基于自己摄像头场景提出自己的解决办法:
-
对于背景静止的监控场景,我的办法是统计输出图中白像素点的比例,当白色像素点占比大于某一值,则判断这帧图像上是有人的,就保留/储存/上传这张图。
3.深度学习方法实现
害呀这个问题抽象出来其实放到深度学习里也很easy,就是看这帧图里有没有人嘛,整个行人检测就行了。
但朋友们,并不是所有工业应用场合都能用上咱们aistudio里这么好的硬件,在多年其绝大多数传统场景下的硬件算力是非常差的,强大的模型带来的巨大算力和所需硬件成本都是工业实际需要考虑的。传统方式识别准不准呢?还行,深度学习能做到更好,但是更贵,现在也有很多办法去降低成本,就不是本项目讨论的内容了哈😊
继续回来看深度学习的实现,刚才说到行人检测,刚好咱们paddle里是直接有现成的行人检测模型pedestrian,整起来!
3.1 安装paddlehub
-
安装paddlehub==1.8.2 (paddlehub2.0.0有很多模型都没升级,不兼容)
-
如果升级不了可以换清华源:
pip install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
3.不直接用paddledetecion套件是因为我们需要在使用中接入更多的功能,paddledetection的接口不适合使用,paddlehub的接口更方便
!pip install paddlehub==1.8.2
3.2 装载模型
import paddlehub as hub
pedestrian_detector = hub.Module(name="yolov3_darknet53_pedestrian")
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/pandas/core/tools/datetimes.py:3: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import MutableMapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Iterable, Mapping
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Sized
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/nltk/decorators.py:68: DeprecationWarning: `formatargspec` is deprecated since Python 3.5. Use `signature` and the `Signature` object directly
regargs, varargs, varkwargs, defaults, formatvalue=lambda value: ""
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/nltk/lm/counter.py:15: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections import Sequence, defaultdict
[2021-02-14 16:57:48,324] [ INFO] - Installing yolov3_darknet53_pedestrian module
Downloading yolov3_darknet53_pedestrian
[==================================================] 100.00%
Uncompress /home/aistudio/.paddlehub/tmp/tmp_8qhu30s/yolov3_darknet53_pedestrian
[==================================================] 100.00%
[2021-02-14 16:58:05,321] [ INFO] - Successfully installed yolov3_darknet53_pedestrian-1.0.1
3.3 深度学习方式实现
装载好模型咱们就可以直接按照paddlehub预测的方式去使用了,步骤如下:
- 1.读到视频数据进行预测
- 2.遍历结果判断是否有结果置信度大于0.6的
- 3.如果有则认定监控该帧图像中有人经过,保存
import numpy as np
flag = 0
#保存的目标视频文件
out = cv2.VideoWriter('output1.avi',fourcc, 20.0, (640,480))
#读取的摄像头数据
capture = cv2.VideoCapture(0)
while True:
success,img=capure.read()
if np.max(img) is None:
break
img = cv2.resize(img,dsize=(480,600),fx=1,fy=1,interpolation=cv2.INTER_LINEAR)
result = pedestrian_detector.object_detection(images=[img])#直接进行预测
#遍历结果
for i in range(len(result[0]["data"])):
if(result[0]["data"][i]["confidence"] > 0.6):#置信度大于0.6的判断有人
img = cv2.rectangle(img, (result[0]["data"][0]['left'], result[0]["data"][0]['top']),(result[0]["data"][0]['right'], result[0]["data"][0]['bottom']), (255, 0, 0), 2)#画框框可视化
flag = 1
cv2.imshow("img", img)
#保留检测到人的帧
if(flag):
out.write(frame)
flag = 0
cv2.waitKey(10)
0
cv2.waitKey(10)
cap.release()
总结
-
本项目从两个角度实现了智能监控摄像头的算法,兼顾了传统方式和深度学习方式,希望能给大家带来不一样的体验
-
本项目是这学期自己做的大数据课程的项目,后面还有一些用本方法出来监控视频后模拟边缘段向云服务器端传输、储存与计算的比较,因为相关度不高就不放到项目里了,欢迎有兴趣的小伙伴一起来讨论哇
个人介绍
-
姓名:Fitz
-
武汉理工大学2018级本科信息工程专业在读
-
感兴趣方向:计算机视觉、推理部署、迁移学习
-
AIstudio主页 : Fitzie
-
欢迎大家有问题一起交流讨论,共同进步~
运行代码请点击:https://aistudio.baidu.com/aistudio/projectdetail/1158263
运行方式如下: