當前位置:
首頁 > 新聞 > 看我如何基於Python&Facepp打造智能監控系統

看我如何基於Python&Facepp打造智能監控系統

*本文原創作者:zw97073966,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


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


0x00:萌芽

1:

暑假在家很無聊


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



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


2:新聞報道


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


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


3:外快


掙點外快!

0x01:Xmind思維



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


1:硬體部分





  1. 兩個USB高清攝像頭,



  2. 一個超聲波感測器(HC-SR04),



  3. 一個樹莓派3 modelB,



  4. 散熱扇(很重要!)


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


1:也是為了減輕樹莓派CPU負荷


2:合理利用那可憐的32G內存卡,


對於兩個攝像頭,一個放置在家門口的過道里,每當來人的時候,超聲波感測器變化檢測到運動物體,這時會激活攝像頭便會捕捉一系列圖片,讓系統進行分析,包括面部,身體等信息,所以,這個攝像頭要求拍攝的質量和角度要很好,另一個攝像頭這放置在院子的邊角,要求能照到整個院子,這個攝像頭主要任務就是檢測人體,並不強求識別出人臉,畢竟距離太遠。



對於樹莓派,做個監控系統的話,不能一直把電腦放在上面吧,那樣太浪費資源了,所以當時狠心的買了個3B,不過還好用起來不錯,他的角色就是處理硬體傳回來的各種信息。。。


2:代碼部分


下面慢慢道來!


0x02:環境搭建

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

0x03: 目錄樹


0x04:代碼分析


1:MS.py(monitor system的簡稱)


總體文件函數的分布!



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



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


當使用兩個攝像頭的時候,就會用到如圖的函數,這裡用到了最簡單的多線程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:這些就詳細說了,因為之前發表過一篇文章,大家可以去參考


0x05:運行

代碼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   #運行圖像檢測

0x06:其他


1:對於想用電腦進行代碼測試的,我也將代碼整理好放MS-PC文件裡面。大概運行方式和在樹莓派上的差不多,只是少了超聲波感測器這一環節!可自行調試。


2:對於環境搭建的問題,可以參考我先前的文章,實在不會的可在我的博客裡面留言,我會及時的回復,


3:對於想二次開發的。比如加上web伺服器可以遠程查看,加上通訊模塊及時進行數據反饋等等,最重要的就是有大腦風暴!


3:Good Luck


0x07:總結




穿著內衣坐在電腦前,直到凌晨,一如既往;


情願坐在電腦前吃速食麵,也不願出去約會;


能夠修好任何東西;


打字比你思考還快;


比和人們在一起花更多的時間上網;


不能理解為什麼有些人不能從頭到尾裝起一台完整的電腦來;


不相信有圖形的WEB瀏覽——lynx始終是最好的選擇,也是唯一的需要;


使用文本編輯器——而不是文字處理軟體——來回所有的信件;


從不,決不,絕對不穿西裝;


相信只有Sucker才付費——免費網路連接,自由軟體,用IP打電話


聯繫作者: 97073966@qq.com


*本文原創作者:zw97073966,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

關於弱密碼攝像頭被入侵實驗
利用USB橡皮鴨在目標機器上啟動Empire或Meterpreter會話
挖洞經驗 | 看我如何綜合利用4個漏洞實現GitHub Enterprise 遠程代碼執行
「震網三代」(CVE-2017-8464)的幾種利用方法與防範
全球國家「破壞性網路攻擊」 30 年 | Cybereason情報組報告

TAG:FreeBuf |

您可能感興趣

Prometheus+Grafana實現監控系統
Surface Phone蹤跡再現:運行Andromeda系統
可媲美Lighthouse,Occipital推高精度Inside-Out追蹤系統
Magic Leap One操作系統或叫Lumin
Google全新自主研發Fuchsia系統是否代替Android?
Google Android Wear智能手錶操作系統更名為Wear OS by Google
諾基亞8 Sirocco vs蘋果iPhone X,iPhone X系統成王牌?
Full Throttle購置Funktion One Vero系統
基於SpringBoot的後台管理系統
Google 發布其非 Linux 系操作系統 Fuchsia 說明書
「Inside Xbox」Xbox One春季更新全新功能公布 支持Freesync技術新Avatar系統測試中
基於Ubuntu+python搭建簡易人臉檢測系統
Linux操作系統已擁有自動化的Spectre/Meltdown檢查器
Vue+VueRouter+elememntUI+axios 搭建後台管理系統
【Inside Xbox】Xbox One春季更新全新功能公布 支持Freesync技術新Avatar系統測試中
Xbox One系統未來將支持FreeSync技術
使用Amazon Alexa語音命令可以控制SimpliSafe家庭安全系統
The Nervous System 神經系統
Win7系統提示steam client not found解決方法
開源項目Safespaces想讓你在VR中使用Linux系統