当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的 AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛 SDK 简单的实现人脸识别的方法,固然七牛的 SDK 中提供了不少的拓展,在返回的 JSON 中包含着如年龄等信息,这里就不进行分享了。这里咱们要使用的是七牛云平台中由阅面科技提供的 API。html
如下为官方给出的功能:python
咱们要用的服务就是第一个:人脸 1v1 比对算法
要作安全方面的内容,依靠人脸识别经过和库中的脸比对后断定类似率来验证用户身份。json
快速从图片中识别出人的信息,用于寻人功能等。api
其实从安全的角度出发有不少能够囊括的。好比智能家居中的刷脸开门,支付软件的刷脸支付等都是例子。安全
真正的人脸识别须要不少的知识,大致上粗略的能够分为如下步骤:网络
1.人脸检测(从图片中找到人脸):返回人脸位置和大小的参数。
2.人脸特征定位:通常 69 点或者 106 个点对人脸的特征定位,技术上有 Adaboost&haar,以及 MSRA 的 alignment。
3.人脸特征归一化(几何归一/灰度归一):前者对图像进行仿射变化使得不一样的脸能够进行比对,后者则能使图像展示更多的细节以及减弱光线光照的应用。
4.特征提取-特征后期融合。(基于特征近似度的多特征融合)
5.特征距之间的距离来比对类似度、三氏距离。(马氏、欧氏 、巴氏)app
(以上根据之前查到整理的资料得出,可能会存在认识错误)
能够看出若是直接对人脸进行分析是很复杂的,而如今也有不少成熟的人脸识别库,像是有名的 OpenCV ,OpenBR,还有国产的 Seeta Face engine 等等不少,这里就先不介绍了,而利用开源云平台的 API 可使咱们的工做量更加的小。ide
应用七牛云平台的 API 对于使用者的能力要求较低,开发速度很快,只要输入/返回便可,但更加适用于移动端。函数
咱们须要用到的有 Qiniu 库的上传/鉴权命令,以及 requests 库获得处理后的图像,以及 json 库获得返回给咱们的保存在 JSON 中的信息。
另外七牛的这个接口和图片瘦身接口同样也是要付钱的,具体的价格根据官方给的是(人脸识别对比服务 ->¥1.5/1000次 )能够先向帐户充入 ¥2 避免没法使用服务。
为了简化这个问题,因此本实例仅凸显 上传->识别 ->返回结果 的过程,对于如何经过电脑摄像头取像,窗体制做仅提供方法和思路不进行详细分享。
首先,咱们先分析七牛云中这个 API 的接口 :
http://xxx.xxx.glb.clouddn.com/xxx.jpg?faceanalyze/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 中上传的临时图片
{"status":"ok","confidence":0.73065597}
咱们能够看到返回的 JSON 信息很简单, status 的意思是成功和不成功,而 confidence 则是类似度,因此咱们对返回的信息进行分析会很简单。 status 如若成功则为 ok,不成功则为 invalid。
上表中所用的图片都来本身互联网,从表数据咱们能够大体将本人的类似度以 0.7 为分界线。不过有趣的是,不知道为何按杨幂进行整容的为何类似度居然低于杨幂和范冰冰的类似度(其余女星照的图片为范冰冰的人像),不一样性别的类似度差别明显,因此就粗略的根据表格定为 >0.7 便可认为是本人。
在 python 中,我分享的这个例子总共须要引入 6 个库
#import SDK from qiniu import Auth,put_file,etag import qiniu.config import requestsimport base64 import json from PIL import Image import os
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 压缩 x0.3,y0.3)
(用于比对的图片)
总结
和你们分享七牛的 API 差很少结束了(说不定之后有更好玩的 API 也会拿来分享经验)。七牛还有许多优秀方便的 API 能够方便咱们的使用.在这期间也学习到了不少的知识,好比许多库的熟悉掌握,像是 requests 库、bs4 库、 json 库固然还有主角 Qiniu 库。
拓展
能够用 python 的 QT 库开发图形界面,而 VideoCapture 库可用来调用电脑的摄像头进行拍照,而后通过本文的方法就能实现简单的人像识别了(你须要上传标准图片到 Qiniu 的 bucket 里)。
可另外再加入一些标准图片,如低光,不戴眼镜等等的图片,而后设计一个评判算法来适应各类各样的状况.本文就再也不进行拓展,有兴趣的朋友能够试试。
推荐阅读
报名方式:有更多有趣的做品分享给你们?扫描上方二维码和美女队长接头,便可成为【动手实操】系列玩家。