转载自:向日葵智能
<https://www.xrkzn.cn/python-projects/python-project-face-recognization/>
前言
前面两节我们介绍了利用深度学习实现 语音合成
<https://www.xrkzn.cn/python-projects/python-project-speech-synthesis/> 和 菜品识别
<https://www.xrkzn.cn/python-projects/python-project-let-computer-recognize-dishes-2/>
。这一节,我们介绍更加热门的人工智能应用:人脸识别。人脸识别可以比对两张人脸是否属于同一人,进一步的,给一张 x 的照片,我们能够从一堆照片里识别出最像 x
的照片。
依然是调用百度的 API,我们先看看官方文档:
人脸识别官方 API 介绍
接口能力:
* 两张人脸图片相似度对比:比对两张图片中人脸的相似度,并返回相似度分值;
*
多种图片类型:支持生活照、证件照、身份证芯片照、带网纹照四种类型的人脸对比;
*
活体检测:基于图片中的破绽分析,判断其中的人脸是否为二次翻拍(举例:如用户A用手机拍摄了一张包含人脸的图片一,用户B翻拍了图片一得到了图片二,并用图片二伪造成用户A去进行识别操作,这种情况普遍发生在金融开户、实名认证等环节。);
*
质量检测:返回模糊、光照等质量检测信息,用于辅助判断图片是否符合识别要求;
请求说明:
*
请求体格式化:Content-Type为application/x-www-form-urlencoded,通过urlencode格式化请求体。
*
Base64编码:请求的图片需经过Base64编码,图片的base64编码指将图片数据编码成一串字符串,使用该字符串代替图像地址。您可以首先得到图片的二进制,然后用Base64格式编码即可。需要注意的是,图片的base64编码是不包含图片头的,如data:image/jpg;base64,
*
图片格式:现支持PNG、JPG、JPEG、BMP,不支持GIF图片
请求示例
*
HTTP方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/face/v2/match
*
URL参数:
access_token 通过API Key和Secret Key获取的access_token。
* Header:
Content-Type application/x-www-form-urlencoded
Body中放置请求参数,参数详情如下:
说明:两张请求的图片请分别进行base64编码。
python 实战代码
同前面两节一样,分两步走:
1. 获取 token
获取 token 的请求 url 与前面两节略有不同,AK 和 SK 也不同,这点要注意,不然获取到的 token 也是无法校验通过的。
下面直接上代码,文件名 token.py:
# encoding:utf-8 import urllib, urllib2, sys import ssl, json AK =
"fGTcxxxxxxxxxxxxxk68c" SK = "vKUxxxxxxxxxxxxxxxxxxxxxxxxxGq2u" # token 请求 url
与图片不一样 host =
'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials'\
'&client_id=%s'\ '&client_secret=%s' % (AK, SK) def GetToken(): request =
urllib2.Request(host) request.add_header('Content-Type', 'application/json;
charset=UTF-8') response = urllib2.urlopen(request) content = response.read() if
(content): js = json.loads(content) # return js['refresh_token'] return js[
'access_token'] return None PythonCopy <>
2. 人脸识别
这里实现的是人脸比对,即输入两张人脸图片,输出两个人脸属于同一人的得分。文件名 recg.py:
# encoding:utf-8 import base64 import urllib import urllib2, json from token
import GetToken ''' 人脸对比 ''' url =
"https://aip.baidubce.com/rest/2.0/face/v2/match" def FaceRecg(face1, face2,
token): f = open(face1, 'rb') # 参数images:图像base64编码 img1 = base64.b64encode(f.
read()) # 二进制方式打开图文件 f = open(face2, 'rb') # 参数images:图像base64编码 img2 = base64.
b64encode(f.read()) params = {"images":img1 + ',' + img2} params = urllib.
urlencode(params) request_url = url + "?access_token=" + token request = urllib2
.Request(url=request_url, data=params) request.add_header('Content-Type',
'application/x-www-form-urlencoded') response = urllib2.urlopen(request) content
= response.read() if content: js = json.loads(content) for item in js['result']:
print(u"%2.2f%% 可能是同一人" % (float(item['score']))) if __name__ == "__main__":
FaceRecg('【图片1】', '【图片2】', GetToken()) #前面两个参数是图片路径 PythonCopy <>
3. 测试
我们在代码所在路径新建一个文件夹 pic,里面放入要对比的图片:
这样,recg.py 的 main 部分的图片就可以如下给出:
if __name__ == "__main__": FaceRecg('pic/1.jpg', 'pic/2.jpg', GetToken())
#前面两个参数是图片路径 PythonCopy <>
最终测试结果如下:
两个人脸属于同一人的得分达到 86.98 分,可以看出识别结果还是不错的。
再看一组测试,这次使用两个人,看看效果:
识别结果不错,一点也不像。
再写一点
其实有了上面这些基础,我们完全可以从一堆图片里挑出给出的某一张。举个例子,我们往 pic 里再加入以下几张图片:
加上上面 4 张,一共 7 张图片,我们输入第 3 张图片:
然后从余下 6 张里挑出一张最像的,python 代码可以如下修改:
# encoding:utf-8 import base64 import urllib import urllib2, json from token
import GetToken ''' 人脸对比 ''' url =
"https://aip.baidubce.com/rest/2.0/face/v2/match" def FaceRecg(face1, face2,
token): f = open(face1, 'rb') # 参数images:图像base64编码 img1 = base64.b64encode(f.
read()) # 二进制方式打开图文件 f = open(face2, 'rb') # 参数images:图像base64编码 img2 = base64.
b64encode(f.read()) params = {"images":img1 + ',' + img2} params = urllib.
urlencode(params) request_url = url + "?access_token=" + token request = urllib2
.Request(url=request_url, data=params) request.add_header('Content-Type',
'application/x-www-form-urlencoded') response = urllib2.urlopen(request) content
= response.read() if content: js = json.loads(content) # for item in
js['result']: # print(u"%2.2f%% 可能是同一人" % (float(item['score']))) return float(
js['result'][0]['score']) if __name__ == "__main__": p = [0,0,0,0,0,0,0] for i
in range(1, 8): if i!=3: # 不识别自己 picI = 'pic/%d.jpg' % i p[i-1] = FaceRecg(
'pic/3.jpg', picI, GetToken()) print '图片 %d 的相似性得分:%2.2f' % (i, p[i-1]) print
'\n很大可能图片 %d 和图片 3 是同一人' % (p.index(max(p))+1) PythonCopy <>
最终输出结果如下:
可以看出,效果很好,至此,我们就完成了 python 人脸识别 代码。
转载自:https://www.xrkzn.cn/python-projects/python-project-face-recognization/
<https://www.xrkzn.cn/python-projects/python-project-face-recognization/>
热门工具 换一换