看我如何基于Python&Facepp打造智能监控系统
由于种种原因,最近想亲自做一个基于python&facepp打造的智能监控系统。
0×00:萌芽
1:暑假在家很无聊
想出去玩,找不到人。玩个lol(已卸载),老是坑人。实在是无聊至极,不过,就在前天,隔壁邻居家的房子被租出去了。因为我是农村的,房子都是独立的带院子的,没错就是这样的:
因为家里经常没人住,并且还放有其他贵重物品,生怕一不留神,这些租户跳到我家。把这些东西洗劫一空。此时我已经安耐不住内心的小激动!那么。搭建一个智能监控系统可好!
2:新闻报道
2017年7月13日讯,家庭摄像头遭入侵,公民隐私被侵犯的案子,已经破了。今天傍晚,市公安局发布消息称,19天内,北京警方成功打掉了全国首例网上传播家庭摄像头破解软件的犯罪链条,抓获涉案人员24名。————–2017-07-13 18:56 编辑:TF003 来源:北京晚报
这些人的脑袋都秀逗了吧,这都能干出来,吓得我赶紧自己搭建了一个智能监控系统。
3:外快
挣点外快!
0×01:Xmind思维
先大概叙述一下MS的功能,
1:硬件部分
- 两个USB高清摄像头,
- 一个超声波传感器(HC-SR04),
- 一个树莓派3 modelB,
- 散热扇(很重要!)
对于超声波传感器,主要的功能就是检查距离的变化,也就是说当检测是有运动物体的产生,才会激活摄像头。
1:也是为了减轻树莓派CPU负荷
2:合理利用那可怜的32G内存卡,
对于两个摄像头,一个放置在家门口的过道里,每当来人的时候,超声波传感器变化检测到运动物体,这时会激活摄像头便会捕捉一系列图片,让系统进行分析,包括面部,身体等信息,所以,这个摄像头要求拍摄的质量和角度要很好,另一个摄像头这放置在院子的边角,要求能照到整个院子,这个摄像头主要任务就是检测人体,并不强求识别出人脸,毕竟距离太远。
对于树莓派,做个监控系统的话,不能一直把电脑放在上面吧,那样太浪费资源了,所以当时狠心的买了个3B,不过还好用起来不错,他的角色就是处理硬件传回来的各种信息。。。
2:代码部分
下面慢慢道来!
0×02:环境搭建
curl安装:
sudo apt-get install curl
MySQLdb安装:
sudo apt get install python-pip
sudo apt-get install libmysqlclient-dev
pip install mysql-python
LAMP:
sudo apt-get install apache2
sudo apt-get install php7.0
sudo apt-get install libapache2-mod-php7.0
sudo apt-get install mysql-server
sudo apt-get install phpmyadmin
sudo chmod 777 /var/www/html/
sudo ln -s /usr/share/phpmyadmin /var/www/html/
sudo sed -i 's/;extension=php_mbstring.dll/extension=php_mbstring.dll/' /etc/php/7.0/apache2/php.ini
sudo /etc/init.d/apache2 restart
mysql --user=root -p
CREATE DATABASE IF NOT EXISTS `MS` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `MS`;
CREATE TABLE `None` (`None` int(11) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;
OpenCV:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
git clone https://github.com/0x024/opencv.git
cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j1
sudo make install
0×03: 目录树
0×04:代码分析
1:MS.py(monitor system的简称)
总体文件函数的分布!
checkdist()
首先来了解一下HC-SR04超声波传感器
- 采用IO口TRIG触发测距,给至少10us的高电平信号;
- 模块自动发送8个40khz的方波,自动检测是否有信号返回;
- 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2
引脚与树莓派连接方式:
- VCC,超声波模块电源脚,接5V电源即可
- Trig,超声波发送脚,高电平时发送出40KHZ出超声波
- Echo,超声波接收检测脚,当接收到返回的超声波时,输出高电平
- GND,超声波模块GND
这里附上树莓派串口的原理图!方便自定义连接
这里我将VCC连接至 Pin#02,将Gnd连接至Pin#06,将Trig连接至Pin#03,将Echo连接至Pin#05
因为之前设置成了GPIO.setmode(GPIO.BCM),所以在写的时候都要写成Name那一列,Pin#只是指示作用!
这里我自定义了一个index。默认的值就是传感器在无运动物体下所稳定的int值,这个需要根据传感器摆放位置自行设定。
初始化时将trig和echo端口都置低,首先向给 trig 发送至少10 us的高电平脉冲(模块自动向外发送8个40K的方波),然后等待,捕捉 echo 端输出上升沿,捕捉到上升沿的同时,打开定时器开始计时,再次等待捕捉echo的下降沿,当捕捉到下降沿,读出计时器的时间,这就是超声波在空气中运行的时间,按照 测试距离=(高电平时间*声速(340M/S))/2 就可以算出超声波到障碍物的距离。
接着,当distance发生明显的变化时候,可以认定,有运动物体的产生。这时候,就会调用下一下函数camrun()
camrun()
可能会觉得上图函数有点多余,其实不然,图示的这种是适合于小区的只有一个门口的家庭,想想也对,
当使用两个摄像头的时候,就会用到如图的函数,这里用到了最简单的多线程thread,(PS:本人能力有限,暂时还没法理解threading这个自定义的多线程方法,),可以在运行cam()的时候,使得cam(0),和cam(1)的基本同时运行
cam(i)
这个函数的主要功能就是图像的运动检测,当有运动物体时,便会将图片以“%Y%m%d%H%M%S’+’_’+str(0)”的格式记录下来,有时候可能存在两个摄像头同时工作记录,导致记录下来的图片日期一样,为了避免这个Error产生,在日期的后面加上了摄像头“i”的标识,用来进行分辨!
这里采用时间来控制camera.release(),当运行的时间==10s时候,便会退出cam(i),这个时间基本要和camrun()里的time.sleep()相同。
这里也做了一个异常处理。避免了因为摄像头没有插好,或这因为前一个运行的cam()还没有结束释放导致的camera busy等而造成运行中断!
checkcycle()
这个函数就是写了一个无限循环,可以让getfilename()无限运行,对新增的图像文件及时的进行检测
testfacepp()
这个函数主要用来检测访问face++的服务器是否受到了 CONCURRENCY_LIMIT_EXCEEDED —并发限制,也就是说,因为我们是免费用户,虽然可以使用他的全部API ,但是,当他们的服务器达到高负荷时候,要首先供付费用户的平稳使用,当负荷不大时候,我们才可以畅快的使用。还好吧!
getfilename()
这个函数就是检测新图片的产生,首先,打开piclist.log文件,当没有受到并发限制的时候,然后再去运用os,walk函数去遍历”./img/shutter/”目录,这里要保证读取时间的先后顺序和写入.log的先后顺序同步,就不详细说了。
当检测到的为事先预定“9999999999999”文件时候,就是表明这是所有文件都以写入piclist.log并已检测完毕,
当所检测的文件不在piclist.log的时候,便会调用checkbody(),来进行身体的检测,
checkbody()
之所以先检测身体,只有在有身体的情况下,才会有面部,可以减小服务器的负荷,
首先,读取照片,然后传入BodyAPI,进行Body的检测。当不存在身体时候,将文件写入piclist.log。进行下一个文件的检测
当存在Body的时候,会将图片中的每个Body都抠出来,然后分别放在”./img/done/”里面,进行下一步的面部识别,。
这里又对checkface_online()进行了一个并发限制的异常处理,因为实在没法确定下一秒是否会并发限制,为了防止程序异常终端,所以在每次调用faceAPI的时候都要异常处理一下,目前BodyAPI并不会发生并发限制
detailface()
这个就是在运行faceAPI的时候。将返回来的face_token与数据路中的人脸进行比对,并返回该面部所对对应的ID,namem,gender等信息
checkface_online()
面部识别这一块有点长,不过也很简单!
首先读取”./img/done/”下的文件,然后将其传给FaceAPI()进行面部分析,如果result_d[“faces”]==0,着表明只存在身体并未检测到人脸,判定为stranger!写入Piclist.log,进行下一张图像的检测,当result_d[“faces”]>0 时,才可以将面部返回的face_tokrn与之前导入的face_token进行比对,同理,当返回的len(result_s)==3及表明数据库中并没有该人脸,判定为 stranger!,写入Piclist.log。当len(result_s)>3时候,同时 confidence >= 80.00才可以判定这个人是谁,否者都别判定为陌生人!
if __name__ == ‘__main__’:
这里就是要运行的方式
python MS.py check
这是就会开启图片检测的功能。
python MS.py camera
这是就会开图像截取的功能
2:BodyAPI,FaceAPI,import.py
PS:这些就详细说了,因为之前发表过一篇文章,大家可以去参考
0×05:运行
代码fork github.com/0x024/MS
官方博客 0x024.com
运行前,
需要将./facepp/FaceAPI.py和BodyAPI.py中的api_key和api_secret换成你的
(为了便于您测试,我以将我的key放在里面,为了防止多人使用冲突,希望您后期换成个人的)
需要将./facepp/Dbconnect.py中的数据库信息换成自己的
(在搭建环境过程中,建议密码全部设置成ubuntu,方便记忆)
python import.py #将./data/master/目录下的图片特导入数据库
python MS.py camera #运行图像捕捉
python MS.py check #运行图像检测
0×06:其他
1:对于想用电脑进行代码测试的,我也将代码整理好放MS-PC文件里面。大概运行方式和在树莓派上的差不多,只是少了超声波传感器这一环节!可自行调试。
2:对于环境搭建的问题,可以参考我先前的文章,实在不会的可在我的博客里面留言,我会及时的回复,
3:对于想二次开发的。比如加上web服务器可以远程查看,加上通讯模块及时进行数据反馈等等,最重要的就是有大脑风暴!
3:Good Luck
0×07:总结
穿着内衣坐在电脑前,直到凌晨,一如既往;
情愿坐在电脑前吃方便面,也不愿出去约会;
能够修好任何东西;
打字比你思考还快;
比和人们在一起花更多的时间上网;
不能理解为什么有些人不能从头到尾装起一台完整的电脑来;
不相信有图形的WEB浏览——lynx始终是最好的选择,也是唯一的需要;
使用文本编辑器——而不是文字处理软件——来回所有的信件;
从不,决不,绝对不穿西装;
相信只有Sucker才付费——免费网络连接,自由软件,用IP打电话
看我如何基于Python&Facepp打造智能监控系统的更多相关文章
- 利用基于Python的Pelican打造一个自己的个人纯静态网站
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_100 其实呢这么多年以来我一直建议每个有技术追求的开发者都要有写技术博客记笔记的良好习惯,一来可以积累知识,二来可以帮助别人,三来 ...
- #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
郑昀 基于李丹和刘奎的文档 创建于2014/12/5 关键词:监控.dashboard.PHP.graphite.statsd.whisper.carbon.grafana.influxdb.Pyth ...
- 如何简单实现接口自动化测试(基于 python) 原博主地址https://blog.csdn.net/gitchat/article/details/77849725
如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python ...
- 使用Python + Selenium打造浏览器爬虫
Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操 ...
- 关于《selenium2自动测试实战--基于Python语言》
关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...
- 《Selenium2自动化测试实战--基于Python语言》 --即将面市
发展历程: <selenium_webdriver(python)第一版> 将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...
- 树莓派上搭建基于Python+web.py+fastcgi+lighttpd的网站
最近在网上淘了一个树莓派,什么是树莓派?这里是他的官方网站你可以去看看. 简单的说就是一块使用了ARM11的CPU,具有256MB或512MB内存的具有两个USB接口,一个RJ45接口,HDMI输出和 ...
- 基于python的知乎开源爬虫 zhihu_oauth使用介绍
今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就 ...
- 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉 ...
随机推荐
- c#中out参数的作用
给你个简单的解释说法吧.虽然不完全对.但是我可以让你理解OUT有什么作用.呵呵 举个例子.每个方法只能有一个返回值.但是你想有多个返回值,呵呵.OUT就起作用了啊.比如分页,不光返回数据,还要返回总记 ...
- 我用的主机,推荐给大家【gegehost】【戈戈主机】
炎炎夏日冰点价格:戈戈主机史上最大优惠促销活动 1.7月1日至8日:买主机优惠大促销:主机买一送一,不限购买数量 请您通过客户中心或者淘宝购买一个主机之后,登录客户中心,提交问题, 提供要赠送的主机的 ...
- Java EE 目标
在大三上学期学习了Java se,只是简单的学习了语法,而且没有及时的复习巩固,语法知识已经忘了许多.在这个新学期,又有了Java EE这门课,书上的内容是从没学习过的新知识,只是在网站上看到过像Sp ...
- github修改仓库项目的语言类型
github是 采用Linguist来自动识别你的代码应该归为哪一类. 解决方法: 我们可以在仓库的根目录下添加.gitattributes文件: ## 使用 `.gitattributes` 配置文 ...
- zabbix_sender
转载一个python写的zabbix sender脚本 #!/usr/bin/env python # -*- coding: utf-8 -*- import socket import struc ...
- dxf组码
值 说明 -5 APP:永久反应器链 -4 APP:条件运算符(仅与 ssget 一起使用) -3 APP:扩展数据 (XDATA) 标记(固定) -2 APP:图元名参照(固定) -1 APP:图元 ...
- Parker Gear Pump - Gear Pump Seal Is More O-Ring: Role
Parker Gear Pump introduction Gear pump lip seal is mainly used in reciprocating dynamic seals. C ...
- 并发2-Synchronized
一.Synchronized的概念 是利用锁的机制来实现同步的. 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个 ...
- pip install MySQL-python error "can't open config-win.h"
http://blog.csdn.net/xxm524/article/details/48754139
- 获取本地验证码cookie
window.document.onkeydown = function (evt) { evt = (evt) ? evt : window.event; if (evt.keyCode) { if ...