我與支付寶之間的那些事:基於Python與Face++實現人臉識別

0×01 YY(私信小編007即可自動獲取大量python視頻教程以及各類PDF,這節課的視頻教程也有!)

眨眨眼。支付婊這個刷臉的功能估計讓大家都給玩壞了,不過支付寶竟然又出了一個讓我沉迷於其中,無法自拔的玩物,沒錯,就是這個玩意兒:

我與支付寶之間的那些事:基於Python與Face++實現人臉識別

好漢!你能過幾關!不過對不起,在下臉盲!

說到正經處,我必須想辦法,支付寶竟然用此等技術來逗我,我豈能善罷甘休!待我修煉成果,再和你決一死戰。

之前看過一篇文章,支付寶刷臉支付功能,美圖秀秀,就是運用Face++公司的人臉識別技術。心裡一想,這下有戲了,打開官網一看

我與支付寶之間的那些事:基於Python與Face++實現人臉識別


啊哈,“免費接入”瞬間映入眼簾,註冊帳號—進入console—閱讀API文檔–獲取API-Key—開始我的python之旅了。

0×02 思路

先遍歷所有照片並保存在本地,將的圖片以(ID.name.jpg)的形式命名,調用delectAPI,將返回的face_token,和ID,name一併錄入MYSQL數據庫,在進行比對的時候,調用compareAPI,將顯示的圖片與數據庫錄入的圖片信息進行比對,對返回信息進行處理,返回置信度最高的那位,想想就來勁。

那麼問題來了,難道僅僅侷限於圖片的識別嗎,不,我們不會這樣的,我們是有志的青年,怎能就這麼得到滿足,對了還有攝像頭,進行實時的人臉識別,說不定哪天,美女從你身邊走過,你卻渾然不知,所以,那就開始作唄!

0×03 環境搭建&目錄構建

環境搭建:

Ubuntu 16.04 LTS:其實其他的版本也可以,這裡要求不是太苛刻

python 2.7:使用的是python2.7,畢竟人家還可以在支持10年,就將就的先用著,

MySQL:使用的是LAMP環境,百度搜索LAMP環境搭建,一大堆教程,

MySQLdb:python下的Mysql包

sudo apt-get install python-pip
sudo apt-get install libmysqlclient-dev
pip install mysql-python

OpenCV 3.2.0——-關於版本的使用當然是越穩定越好,關於如何安裝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

從github上下載最新的源碼:

git clone https://github.com/opencv/opencv.git #這個是最新的OpenCV 公佈在github上的代碼
git clone https://github.com/opencv/opencv_contrib.git #這個裡面有一些模塊,比如freetype,face,等需要用到

PS:官網的教程裡面將兩個包分開進行編譯,但是裡面的許多包我們確實用不到,所以,最好的辦法,就是將./opencv_contrib/moudles/freetype和face文件直接複製到./opencv/moudles/下,經實踐檢驗—-可行!

cd ~/opencv
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4 #這裡的-j4代表怎麼說好呢,反正越大,編譯的速度越快,我最大用過-j8,但我的電腦只是4核!
sudo make install

PS:這裡說一下了。在運行cmake的時候,需要下載幾個文件,比如ippicv_linux_20151201.tgz,竟然需要掛代理,天哪,所以我就掛了一個,關於如何在ubuntu上安裝shadowsocks科學上網,我的博客也有寫過 點我

到此,環境方面已經搭建的差不多了。

實在抱歉。沒能在代碼中寫上任何註釋信息。因為我的編輯器(sublime_text 3)真心無法在裡面輸入漢字,

現在來看一下該FRT的工作目錄,如圖

我與支付寶之間的那些事:基於Python與Face++實現人臉識別

0×04 代碼構建

1:faceAPI.py #API的調用
我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這裡為了方便以後進行調用,特意的將FaceAPI寫成包,放在創建的face目錄下,

FaceAPI中包括delect(面部識別),analyze(面部分析),compare(面部比對),search(面部搜索),faceset(創建面部集合)等,因為官方文檔給出的就是採用curl -X POST方式進行數據上傳和返回,所以就直接在導入標準庫的subprocess包,在python中調用curl,當然還有更好的方法,比如用python標準庫裡的urllib2裡的POST進行上傳.但咱們不這是為了省事嘛!返回結果為JSON的格式,為了方面進行調試,特異的將Json寫log中,當出現錯誤的時候,可以查看log的內容,這些JSON數據在下面用到的時候再進行處理

2:DBconnect.py #數據庫的連接
我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這裡將數據庫的連接也寫在了包裡面。主要為了方便移植,基本上下載我的代碼上,修改一下這裡,基本上就可以用了

在host裡填寫數據庫的地址,port迷人都為3306,user為數據庫用戶名,passwd為數據庫密碼,db為數據庫的名稱,charset為數據庫編碼方式,為了能讓表顯示中文

