我與支付寶之間的那些事:基於Python與Face++實現人臉識別
*原創作者:zw97073966,本文屬Freebuf原創獎勵計劃,未經許可禁止轉載
01 YY
眨眨眼。支付婊這個刷臉的功能估計讓大家都給玩壞了,不過支付寶竟然又出了一個讓我沉迷於其中,無法自拔的玩物,沒錯,就是這個玩意兒:
好漢!你能過幾關!不過對不起,在下臉盲!
說到正經處,我必須想辦法,支付寶竟然用此等技術來逗我,我豈能善罷甘休!待我修鍊成果,再和你決一死戰。
之前看過一篇文章,支付寶刷臉支付功能,美圖秀秀,就是運用Face++公司的人臉識別技術。心裡一想,這下有戲了,打開官網一看
啊哈,「免費接入」瞬間映入眼帘,註冊帳號—進入console—閱讀API文檔–獲取API-Key—開始我的python之旅了。
02 思路
先遍歷所有照片並保存在本地,將的圖片以(ID.name.jpg)的形式命名,調用delectAPI,將返回的face_token,和ID,name一併錄入MYSQL資料庫,在進行比對的時候,調用compareAPI,將顯示的圖片與資料庫錄入的圖片信息進行比對,對返回信息進行處理,返回置信度最高的那位,想想就來勁。
那麼問題來了,難道僅僅局限於圖片的識別嗎,不,我們不會這樣的,我們是有志的青年,怎能就這麼得到滿足,對了還有攝像頭,進行實時的人臉識別,說不定哪天,美女從你身邊走過,你卻渾然不知,所以,那就開始作唄!
03 環境搭建&目錄構建
環境搭建:
Ubuntu 16.04 LTS:其實其他的版本也可以,這裡要求不是太苛刻
python 2.7:使用的是python2.7,畢竟人家還可以在支持10年,就將就的先用著,
MySQL:使用的是LAMP環境,百度搜索LAMP環境搭建,一大堆教程,
MySQLdb:python下的Mysql包
OpenCV 3.2.0——-關於版本的使用當然是越穩定越好,關於如何安裝OpenCV,這裡就簡單的說一下下,畢竟沒有它,後面的代碼也運行不了,
安裝的依賴包:
從github上下載最新的源碼:
PS:官網的教程裡面將兩個包分開進行編譯,但是裡面的許多包我們確實用不到,所以,最好的辦法,就是將./opencv_contrib/moudles/freetype和face文件直接複製到./opencv/moudles/下,經實踐檢驗—-可行!
PS:這裡說一下了。在運行cmake的時候,需要下載幾個文件,比如ippicv_linux_20151201.tgz,竟然需要掛代理,天哪,所以我就掛了一個,關於如何在ubuntu上安裝shadowsocks科學上網,我的博客也有寫過
點我
到此,環境方面已經搭建的差不多了。
實在抱歉。沒能在代碼中寫上任何注釋信息。因為我的編輯器(sublime_text 3)真心無法在裡面輸入漢字,
現在來看一下該FRT的工作目錄,如圖
04 代碼構建
1:faceAPI.py #API的調用
這裡為了方便以後進行調用,特意的將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 #資料庫的連接
這裡將資料庫的連接也寫在了包裡面。主要為了方便移植,基本上下載我的代碼上,修改一下這裡,基本上就可以用了
在host里填寫資料庫的地址,port迷人都為3306,user為資料庫用戶名,passwd為資料庫密碼,db為資料庫的名稱,charset為資料庫編碼方式,為了能讓表顯示中文。
3:import.py #人臉數據的導入
這裡的話。首先要創建一個的faceset(人臉的集合),調用FaceAPI.facesetcreate()進行創建,傳入一個outer_id.也就是你要導入這批人臉的集合的唯一標識,這個值是唯一的。為了當你再次運行import.py時候,防止圖片多次的重複導入到資料庫中或者多次進行faceaddface(),將每次導入的圖片文件名寫進到log中,這樣就可以減少了伺服器的壓力(雖然這點微不足道,但是畢竟免費用人家的嘛),如果圖片不存在的話,將調用FaceAPI.facesetaddface(),將讀取到的臉添加到到faceset中
這個要多說一點,首先,將要導入的圖片存放才./data/import_face/下,當然圖片要命名為,」ID.name.jpg」的任何格式,畢竟我的資料庫在進行創建的時候就是這樣進行數據錄入的,然後調用os.walk()對路徑進行分割,append()進行連接。
這一步就是對調用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
這一步就是要將所有的數據寫入到資料庫中,因為之前,都將ID,nameface_token等信息進行的全局global的聲明。所以這裡可以直接進行寫入,需要提醒的是,每進行一條sql語句,都與要跟一句 conn.commit()才可以將sql語句進行提交
python import.py
最後運行 就可以看到圖片信息在慢慢的導入到資料庫中
4:img_face.py #檢測圖片中所有人的面部
這裡就要用到一些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
(不錯,看著還可以,)
5:cam_face.py #攝像頭實時識別(可多個臉)
這裡和圖片識別原理差不多,只是OpenCV將視頻的每一偵都進行了識別,這樣的話,因為每一幀都需要調用一下API進行上傳,所以會出現畫面卡頓的情況,不過還好,能接受。
當然,人臉越多,上傳的時間就越長,卡頓的就越厲害,反正我現在還沒有找到解決辦法,
下面來運行,
python cam_face.py #羞羞
05 實戰
下圖為此實戰的工作目錄,所以和之前FRT不再一個目錄下,
迫不及待的我啊,已經無法按奈主內心的機動,不多說,直接貼代碼,上圖伺候
首先,用cv2.image()將圖片讀取進來
。。。。。。。
此處省略300字
。。。。。。。。
代碼部分講解完畢,下面來執行
python alimemeda.py #運行完畢後,打開./img目錄下的圖片,你將會看到如下的顯示
這下終於可以把支付寶和支付婊分的一清二楚了,不過嘛,好像他們並不怎麼像啊,估計是出現了幻覺,對一定是幻覺,。
^_^,終於完成了我的報復。
06 github代碼下載
所有的代碼全部上傳到了的我的
github
上,大家可以在這進行下載
運行前:
1:需要將./face/FaceAPI.py中的api_key和api_secret換成你的
2:需要在搭建的MYSQL中搭建一個FRT資料庫,並且事先創建一個任意表
3:需要將./face/Dbconnect.py中的資料庫信息換成自己的
其實之前,也有在本地,利用OpenCV的深度學習來對人臉進行識別,但是識別率真的很低,所以在這,我沒有將這些代碼給碼出來,而是直接發布在我的github上。當然這也不妨你們去閱讀也修改。
07 感謝
特別感謝Face++公司的免費API,才能讓我將這些代碼變成現實
特別感謝freebuf 能將我的這篇文章發表出來,與大家一起分享
特別感謝我的網友們,是你們給予了我動力,堅持將自己的想法變成現實
特別感謝我的學校,給了我這麼多的課餘時間來敲這些代碼(這學期的課實在是少的egg疼)
特別感謝我的家人,給了我這麼好的條件,讓我在這裡學習,學習,學習
最後感謝我自己,有這麼大的毅力將這些代碼寫下來,即使明天要考試,0.0!
謝謝大家 !么么噠!
*原創作者:zw97073966,本文屬Freebuf原創獎勵計劃,未經許可禁止轉載


