看我如何基於Python;Facepp打造智慧監控系統
由於種種原因,最近想親自做一個基於python&facepp打造的智慧監控系統。
0x00:萌芽
1:暑假在家很無聊
想出去玩,找不到人。玩個lol(已解除安裝),老是坑人。實在是無聊至極,不過,就在前天,隔壁鄰居家的房子被租出去了。因為我是農村的,房子都是獨立的帶院子的,沒錯就是這樣的:
因為家裡經常沒人住,並且還放有其他貴重物品,生怕一不留神,這些租戶跳到我家。把這些東西洗劫一空。此時我已經安耐不住內心的小激動!那麼。搭建一個智慧監控系統可好!
2:新聞報道
2017年7月13日訊,家庭攝像頭遭入侵,公民隱私被侵犯的案子,已經破了。今天傍晚,市公安局釋出訊息稱,19天內,北京警方成功打掉了全國首例網上傳播家庭攝像頭破解軟體的犯罪鏈條,抓獲涉案人員24名。————–2017-07-13 18:56 編輯:TF003 來源:北京晚報
這些人的腦袋都秀逗了吧,這都能幹出來,嚇得我趕緊自己搭建了一個智慧監控系統。
3:外快
掙點外快!
0x01:Xmind思維
先大概敘述一下MS的功能,
1:硬體部分
- 兩個USB高清攝像頭,
- 一個超聲波感測器(HC-SR04),
- 一個樹莓派3 modelB,
- 散熱扇(很重要!)
對於超聲波感測器,主要的功能就是檢查距離的變化,也就是說當檢測是有運動物體的產生,才會啟用攝像頭。
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超聲波感測器
- 採用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:這些就詳細說了,因為之前發表過一篇文章,大家可以去參考
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打電話
聯絡作者: [email protected]