當前位置:
首頁 > 新聞 > 我與支付寶之間的那些事:基於Python與Face++實現人臉識別

我與支付寶之間的那些事:基於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的朋友提些建議及學習路線望少走點彎路
基於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人臉識別方案的供應商被收購:不是蘋果