Python调用百度API进行人脸对比

1. 作者介绍

拜晓桦,女,西安工程大学电子信息学院,2021级研究生
研究方向:图像处理,目标检测
电子邮件:[email protected]

吴燕子,女,西安工程大学电子信息学院,2021级研究生,张宏伟人工智能课题组
研究方向:模式识别与人工智能
电子邮件:[email protected]

2. 关于Base64知识介绍

2.1 Bsae64是什么

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法
什么是“可打印字符”?为什么要用它来传输8Bit字节码?
首先,在回答这两个问题之前我们有必要来思考一下什么情况下需要使用到Base64。Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的,因为网络传输只能传输可打印字符。ASCII码的取值范围是[0,127],其中,[32,126]是可打印字符,其余是不可打印字符。也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。

2.1 Bsae64编码原理

Base64编码的思想是:采用64个基本的ASCII码字符对数据进行重新编码。
1.将需要编码的数据拆分成字节数组,以3个字节为一组,按顺序排列24位数据,再把这24位数据分成4组,即每组6位;
2.再在每组的的最高位前补两个0凑足一个字节,这样就把一个3字节为一组的数据重新编码成了4个字节;
3.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节,这时在最后一组填充1到2个0字节,并在最后编码完成后在结尾添加1到2个=号。
本次实验主要是把人脸图片运用Base64进行编码,然后对比编码后的文件完成相似度的对比。

3. 实验过程

3.1 实验过程

1.首先注册一个百度账号
2.百度AI平台https://ai.baidu.com/,找到 开放能力>人脸与人体检测>人脸对比>立即使用>创建应用
在这里插入图片描述

,点击创建 获取API Key和Secret Key
在这里插入图片描述
3.安装需要的库:pip install baidu-aip

3.2 实验代码

from urllib import request
import requests
import json
import base64

def gettoken():
    ak = '******' #获取到的API Key
    sk = '******' #获取到的Secret Key
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+ak+'&client_secret='+sk
    my_request = request.Request(host)
    my_request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = request.urlopen(my_request)
    content = response.read() #获得请求结果
    content = bytes.decode(content)#结果转化为字符
    content = eval(content[:-1])#转化为字典
    return content['access_token']
#图片转码
def to_base64(file_name1,file_name2):
    with open(file_name1,'rb')as f1:
        base64_data1 = base64.b64encode(f1.read())
        image_1 = str(base64_data1,'utf-8')
    with open(file_name2,'rb')as f2:
        base64_data2 = base64.b64encode(f2.read())
        image_2 = str(base64_data2,'utf-8')
        return image_1,image_2

request_url = "https://aip.baidubce.com/rest/2.0/face/v3/match"
image_1, image_2 = to_base64('1.jpg','3.jpg')
params = json.dumps(
[{
    
    "image": image_1, "image_type": "BASE64", "face_type": "LIVE", "quality_control": "LOW"},
{
    
    "image": image_2, "image_type": "BASE64", "face_type": "CERT", "quality_control": "LOW"}]).encode(encoding='UTF8')

access_token = gettoken()
request_url = request_url + "?access_token=" + access_token
my_request = request.Request(url=request_url,data = params)
my_request.add_header('Content-Type','json')
#urlencode处理需提交的数据
response = request.urlopen(my_request)
null =0
content = response.read()
content = bytes.decode(content)
content = eval(content)
result = content['result']
score = result['score']
print('相似度:',score)

3.3 运行结果

输出了人脸相似度 0~100(本次实验相似度为91.96734319)
在这里插入图片描述

3.4 问题分析

在这里插入图片描述
所遇问题描述:运行结果报错显示 KeyError:‘result’

报错原因:通过debug,发现在result处会显示错误码:18,对应的错误是Open api qps request limit reached。查看文字识别文档中的错误码(链接),发现原因是:QPS超限额,免费额度并发限制为2QPS,开通按量后付费或购买次数包后并发限制为10QPS,如您需要更多的并发量,可以选择购买QPS叠加包;邀测和未支持计费的接口,您可以在控制台提交工单申请提升限额。也就是说,我们没有免费的额度去调用接口,因此识别没有结果。
解决方案:百度智能云在完成个人认证之后,是可以领取免费的调取资源的,所以在创建的应用下领取资源,等待半个小时左右返回如果显示有的话,再运行代码,即可完成识别。

参考

百度API实现人脸对比.
什么是Base64.

猜你喜欢

转载自blog.csdn.net/m0_37758063/article/details/123645068