看我如何基于PythonFacepp打造智能監控系統

由于種種原因,最近想親自做一個基于python&facepp打造的智能監控系統。

0×00:萌芽

1:暑假在家很無聊

想出去玩,找不到人。玩個lol(已卸載),老是坑人。實在是無聊至極,不過,就在前天,隔壁鄰居家的房子被租出去了。因為我是農村的,房子都是獨立的帶院子的,沒錯就是這樣的:

地圖顯示

因為家里經常沒人住,并且還放有其他貴重物品,生怕一不留神,這些租戶跳到我家。把這些東西洗劫一空。此時我已經安耐不住內心的小激動!那么。搭建一個智能監控系統可好!

2:新聞報道

2017年7月13日訊,家庭攝像頭遭入侵,公民隱私被侵犯的案子,已經破了。今天傍晚,市公安局發布消息稱,19天內,北京警方成功打掉了全國首例網上傳播家庭攝像頭破解軟件的犯罪鏈條,抓獲涉案人員24名。————–2017-07-13 18:56 編輯:TF003 來源:北京晚報

這些人的腦袋都秀逗了吧,這都能干出來,嚇得我趕緊自己搭建了一個智能監控系統。

3:外快

掙點外快!?

0×01:Xmind思維

工具準備

先大概敘述一下MS的功能,

1:硬件部分

  1. 兩個USB高清攝像頭,
  2. 一個超聲波傳感器(HC-SR04),
  3. 一個樹莓派3 modelB,
  4. 散熱扇(很重要!)

對于超聲波傳感器,主要的功能就是檢查距離的變化,也就是說當檢測是有運動物體的產生,才會激活攝像頭。

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()

checkdist()

checkdist()

首先來了解一下HC-SR04超聲波傳感器

  1. 采用IO口TRIG觸發測距,給至少10us的高電平信號;
  2. 模塊自動發送8個40khz的方波,自動檢測是否有信號返回;
  3. 有信號返回,通過IO口ECHO輸出一個高電平,高電平持續的時間就是超聲波從發射到返回的時間。測試距離=(高電平時間*聲速(340M/S))/2

引腳與樹莓派連接方式:

  1. VCC,超聲波模塊電源腳,接5V電源即可
  2. Trig,超聲波發送腳,高電平時發送出40KHZ出超聲波
  3. Echo,超聲波接收檢測腳,當接收到返回的超聲波時,輸出高電平
  4. 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()

camrun()

可能會覺得上圖函數有點多余,其實不然,圖示的這種是適合于小區的只有一個門口的家庭,想想也對,

camrun()

當使用兩個攝像頭的時候,就會用到如圖的函數,這里用到了最簡單的多線程thread,(PS:本人能力有限,暫時還沒法理解threading這個自定義的多線程方法,),可以在運行cam()的時候,使得cam(0),和cam(1)的基本同時運行

cam(i)

cam(i)

這個函數的主要功能就是圖像的運動檢測,當有運動物體時,便會將圖片以“%Y%m%d%H%M%S’+’_’+str(0)”的格式記錄下來,有時候可能存在兩個攝像頭同時工作記錄,導致記錄下來的圖片日期一樣,為了避免這個Error產生,在日期的后面加上了攝像頭“i”的標識,用來進行分辨!

這里采用時間來控制camera.release(),當運行的時間==10s時候,便會退出cam(i),這個時間基本要和camrun()里的time.sleep()相同。

這里也做了一個異常處理。避免了因為攝像頭沒有插好,或這因為前一個運行的cam()還沒有結束釋放導致的camera busy等而造成運行中斷!

checkcycle()

checkcycle()

這個函數就是寫了一個無限循環,可以讓getfilename()無限運行,對新增的圖像文件及時的進行檢測

testfacepp()

testfacepp()

這個函數主要用來檢測訪問face++的服務器是否受到了 CONCURRENCY_LIMIT_EXCEEDED —并發限制,也就是說,因為我們是免費用戶,雖然可以使用他的全部API ,但是,當他們的服務器達到高負荷時候,要首先供付費用戶的平穩使用,當負荷不大時候,我們才可以暢快的使用。還好吧!

