您的位置:首页 > 编程语言 > Python开发

动手实操:如何用 Python 实现人脸识别,证明这个杨幂是那个杨幂?

2017-07-21 15:04 609 查看



当前,人脸识别应用于许多领域,如支付宝的用户认证,许多的能识别人心情的AI,也就是人的面部表情,还有能分析人的年龄等等,而这里面有着许多的难度,在这里我想要分享的是一个利用七牛SDK简单的实现人脸识别的方法,当然七牛的SDK中提供了很多的拓展,在返回的JSON中包含着如年龄等信息,这里就不进行分享了。这里我们要使用的是七牛云平台中由阅面科技提供的API。


以下为官方给出的功能:

人脸1v1比对

人脸关键点(106点)

人脸属性(年龄,性别)

我们要用的服务就是第一个:人脸1v1比对

需求分析

要做安全方面的内容,依靠人脸识别通过和库中的脸比对后判定相似率来验证用户身份。

快速从图片中识别出人的信息,用于寻人功能等。

其实从安全的角度出发有很多可以囊括的。比如智能家居中的刷脸开门,支付软件的刷脸支付等都是例子。

人脸特征提取的步骤

真正的人脸识别需要很多的知识,大体上粗略的可以分为以下步骤:

  1.人脸检测(从图片中找到人脸):返回人脸位置和大小的参数。
  2.人脸特征定位:一般69点或者106个点对人脸的特征定位,技术上有Adaboost&haar,以及MSRA的alignment。
  3.人脸特征归一化(几何归一/灰度归一):前者对图像进行仿射变化使得不同的脸可以进行比对,后者则能使图像展现更多的细节以及减弱光线光照的应用。
  4.特征提取-特征后期融合。(基于特征近似度的多特征融合)
  5.特征距之间的距离来比对相似度、三氏距离。(马氏、欧氏、巴氏)

(以上根据以前查到整理的资料得出,可能会存在认识错误)
可以看出如果直接对人脸进行分析是很复杂的,而现在也有很多成熟的人脸识别库,像是有名的OpenCV,OpenBR,还有国产的SeetaFaceengine等等很多,这里就先不介绍了,而利用开源云平台的API可以使我们的工作量更加的小。

七牛云API的优点

应用七牛云平台的API对于使用者的能力要求较低,开发速度很快,只要输入/返回即可,但更加适用于移动端。

操作过程中的注意事项

每张图片要先上传到bucket中才可以利用。

API对人脸匹配再返回很大程度依赖于用户的网络带宽。

当用户网络不好的情况下需要很久的时间才能得到返回结果。

要经过压缩处理,一般识别的较为准确最多可将图片压缩至25kb左右。

使用七牛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加密(这里只要importpython的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个库

#importSDK
fromqiniuimportAuth,put_file,etag
importqiniu.config
importrequestsimportbase64
importjson
fromPILimportImage
importos


requests库,json库,PIL库请自行安装;
base64库和OS库为自带所以无需安装。

(由于电脑已经安装了较多库,所以对于这些库是否为自带也记得不太清楚,如果出现了错误,请大家对应自己安装。)

程序的实现

请见下方的代码,采集到的人脸为face.jpg。(这里用了杨幂的两张图片作为示例)

#七牛云"人脸识别"功能的python实现方法:byxlxw
#请得到自己的Secret和Accesskey用于上传图片到空间中进行处理
#人像识别是七牛云的一项收费项目,价格为¥1.5/1000次测试时请先存2元避免意外

#importSDK
fromqiniuimportAuth,put_file,etag
importqiniu.config
importrequests
importbase64
importjson
fromPILimportImage
importos

#上传
defupload(bucket,path,filename,key,url):
token=key.upload_token(bucket,filename,3600)
print('正在上传..')
reform,inform=put_file(token,filename,path)
ifreform!=None:
print('已经成功地将{}->>{}'.format(filename,bucket))
print("正在处理您的图片...")
url=url+'/'+filename
path=path.split('/')[-1]
else:
print('这里出现了一个小错误.无法上传..')

#调用API
defapiget(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
returnr.text
except:
print("网络发生故障,请重试..")

#base64Encode
defbase64encode(url):
try:
print("正在加密链接..")
enurl=base64.urlsafe_b64encode(bytes(url,"utf-8"))
print("加密完成")
enurl=str(enurl)
enurl=enurl.split("'")[1]
returnenurl
except:
print("这里出现了一个问题,请重试..")

#PIL图片压缩
defpilresize(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))

defpilwork(path):
try:
size=os.path.getsize(path)
size=float(size)
kb=size/1024
per=10/kb
pilresize(per,path)
except:
print("请检查您的地址是否输入错误")

#JSON分析
defjsonanal(jtext):
print("正在分析,请稍后..")
rj=json.loads(jtext)
stat=rj['status']
confi=rj['confidence']
returnstat+','+str(confi)

#主体
defmain():
#填写你的AK和SK
accesskey=input('请输入您在七牛云的AccessKey:')
secretkey=input('请输入您在七牛云的SecretKey:')

#鉴定身份
keyq=Auth(accesskey,secretkey)

#所要操作的空间
bucketname=input("请输入要操作的空间(公开)名字:")

#所要操作空间的外链地址
urlbucket=input("请输入空间所绑定的域名或者默认外链地址:")

#判定操作类型
while1:
order=input('请输入你需要进行的操作:')
mode=order.split('')[0]
ifmode=='识别':
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,得到最终相似度
ifresult.split(',')[0]=='invalid':
print('识别发生了错误')
else:
ifeval(result.split(',')[1])>=0.7:
print("识别成功,鉴定为本人,相似度为{:.1f}".format(eval(result.split(',')[1])*100))
else:
print("识别成功,鉴定不是本人,相似度过低")
ifmode=='退出':
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里)。

可另外再加入一些标准图片,如低光,不戴眼镜等等的图片,然后设计一个评判算法来适应各种各样的情况.本文就不再进行拓展,有兴趣的朋友可以试试。

推荐阅读

动手实操:如何用6小时写个上传七牛云的桌面客户端

动手实操:如何用七牛云API实现相片地图

原文地址:Python在七牛云平台的应用(三)简单的人脸识别



报名方式:有更多有趣的作品分享给大家?扫描上方二维码和美女队长接头,即可成为【动手实操】系列玩家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
章节导航