前言
這是最后一篇介紹python在七牛雲平台的應用了,因為-前兩篇文章第一篇分享了怎么安裝七牛的官方庫以及怎么對自己的空間進行下載上傳,刪除等行動.而第二篇則分享了怎么利用七牛的API接口,由於七牛的接口方式幾乎差不多,所以不再對七牛的各個SDK進行測試了,像是物體識別,格式轉換等等很實用的功能.有興趣的朋友可以分享下自己的經驗.而這最后一篇介紹七牛主要是來講述怎么用urlbase64編碼鏈接.以及怎么得到一些API回傳的JSON格式的數據.這樣幾乎七牛的所有API都可以使用了.
背景介紹
當前,人臉識別應用於許多領域.如支付寶的用戶認證.許多的能識別人心情的AI,也就是人的面部表情.還有能分析人的年齡等等.而這里面有着許多的難度.在這里我想要分享的是一個利用七牛SDK簡單的實現人臉識別的方法.當然七牛的SDK中提供了很多的拓展,在返回的JSON中包含着如年齡等信息,這里就不進行分享了.這里我們要使用的是七牛雲平台中由閱面科技提供的API.
以下為官方給出的功能:
- 人臉1v1比對
- 人臉關鍵點(106點)
- 人臉屬性(年齡,性別)
我們要用的服務就是第一個:人臉1v1比對
需求分析
1.要做安全方面的內容,依靠人臉識別通過和庫中的臉比對后判定相似率來驗證用戶身份.
2.快速從圖片中識別出人的信息,用於尋人功能等.
其實從安全的角度出發有很多可以囊括的.比如智能家居中的刷臉開門,支付軟件的刷臉支付等都是例子.
人臉特征提取的步驟
真正的人臉識別需要很多的知識,大體上粗略的可以分為以下步驟:
1.人臉檢測(從圖片中找到人臉):返回人臉位置和大小的參數
2.人臉特征定位:一般69點或者106個點對人臉的特征定位,技術上有Adaboost&haar,以及MSRA的alignment.
3.人臉特征歸一化(幾何歸一/灰度歸一):前者對圖像進行仿射變化使得不同的臉可以進行比對.后者則能使圖像展現更多的細節以及減弱光線光照的應用.
4.特征提取-特征后期融合(基於特征近似度的多特征融合)
5.特征距之間的距離來比對相似度. 三氏距離(馬氏 歐氏 巴氏)
(以上根據以前查到整理的資料得出,可能會存在認識錯誤)
可以看出如果直接對人臉進行分析是很復雜的,而現在也有很多成熟的人臉識別庫,像是有名的OpenCV ,OpenBR,還有國產的Seeta Face engine等等很多,這里就先不介紹了,而利用開源雲平台的API可以使我們的工作量更加的小.
優點*缺點
優點: 應用七牛雲平台的API對於使用者的能力要求較低,開發速度很快,只要輸入/返回即可.但更加適用於移動端
缺點:由於七牛雲要求每張圖片要先上傳到bucket中才可以利用API對人臉匹配再返回,這很大程度依賴於用戶的網絡帶寬,可能當用戶網絡不好的情況下需要很久的時間才能得到返回結果,所以要經過壓縮處理。經過我的測試,一般識別的較為准確最多可將圖片壓縮至25kb左右,這個大小在當今的網絡來看上傳還是可以接受的.
使用七牛API的接口准備
這里需要第一篇博文中的操作七牛雲空間的方法->Python在七牛雲平台的應用(一) (傳送門)
以及上一篇博文(第二篇)中分享的requests庫的使用->Python在七牛雲平台的應用(二)圖片瘦身 (傳送門)
我們需要用到的有qiniu庫的上傳/鑒權命令.以及requests庫得到處理后的圖像,以及json庫得到返回給我們的保存在JSON中的信息.
另外七牛的這個接口和圖片瘦身接口一樣也是要付錢的,具體的價格根據官方給的是(人臉識別對比服務->¥1.5/1000次)可以先向賬戶充入¥2避免無法使用服務.
解決問題的步驟
為了簡化這個問題,所以本實例僅凸顯上傳->識別->返回結果的過程,對於如何通過電腦攝像頭取像,窗體制作僅提供方法和思路不進行詳細分享.
首先,我們先分析七牛雲中這個API的接口
http://xxx.xxx.glb.clouddn.com/xxx.jpg?face-analyze/verification/url/<urlSafeBase64URI> <!-- 人臉一對一比對API-->
我們來分析下這個接口:前面的
http://xxx.xxx.glb.clouddn.com/xxx.jpg 是我們剛剛上傳的人像圖片的鏈接地址
?face-analyze/verification/url/<urlSafeBase64URI> 是API的接口,其中我們將最后的這句
<urlSafeBase64URI>單獨拿出來說,因為這個的意思是要將我們用於人像比對的標准人像圖片的地址經過urlbase64加密后的地址信息
所以我們要進行如下的步驟:
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
人臉相似度的判斷
編號 | 對比樣本 | 相似度 |
1 |
楊冪的生活照 | 0.73065597 |
2 |
整容成楊冪的女性圖片 | 0.4544274 |
3 |
其他女星圖片 | 0.6007395 |
4 |
男星圖片 | 0.17771657 |
上表中所用的圖片都來自己互聯網,從表數據我們可以大致將本人的相似度以0.7位分界線.不過有趣的是,不知道為什么按楊冪進行整容的為什么相似度竟然低於楊冪和范冰冰的相似度(其他女星照的圖片為范冰冰的人像),不同性別的相似度差異明顯,所以就粗略的根據表格定為>0.7即可認為是本人
安裝所需的庫
在python中,我分享的這個例子總共需要引入6個庫
#import SDK from qiniu import Auth,put_file,etag import qiniu.config import requests import base64 import json from PIL import Image import os
其中qiniu的庫安裝方法請看第一篇博客->Python在七牛雲平台的應用(一) (傳送門)
requests庫,json庫,PIL庫請自行安裝
base64庫和OS庫為自帶所以無需安裝
(由於電腦已經安裝了較多庫,所以對於這些庫是否為自帶也記得不太清楚,如果出現了錯誤,請大家對應自己安裝)
程序的實現
請見下方的代碼,采集到的人臉為face.jpg(這里用了楊冪的兩張圖片作為示例)
#七牛雲"人臉識別"功能的python實現方法:by xlxw #請得到自己的Secret和Access key用於上傳圖片到空間中進行處理 #人像識別是七牛雲的一項收費項目,價格為 ¥1.5/1000次 測試時請先存2元避免意外 #import SDK from qiniu import Auth,put_file,etag import qiniu.config import requests import base64 import json from PIL import Image import os #上傳 def upload(bucket,path,filename,key,url): token = key.upload_token(bucket, filename, 3600) print('正在上傳..') reform,inform = put_file(token, filename, path) if reform != None: print('已經成功地將{}->>{}'.format(filename,bucket)) print("正在處理您的圖片...") url=url + '/' + filename path=path.split('/')[-1] else: print('這里出現了一個小錯誤.無法上傳..') #調用API def apiget(urlbucket,url): try: url=urlbucket + '/001.jpg' + '?face-analyze/verification/url/' + url #標准對比的圖片地址,名稱為001.jpg r=requests.get(url) r.raise_for_status() r.encoding=r.apparent_encoding return r.text except: print("網絡發生故障,請重試..") #base64 Encode def base64encode(url): try: print("正在加密鏈接..") enurl=base64.urlsafe_b64encode(bytes(url, "utf-8")) print("加密完成") enurl=str(enurl) enurl=enurl.split("'")[1] return enurl except: print("這里出現了一個問題,請重試..") #PIL 圖片壓縮 def pilresize(per,path): im=Image.open(path) imsize=im.size sizex=int(imsize[0]*per) sizey=int(imsize[1]*per) im=im.resize((sizex,sizey)) im.save('trans.jpg','JPEG') print('圖片壓縮完成,輸出成功') print('{}->>({},{})'.format(imsize,sizex,sizey)) def pilwork(path): try: size=os.path.getsize(path) size = float(size) kb=size/1024 per=10/kb pilresize(per,path) except: print("請檢查您的地址是否輸入錯誤") #JSON分析 def jsonanal(jtext): print("正在分析,請稍后..") rj=json.loads(jtext) stat=rj['status'] confi=rj['confidence'] return stat + ',' +str(confi) #主體 def main(): #填寫你的 AK 和 SK accesskey = input('請輸入您在七牛雲的AccessKey:') secretkey = input('請輸入您在七牛雲的SecretKey:') #鑒定身份 keyq=Auth(accesskey,secretkey) #所要操作的空間 bucketname =input("請輸入要操作的空間(公開)名字:") #所要操作空間的外鏈地址 urlbucket = input("請輸入空間所綁定的域名或者默認外鏈地址:") #判定操作類型 while 1: order=input('請輸入你需要進行的操作:') mode=order.split(' ')[0] if mode == '識別': path=order.split(' ')[1] fname=path.split('/')[-1:][0] unrl=urlbucket+'/trans.jpg' print('正在壓縮圖片.請稍后..') #調用函數 pilwork(path) #壓縮圖片 print("正在上傳token,請稍后..") upload(bucketname,'./trans.jpg','trans.jpg',keyq,urlbucket) #上傳文件 enurl=base64encode(unrl) #base64加密 jtext=apiget(urlbucket,enurl) #調用七牛api並得到返回的json數據 result=jsonanal(jtext) #分析返回的json,得到最終相似度 if result.split(',')[0] == 'invalid': print('識別發生了錯誤') else: if eval(result.split(',')[1]) >= 0.7: print("識別成功,鑒定為本人,相似度為{:.1f}".format(eval(result.split(',')[1])*100)) else: print("識別成功,鑒定不是本人,相似度過低") if mode == '退出': print("歡迎您的使用..") break #終端提示顯示 print("+----------------------------------------+") print("| 歡迎使用七牛的人臉識別功能 |") print("+----------------------------------------+") print("|本程序須知: |") print("|1.本程序測試圖片為楊冪的人像,見face.jpg |") print("|2.您需要提供服務的Accesskey,Secretkey |") print("|3.您需要提供 bucket名字和bucket外鏈地址 |") print("+----------------------------------------+") print("|使用方法: |") print("|1.識別輸入格式: 識別 圖片位置(包括后綴)|") print("|2.退出輸入格式: 退出 |") print("+----------------------------------------+") main()
程序運行的截圖:
用到的楊冪的兩張照片為:(均來自百度圖片)
(用於比對的標准人像圖片)(已用PIL壓縮 x*0.3,y*0.3)
用於比對的圖片:(未壓縮)
總結和拓展:
總結:
和大家分享七牛的API差不多結束了(說不定以后有更好玩的API也會拿來分享經驗).所有的七牛的API都可以用這三篇文章的內容進行調用,七牛還有許多優秀方便的API可以方便我們的使用.在這期間也學習到了很多的知識,比如許多庫的熟悉掌握,像是requests庫,bs4庫,json庫當然還有主角Qiniu庫.
拓展:
可以用python的QT庫開發圖形界面,而VideoCapture庫可用來調用電腦的攝像頭進行拍照,然后經過本文的方法就能實現簡單的人像識別了(你需要上傳標准圖片到qiniu的bucket里)
可另外再加入一些標准圖片,如低光,不戴眼鏡等等的圖片,然后設計一個評判算法來適應各種各樣的情況.本文就不再進行拓展,有興趣的朋友可以試試.