※Python代碼覆蓋性測試入門
※Python基礎新手學習需要注意的技術問題總結
※缺少Python項目實踐經驗怎麼辦
※給想轉行學習Python的朋友提些建議及學習路線望少走點彎路
※基於Python+tkinter+pygame音樂播放器源碼
TAG:Python |
※Apple Pencil 將可用在 iPhone上/OPPO 人臉識別技術或比 iPhone X 更高級
※類Animoji,微軟SwiftKey推3D人臉識別動態表情
※iPhone X側目:OPPO Find X 3D人臉識別細節 能刷臉付款
※IDEMIA、英飛凌和pmdtechnologies將合力提供端到端的3D Face人臉識別解決方案
※基於Google API的貓臉識別器
※vivo Z3用上紅外人臉識別,這體驗iPhone也得服
※蘋果收購Lighthouse八項專利,可能用於開發人臉識別
※「SocialFace」獲千萬級 Pre-A 輪融資,要做社交活動場景人臉識別大數據平台
※美國票務巨頭Ticketmaster希望通過人臉識別取代實體票
※NEX不是結束,Vivo又一大招曝光:深度人臉識別 比iPhoneX更先進
※「全面屏」iPad Pro取消home鍵加入3D人臉識別
※蘋果開始密研真全面屏iPhone!放棄Face ID人臉識別是第一步
※3部手機人臉識別測試:oppo比iPhoneX和三星快多了
※因各種技術問題,警方丟棄亞馬遜人臉識別產品 Rekognition API
※商湯科技發布人臉識別一體機SensePass Pro
※還是iPhone X好賣,3D感測人臉識別它佔了9成
※iPhone XS與X的人臉識別解鎖對比:速度真的變快了
※誰的鍋!新買iPhone被鑒定是改裝的;蘋果iOS 13人臉識別登陸雲端
※蘋果或推中國特色版iPhone:取消人臉識別
※iPhone XS人臉識別方案的供應商被收購:不是蘋果