基于Face++使用python+opencv来实现人脸验证及人脸解锁
csdn不方便的話轉到github
源碼和圖片資料都在github
https://github.com/ChenJian-Jia/Based-on-face-Python-and-OpenCV-are-used-to-realize-face-unlocking
絕對細節,看完直接跑通。
注:部分內容來自CSDN Python雁橫
簡介
使用python+opencv+face++來實現人臉驗證及人臉解鎖。代碼量同樣不多,你可以將這些代碼運用在其它一些智能領域,如智能家居,進門的時候判斷你是誰,也可以加入機器學習判斷來的人是客人還是熟人。在講之前我們會先適當的拓撲一下關于人臉識別的知識點。OK廢話少說下面直接開始開始
解鎖原理
Face++實現人臉匹配的原理。現在你打開了攝像頭,然后恰好你按下了抓取。抓取之后,你的臉部圖片會上傳到遠程服務器,然后服務端會提取你的面部情況生成一個唯一的指紋(標識碼),這個指紋在Face++里面叫做face_token這個我們后面會繼續講到,這個指紋就代表你目前的身份。
上傳完經過服務端分析收錄之后,服務端會通過json發送給你一個數據包,這個數據包里面有你面部全部特征。
當你拿到服務端返回過來的json之后,將face_token提取出來(這很重要,face_token相當于一把鑰匙)然后你把拿到的face_token放到python的if里面去判斷如果face_token相符就驗證成功,如果不相符那么解鎖失敗。
face++介紹
Face++是新一代云端視覺服務平臺,提供一整套世界領先的人臉檢測,人臉識別,面部分析的視覺技術服務。Face++旨在提供簡單易用,功能強大,平臺通用的視覺服務,讓廣大的Web及移動開發者可以輕松使用最前沿的計算機視覺技術,從而搭建個性化的視覺應用。 Face++同時提供云端REST API以及本地API(涵蓋Android, iOS, Linux, Windows, Mac OS),并且提供定制化及企業級視覺服務。通過Face++,您可以輕松搭建您自己的云端身份認證,用戶興趣挖掘,移動體感交互,社交娛樂分享等多類型應用。
環境
操作系統:windows10
Python版本:3.7
Opencv版本:4.4
Face++接口
實現方案
1.上傳面孔(這個上篇文章我們已經實現攝像頭抓取,這篇文章我們不做啰嗦,直接用一張面部圖片代替)上傳后json會返回面部指紋(face_token)
2.創建人臉集合,并將步驟1返回的face_token加入到集合中去
3.通過python的if判斷是否收錄當前面孔
代碼部分
1.獲取面孔face_token
import cv2 import requests import json url='https://api-cn.faceplusplus.com/facepp/v3/detect' files={'image_file':open('4.jpg','rb')} payload={'api_key':'XXX','api_secret':'XXXX','return_landmark':0,'return_attributes':'gender,age,glass'}r=requests.post(url,files=files,data=payload) data=json.loads(r.text) print(r.text) print('============') print(data)width=data['faces'][0]['face_rectangle']['width'] top=data['faces'][0]['face_rectangle']['top'] height=data['faces'][0]['face_rectangle']['height'] left=data['faces'][0]['face_rectangle']['left']img=cv2.imread("4.jpg") vis=img.copy() cv2.rectangle(vis,(left,top),(left+width,top+height),(0,256,0),2) cv2.imshow("Image",vis)說明:
1.api規定是要post提交,所以這里用了request.post()
2.apikey/apisecret必填 沒有的自行申請見說明7
3.return_attributes選填 里面有返回的數據 有年齡性別等等
4.return_landmark選填 是否檢測返回人臉關鍵點0為不返回1為檢測83個關鍵點2為檢測106個關鍵點
5.傳輸的內容為請求的URL,圖片路徑(必填!可以是本地絕對路徑,也可以是網絡圖片分別為image_file、image_url)data數據也就是payload里面的參數:
6.代碼中url中所填寫的是Face++中檢測人臉所要調用的url:https://api-cn.faceplusplus.com/facepp/v3/detect
7.apikey和apisecret申請
8.img=cv2.imread(“4.jpg”)中的“4.jpg”是你想要上傳的面孔上傳后json會返回面部指紋(face_token)
face_token運行結果
我使用的是本地素材2,運行結果為:
我們可以看到這個返回的json包里有很多的值,我們這里最重要的就是拿到這張臉的face_toen,然后保存起來,收錄到服務端的時候需要。
注:這里可能有些朋友在網上隨便找的照片可能報錯,這很可能是圖片像素的問題,盡量找高清的,運行后,人臉部分會被綠框標識。
創建人臉集合,并加入face_token
#coding=utf8 import requests url='https://api-cn.faceplusplus.com/facepp/v3/faceset/create'payload={'api_key':'XXX','api_secret':'XXX','display_name':'Dorm_1014','outer_id':'dorm','force_merge':1,'face_tokens':'68e7d175387f7c513aae284b75bfd764' }r=requests.post(url,data=payload) print(r.text)說明
9.face_tokens里面填的就是剛才使用本地素材2運行face_token代碼所生產的face_token
10.apikey/apisecret必填 沒有的自行申請見說明7
11.面部集合的名字也要記住,待會查詢的時候也會用到的。將上一部分獲取到的face_token加入到一個新建的人臉集合中。下次人臉對比將直接跟服務端收錄的做指紋對比。
12.這里再簡單的點一下payload里面的幾個參數:
display_name:人臉集合的名字
outer_id:FaceSet全局自定義標識
force_merge:
0:不將 face_tokens 加入已存在的 FaceSet 中,直接返回 FACESET_EXIST 錯誤
1:將 face_tokens 加入已存在的 FaceSet 中
face_tokens:傳入的人臉標識
13.因為我們要創建集合可以找到Face++里所需調用的url
創建一個人臉的集合 FaceSet,用于存儲人臉標識 face_token。一個 FaceSet 能夠存儲10000個 face_token。試用API Key可以創建1000個FaceSet,正式API Key可以創建10000個FaceSet。
此代碼中的url為:https://api-cn.faceplusplus.com/facepp/v3/faceset/create
creatingCollectionFaces運行結果
運行完畢后,會返回一個faceset_token,這個地方我們要記錄下來,因為我們已經把我們的奧巴馬的facetoken上傳到服務端的我們創建的集合里了,這個faceset token就是我們的面部集合id 或者說是一個相冊都可以。
判斷是否為管理員:
#coding=utf8 import cv2 import requests import json flag = 0 while flag==0:capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)while True:ret, frame = capture.read()if ret == True:cv2.imshow('My Camera', frame)key = cv2.waitKey(10)if key == 27:flag = 1breakif key == ord('x'):filename = "face.jpg"cv2.imwrite(filename,frame)print('正在進行認證')breakdel (capture)cv2.destroyWindow("camera")if flag==0:url = 'https://api-cn.faceplusplus.com/facepp/v3/search'payload = {'api_key':'XXX','api_secret':'XXX','faceset_token':'0a3432dfd7001448c48c308ed743abad'}files = {'image_file':open('face.jpg','rb')}r = requests.post(url, files=files, data=payload)data = json.loads(r.text)print(data)print( r.text)# print(data["results"][0]["face_token"]=='dc83bd034ef87241e8fcb99bf088ed5f')# if data["results"][0]["face_token"] == "ba24b26bc85ce3048a4e0b6ebee4acb2" and data["results"][0]["confidence"]>=data["thresholds"]["1e-5"]:if data["results"][0]["face_token"] == "dc83bd034ef87241e8fcb99bf088ed5f" and data["results"][0]["confidence"]>=data["thresholds"]["1e-5"]:name = "奧巴馬"print('認證成功,奧巴馬')elif data["results"][0]["face_token"] == "bdc963938ef0f2b26001b5f8ef086ea6" and data["results"][0]["confidence"]>=data["thresholds"]["1e-5"]:name = "特朗普"print('認證成功,特朗普')說明
14.此代碼中的url為查找需要調用的url:https://api-cn.faceplusplus.com/facepp/v3/search
在一個已有的 FaceSet 中找出與目標人臉最相似的一張或多張人臉,返回置信度和不同誤識率下的閾值。
支持傳入圖片或 face_token 進行人臉搜索。使用圖片進行搜索時會選取圖片中檢測到人臉尺寸最大的一個人臉。
我們將本地素材2的面部值(face token)放入此代碼的if里面,將要去查詢的面部集合(相冊)設置為我們前面獲取的faceset tokens(此代碼中的faceset tokens所填的是creatingCollectionFaces于運行結果中產生的faceset tokens),然后我們隨便照一張照片匹配一下。
15.按x截屏(不是在編輯器里輸入x,點擊生成的攝像頭畫面按x)
重點來啦!!!!需要說明的幾點
1.如果faceDetection運行出現一直是“正在認證識別”沒有反應,有兩種情況第一種API KEY 免費的使用次數用完了(大概20次),這個問題搞了我好長時間(血與淚啊!!!)。第二種,本地素材沒有上傳到服務器,多執行幾次試試。
2.此程序可以多次認證,按x可以多次認證,前提是你把數據傳到服務器了,可以從face_token執行多人的圖片,然后按照步驟執行,最后在faceDetection中繼續加elif即可。
第一次寫博客(算是博客吧,哈哈哈哈),希望大家批評指正。
總結
以上是生活随笔為你收集整理的基于Face++使用python+opencv来实现人脸验证及人脸解锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10如何彻底关闭实时保护(第二种才
- 下一篇: 【Python案例】——利用Django