3:import.py #人臉數據的導入
我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這裡的話。首先要創建一個的faceset(人臉的集合),調用FaceAPI.facesetcreate()進行創建,傳入一個outer_id.也就是你要導入這批人臉的集合的唯一標識,這個值是唯一的。為了當你再次運行import.py時候,防止圖片多次的重複導入到數據庫中或者多次進行faceaddface(),將每次導入的圖片文件名寫進到log中,這樣就可以減少了服務器的壓力(雖然這點微不足道,但是畢竟免費用人家的嘛),如果圖片不存在的話,將調用FaceAPI.facesetaddface(),將讀取到的臉添加到到faceset中

我與支付寶之間的那些事:基於Python與Face++實現人臉識別

這個要多說一點,首先,將要導入的圖片存放才./data/import_face/下,當然圖片要命名為,”ID.name.jpg”的任何格式,畢竟我的數據庫在進行創建的時候就是這樣進行數據錄入的,然後調用os.walk()對路徑進行分割,append()進行連接。


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這一步就是對調用detect()返回的json文件進行數據的整理,分別提取其中的face_token,gender,facequality的value,當然也可以返回其他的信息,比如gender,age,smiling,headpose,facequality,blur,eyestatus,ethnicity等。

PS:這裡有個坑,因為我數據庫創建時候,寫的是face_data(stuID varchar(12),也就是說,你如果命名的ID小於12位的話,那麼他前面的數字全部為隨機的,所以當調用check_stuID()的時候,if stuID in a[0]:永遠為false


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這一步就是要將所有的數據寫入到數據庫中,因為之前,都將ID,nameface_token等信息進行的全局global的聲明。所以這裡可以直接進行寫入,需要提醒的是,每進行一條sql語句,都與要跟一句 conn.commit()才可以將sql語句進行提交

python import.py 

最後運行 就可以看到圖片信息在慢慢的導入到數據庫中


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


4:img_face.py #檢測圖片中所有人的面部


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這裡就要用到一些OpenCV的內容了,其實不用太去深刻的學習OpenCV,畢竟我們僅僅能使用到OpenCV的很小一部分,而這一部分恰恰正是經常用到的,首先加載cv2.CasacdeClassifier選擇器,接著加載圖片放在img_search目錄下的圖片,將起轉化為灰度,據說機器對灰度圖片的識別效率更高,因為cv2.puttext對中文的支持不夠友好,所有這裡調用了freetype庫(開始已經安裝過),從而可以讓臉部的框框顯示中文,在for循環中,每找到一個面部,就會調用cv2.rectangle(),將面部用黃色的方框標記出來(當然你也可以嘗試其他顏色,這裡只需要修改BGR(0.255.255)的值就可以),並命名其為*.pgm,寫入到/data/img_search/文檔下,然後調用FaceAPI.seaechItoI(),讓.pgm圖像與faceset集合進行比對,並且返回faceset集合中與之置信度最高的face_token,這裡設置了以下閥值,如果置信度不高於設定的80.00的話,就會打印“Unknow Face”,

關於img_face需要介紹就這些,下面來運行

python img_face.py

(不錯,看著還可以,)


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


5:cam_face.py #攝像頭實時識別(可多個臉) 


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這裡和圖片識別原理差不多,只是OpenCV將視頻的每一偵都進行了識別,這樣的話,因為每一幀都需要調用一下API進行上傳,所以會出現畫面卡頓的情況,不過還好,能接受

當然,人臉越多,上傳的時間就越長,卡頓的就越厲害,反正我現在還沒有找到解決辦法,

下面來運行,

python cam_face.py #羞羞


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


0×05 實戰

下圖為此實戰的工作目錄,所以和之前FRT不再一個目錄下,


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


迫不及待的我啊,已經無法按奈主內心的機動,不多說,直接貼代碼,上圖伺候


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


首先,用cv2.image()將圖片讀取進來

。。。。。。。

此處省略300字

。。。。。。。。

代碼部分講解完畢,下面來執行

python alimemeda.py #運行完畢後,打開./img目錄下的圖片,你將會看到如下的顯示


我與支付寶之間的那些事:基於Python與Face++實現人臉識別


這下終於可以把支付寶和支付婊分的一清二楚了,不過嘛,好像他們並不怎麼像啊,估計是出現了幻覺,對一定是幻覺,。

^_^,終於完成了我的報復。

0×06 github代碼

https://github.com/0x024/

所有的代碼全部上傳到了的我的github上,大家可以在這進行下載

運行前:

1:需要將./face/FaceAPI.py中的api_key和api_secret換成你的

2:需要在搭建的MYSQL中搭建一個FRT數據庫,並且事先創建一個任意表

3:需要將./face/Dbconnect.py中的數據庫信息換成自己的

其實之前,也有在本地,利用OpenCV的深度學習來對人臉進行識別,但是識別率真的很低,所以在這,我沒有將這些代碼給碼出來,而是直接發佈在我的github上。當然這也不妨你們去閱讀也修改

0×07 感謝

特別感謝Face++公司的免費API,才能讓我將這些代碼變成現實。


分享到:


相關文章: