需求分析 要做安全方面的內容,依靠人臉識別通過和庫中的臉比對後判定相似率來驗證用戶身份。 快速從圖片中識別出人的信息,用於尋人功能等。 其實從安全的角度出發有很多可以囊括的。比如智能家居中的刷臉開門,支付軟體的刷臉支付等都是例子。 人臉特征提取的步驟 真正的人臉識別需要很多的知識,大體上粗略的可以分 ...
需求分析
要做安全方面的內容,依靠人臉識別通過和庫中的臉比對後判定相似率來驗證用戶身份。
快速從圖片中識別出人的信息,用於尋人功能等。
其實從安全的角度出發有很多可以囊括的。比如智能家居中的刷臉開門,支付軟體的刷臉支付等都是例子。
人臉特征提取的步驟
真正的人臉識別需要很多的知識,大體上粗略的可以分為以下步驟:
1.人臉檢測(從圖片中找到人臉):返回人臉位置和大小的參數。
2.人臉特征定位:一般 69 點或者 106 個點對人臉的特征定位,技術上有 Adaboost&haar,以及 MSRA 的 alignment。
3.人臉特征歸一化(幾何歸一/灰度歸一):前者對圖像進行仿射變化使得不同的臉可以進行比對,後者則能使圖像展現更多的細節以及減弱光線光照的應用。
4.特征提取-特征後期融合。(基於特征近似度的多特征融合)
5.特征距之間的距離來比對相似度、三氏距離。(馬氏、歐氏 、巴氏)
操作過程中的註意事項
- 每張圖片要先上傳到 bucket 中才可以利用。
- API 對人臉匹配再返回很大程度依賴於用戶的網路帶寬。
- 當用戶網路不好的情況下需要很久的時間才能得到返回結果。
- 要經過壓縮處理,一般識別的較為準確最多可將圖片壓縮至 25 kb 左右。
我們要進行如下的步驟:
1)得到我們剛剛通過攝像頭取得的人像
2)對我們的人像圖片進行壓縮
3)上傳我們的人像圖片到我們的 bucket 中
(這裡要申明一點,七牛所有支持的 API 都要求文件在華東的 Bucket 下)
4)得到我們上傳的圖片的鏈接地址
5)對鏈接進行 urlbase64 加密(這裡只要 import python 的 base64 庫即可)
6)請求 API
7)得到網頁的 JSON 格式數據
8)通過 JSON 庫對數據進行分析
9)判斷人臉的相似度是否符合,輸出結果
10)刪除 Bucket 中上傳的臨時圖片
返回的 JSON 格式分析
{"status":"ok","confidence":0.73065597}複製代碼
我們可以看到返回的 JSON 信息很簡單, status 的意思是成功和不成功,而 confidence 則是相似度,所以我們對返回的信息進行分析會很簡單。 status 如若成功則為 ok,不成功則為 invalid。
人臉相似度的判斷
上表中所用的圖片都來自己互聯網,從表數據我們可以大致將本人的相似度以 0.7 為分界線。不過有趣的是,不知道為什麼按楊冪進行整容的為什麼相似度竟然低於楊冪和範冰冰的相似度(其他女星照的圖片為範冰冰的人像),不同性別的相似度差異明顯,所以就粗略的根據表格定為 >0.7 即可認為是本人。
安裝所需的庫
在 python 中,我分享的這個例子總共需要引入 6 個庫
1 #import SDK 2 #Python學習交流群:125240963,群內每天分享乾貨,包括最新的python企業案例學習資料和零基礎入門教程,歡迎各位小伙伴入群學習交流 3 from qiniu import Auth,put_file,etag 4 import qiniu.config 5 import requestsimport base64 6 import json 7 from PIL import Image 8 import os
requests 庫,json 庫,PIL 庫請自行安裝;
base64 庫和 OS 庫為自帶所以無需安裝。
(由於電腦已經安裝了較多庫,所以對於這些庫是否為自帶也記得不太清楚,如果出現了錯誤,請大家對應自己安裝。)
程式的實現
請見下方的代碼,採集到的人臉為 face.jpg。 (這裡用了楊冪的兩張圖片作為示例)
1 #七牛雲"人臉識別"功能的python實現方法:by xlxw 2 #請得到自己的Secret和Access key用於上傳圖片到空間中進行處理 3 #人像識別是七牛雲的一項收費項目,價格為 ¥1.5/1000次 測試時請先存2元避免意外 4 5 #import SDK 6 from qiniu import Auth,put_file,etag 7 import qiniu.config 8 import requests 9 import base64 10 import json 11 from PIL import Image 12 import os 13 14 #上傳 15 def upload(bucket,path,filename,key,url): 16 token = key.upload_token(bucket, filename, 3600) 17 print('正在上傳..') 18 reform,inform = put_file(token, filename, path) 19 if reform != None: 20 print('已經成功地將{}->>{}'.format(filename,bucket)) 21 print("正在處理您的圖片...") 22 url=url + '/' + filename 23 path=path.split('/')[-1] 24 else: 25 print('這裡出現了一個小錯誤.無法上傳..') 26 27 #調用API 28 def apiget(urlbucket,url): 29 try: 30 url=urlbucket + '/001.jpg' + '?face-analyze/verification/url/' + url 31 #標準對比的圖片地址,名稱為001.jpg 32 r=requests.get(url) 33 r.raise_for_status() 34 r.encoding=r.apparent_encoding 35 return r.text 36 except: 37 print("網路發生故障,請重試..") 38 39 #base64 Encode 40 def base64encode(url): 41 try: 42 print("正在加密鏈接..") 43 enurl=base64.urlsafe_b64encode(bytes(url, "utf-8")) 44 print("加密完成") 45 enurl=str(enurl) 46 enurl=enurl.split("'")[1] 47 return enurl 48 except: 49 print("這裡出現了一個問題,請重試..") 50 51 #PIL 圖片壓縮 52 def pilresize(per,path): 53 im=Image.open(path) 54 imsize=im.size 55 sizex=int(imsize[0]*per) 56 sizey=int(imsize[1]*per) 57 im=im.resize((sizex,sizey)) 58 im.save('trans.jpg','JPEG') 59 print('圖片壓縮完成,輸出成功') 60 print('{}->>({},{})'.format(imsize,sizex,sizey)) 61 62 def pilwork(path): 63 try: 64 size=os.path.getsize(path) 65 size = float(size) 66 kb=size/1024 67 per=10/kb 68 pilresize(per,path) 69 except: 70 print("請檢查您的地址是否輸入錯誤") 71 72 73 #JSON分析 74 def jsonanal(jtext): 75 print("正在分析,請稍後..") 76 rj=json.loads(jtext) 77 stat=rj['status'] 78 confi=rj['confidence'] 79 return stat + ',' +str(confi) 80 81 #主體 82 def main(): 83 #填寫你的 AK 和 SK 84 accesskey = input('請輸入您在七牛雲的AccessKey:') 85 secretkey = input('請輸入您在七牛雲的SecretKey:') 86 87 #鑒定身份 88 keyq=Auth(accesskey,secretkey) 89 90 #所要操作的空間 91 bucketname =input("請輸入要操作的空間(公開)名字:") 92 93 #所要操作空間的外鏈地址 94 urlbucket = input("請輸入空間所綁定的功能變數名稱或者預設外鏈地址:") 95 96 #判定操作類型 97 while 1: 98 order=input('請輸入你需要進行的操作:') 99 mode=order.split(' ')[0] 100 if mode == '識別': 101 path=order.split(' ')[1] 102 fname=path.split('/')[-1:][0] 103 unrl=urlbucket+'/trans.jpg' 104 print('正在壓縮圖片.請稍後..') 105 #調用函數 106 pilwork(path) #壓縮圖片 107 print("正在上傳token,請稍後..") 108 upload(bucketname,'./trans.jpg','trans.jpg',keyq,urlbucket) #上傳文件 109 enurl=base64encode(unrl) #base64加密 110 jtext=apiget(urlbucket,enurl) #調用七牛api並得到返回的json數據 111 result=jsonanal(jtext) #分析返回的json,得到最終相似度 112 if result.split(',')[0] == 'invalid': 113 print('識別發生了錯誤') 114 else: 115 if eval(result.split(',')[1]) >= 0.7: 116 print("識別成功,鑒定為本人,相似度為{:.1f}".format(eval(result.split(',')[1])*100)) 117 else: 118 print("識別成功,鑒定不是本人,相似度過低") 119 if mode == '退出': 120 print("歡迎您的使用..") 121 break 122 123 #終端提示顯示 124 print("+----------------------------------------+") 125 print("| 歡迎使用七牛的人臉識別功能 |") 126 print("+----------------------------------------+") 127 print("|本程式須知: |") 128 print("|1.本程式測試圖片為楊冪的人像,見face.jpg |") 129 print("|2.您需要提供服務的Accesskey,Secretkey |") 130 print("|3.您需要提供 bucket名字和bucket外鏈地址 |") 131 print("+----------------------------------------+") 132 print("|使用方法: |") 133 print("|1.識別輸入格式: 識別 圖片位置(包括尾碼)|") 134 print("|2.退出輸入格式: 退出 |") 135 print("+----------------------------------------+") 136 main()
程式運行的截圖:
用到的楊冪的兩張照片為:
(均來自百度圖片)
(用於比對的標準人像圖片)
(已用 PIL 壓縮 x0.3,y0.3)
(用於比對的圖片)
作者:七牛雲鏈接:https://juejin.im/post/59719caef265da6c4741cdd7