getfilename()

getfilename()

這個函數就是檢測新圖片的產生,首先,打開piclist.log文件,當沒有受到并發限制的時候,然后再去運用os,walk函數去遍歷”./img/shutter/”目錄,這里要保證讀取時間的先后順序和寫入.log的先后順序同步,就不詳細說了。

當檢測到的為事先預定“9999999999999”文件時候,就是表明這是所有文件都以寫入piclist.log并已檢測完畢,

當所檢測的文件不在piclist.log的時候,便會調用checkbody(),來進行身體的檢測,

checkbody()

checkbody()

之所以先檢測身體,只有在有身體的情況下,才會有面部,可以減小服務器的負荷,

首先,讀取照片,然后傳入BodyAPI,進行Body的檢測。當不存在身體時候,將文件寫入piclist.log。進行下一個文件的檢測

當存在Body的時候,會將圖片中的每個Body都摳出來,然后分別放在”./img/done/”里面,進行下一步的面部識別,。

這里又對checkface_online()進行了一個并發限制的異常處理,因為實在沒法確定下一秒是否會并發限制,為了防止程序異常終端,所以在每次調用faceAPI的時候都要異常處理一下,目前BodyAPI并不會發生并發限制

detailface()

detailface()

這個就是在運行faceAPI的時候。將返回來的face_token與數據路中的人臉進行比對,并返回該面部所對對應的ID,namem,gender等信息

checkface_online()

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__’:

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打電話

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257735.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257735.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257735.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++ 遍歷所有點且距離最短_編程小白暑期進階筆記41-C語言數據結構與算法圖遍歷的應用...

基于廣度優先遍歷算法的應用思考題:(思考題答案:BFS(廣度優先遍歷)在一般的帶權圖中是不能解決最短路問題,了解BFS的都知道,BFS是根據節點到源節點之間的節點數遍歷的,也就是先訪問離源節點節點數最少的點。…

underscorejs-groupBy學習

2.18 groupBy 2.18.1 語法 _.groupBy(list, iteratee, [context]) 2.18.2 說明 把list分為多個集合,iterator為分組的依據,返回值為Object list可以是數組、對象、字符串或arguments等iteratee為分組的依據.iterator的參數(value, key, list)iterator如果是function…

關于@WebServlet(“LoginServlet“)404 報錯的解決辦法 “請求的資源[/test/LoginServlet] 不可用”

關于WebServlet(“LoginServlet”)404 報錯的解決辦法 “請求的資源[/test/LoginServlet] 不可用” *一切事物的開頭總是困難這句話,在任何一種科學上都是適用的。 * ——馬克思 一個困擾了我n天的問題,終于終于還是解決了&#…

ASP.NET MVC+EF框架+EasyUI實現權限管理系列(14)-主框架搭建

ASP.NET MVCEF框架EasyUI實現權限管理系列(14)-主框架搭建 原文:ASP.NET MVCEF框架EasyUI實現權限管理系列(14)-主框架搭建ASP.NET MVCEF框架EasyUI實現權限管系列 (開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝 (5):前臺…

常用事務代碼 sap_SAP_PS_事務代碼

[轉]SAP PS常用事務代碼T-CODESAP項目系統(Project System,以下簡稱PS)模塊作為傳統的非常規模塊(除FI、CO、MM、PP、SD之外的模塊)之一,在最近幾年在國內也得到的較為廣泛的應用,與PS應用火熱場景相對應的是PS內外部顧問的極度缺乏。這種缺乏一方面表現…

Java 冒泡排序的實現

實現原理: 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。 針對所有的元素重復以上的步驟,除了最后一個…

CLion for mac安裝配置

前言 本文詳細多圖介紹 IntelliJ IDEA For Mac的激活教程,相當于永久激活 文件包百度云下載:(通過與熊論道網站解密) 熊曰:呋溫捕嘿誘襲氏樣溫住既非破哮誒襲非捕溫肉性盜森魚非襲啽蜜呦訴嘿溫類盜山寶住出森非喜誘捕發嗥既肉嗅…

solr后臺界面介紹——(十一)

1.加一個collection的方法 復制solr-home下的collection1,修改名字為collection2。并且修改collection2文件夾中配置文件core.properties中的名字為collection2,重啟服務器。 2.后臺界面介紹 Dashboard 儀表盤,顯示了該Solr實例開始啟動運行的…

功率信號與能量信號的超棒理解!

功率信號與能量信號的理解! 功率信號和能量信號一直是一個令我疑惑的概念,一個無限一個為零。但是下面令我茅塞頓開! ~~~分割線啊分割線~~~

vscode終端不識別python_VSCode無法識別我的已安裝Python包

Windows上的VSCode與Python。 Don安裝的Python擴展,不確定它有什么不同,但考慮給我的環境使用VSCode for Python,在那個過程中,我安裝了metapy包。我能夠在VSCode中的終端窗口內運行此metapy,但不能在編輯器中運行PS C…

現在也是只能謝謝隨筆了,但是在以后收貨的日子里會有更多的感想記下

每天雖然都會在各個方面都記下一點日常事務的說明,但是會有重復,以后工作了向高中一樣一定會有許多的話,但是我不希望這是一些抱怨,更多的應該是收貨,這幾天也是早上不知怎么會有點頭疼,加上每天取暖口有點…

[轉載]AngularJS之Factory vs Service vs Provider

http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/ 要注意的文章中,app.provider(...)里的代碼有點出處,之后作者改過,但是轉載的網站上圖片…

C#學習筆記:預處理指令

C#和C/C一樣,也支持預處理指令,下面我們來看看C#中的預處理指令。 #region 代碼折疊功能,配合#endregion使用,如下: 點擊后如下: 條件預處理 條件預處理可以根據給出的條件決定最終進行編譯的代碼&#xff…

android sh 指令_Java/Android中實現Shell命令

有時候我們需要實現一個功能。不過這個功能用我們傳統的Java代碼實現起來會有一些困難,這時我們可以嘗試利用Shell命令來實現。你可以按照下面的代碼模塊來進行你想要實現的Shell命令(注:也不是所有的Shell命令都能用Java代碼來實現)。public class Main…

【數字信號處理】 第二章、時域中的離散時間信號

前言 學而時習之,不亦樂乎? ——《論語學而》 Is it not pleasant to learn with a constant perseverance and application? 。 第二章 時域中的離散時間信號 一、離散信號的基本定義 1、兩個基本類型 抽樣數據類型:即模擬信號通過定周期進行采樣…

開機流程與主引導分區(MBR)——鳥哥私房菜

在前篇隨筆中,已經談到了CMOS與BIOS,CMOS是記錄各項硬件參數(包括系統時間、設備的I/O地址、CPU的電壓和頻率等)且嵌入到主板上面的存儲器,BIOS是一個寫入到主板上的韌體(韌體是寫入到硬件上的一個軟件程序…

整車廠核心制造系統及數據流

轉載于:https://www.cnblogs.com/tallrain/p/MES_Auto_Core_System.html

ch12 GUI

《Head First Java 2nd Edition》 摘錄 JFrame 代表屏幕上的一個窗口,可以把 buttons, checkboxes, test fields 等等界面相關的東西置于其上。它可以有一個有菜單項的菜單條。無論在哪個平臺上,都有窗口圖標,最小化、最大化和關閉窗口的按鈕…

兩物體的相對速度公式_《百答相對論》連載(二十一)質疑狹義相對論速度的疊加公式...

狹義相對論部分:(21)質疑狹義相對論速度的疊加公式參考《相對論百問》第28頁 21相對論的速度疊加公式怎么寫?可以用速度疊加達到和超過光速嗎?在經典力學中,物體在力的作用下改變原有的速度遵守牛頓第二定律,物體失去了…

對于大規模機器學習的理解和認識

這篇文章,9分轉載轉述;很少有自己的見解; 首先先露怯:自己真正是去年開始接觸機器學習當中的深度學習當中的卷積神經網絡當中的前向預測部分; 不過,剛才看完了這里的討論,(知乎&…