本文以用【python】调用【百度】【人脸识别API】为例,如果调用其他API可类比
提前声明:作者刚开始学习python,是只菜🐓,水平有限。如有错误欢迎指正!
参考文档:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3,官方文档已经写的很详细了,可以直接参考
简单来说就是:
①注册/登录百度账号(第一次登录时会进行开发者认证)
②按如下操作创建应用,填写应用名称、应用类型、应用描述等。一个应用就是一个项目板块。
③应用创建成功后,会生成密钥:App Key, API Key与Secret Key。后两者一会儿获取Access Token时有用,可以先复制下来。
参考文档:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu
Access Token是访问令牌,就是百度发给我们的允许调用他的API的通行证,现在我们有了密钥可以获取了。
官方已经给出了各种语言获取Access Token的代码,我们用python就直接复制python代码即可:
# encoding:utf-8
import requests
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
if response:
print(response.json())
注意第六行要用刚刚我们获得的API Key与Secret Key分别替换【官网获取的AK】与【官网获取的SK】
在pycharm中运行代码,获得如下结果:
![img](file:///C:\Users\hxz\AppData\Roaming\Tencent\Users\1203729165\QQ\WinTemp\RichOle@I%2]0DE{B3R64CP6MUOJ~T.png)
我们需要的就是画红框的access_token部分,复制它。注意不要复制成了第一个refresh_token。
现在我们获取通行证成功了,可以去调用人脸识别代码了。
官方参考文档:https://ai.baidu.com/ai-doc/FACE/yk37c1u4t,具体的各种输入与输出参数可直接查阅官方参考文档
同样,文档中已经给出了调用人脸识别代码的各种语言,这里我们仍然选择python:
# encoding:utf-8
import requests
'''
人脸检测与属性分析
'''
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
params = "{\"image\":\"027d8308a2ec665acb1bdf63e513bcb9\",\"image_type\":\"FACE_TOKEN\",\"face_field\":\"faceshape,facetype\"}"
access_token = '[调用鉴权接口获取的token]'
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
if response:
print (response.json())
注意,这里我们需要自行修改自己的image、image_type与Access Token参数。Access Token直接复制之前我们获得的即可,image与image_type具体见下表。
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
image | 是 | string | 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断 |
image_type | 是 | string | 图片类型 BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M; URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长); FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 |
这里我们用本地图片,image_type选择BASE64(当然也可以用另外两种)。
现在我们要获取图片的BASE64码:
低级方法:打开chrome浏览器,将本地图片直接拖入浏览器窗口,然后按F12打开控制台,点击Source选择自己的图片,里面的编码即为图片的BASE64编码,复制后粘贴至image参数后即可(可能会很长很长,但不影响);
高级方法:使用下列代码获取图片的BASE64编码
def lujing(filePath): # filePath是运行文件的路径,如果外面调用该函数则文件路径是外部文件,后期需要改变路径打开图片
with open(filePath, 'rb') as f:
base64_data = base64.b64encode(f.read())
s = base64_data.decode()
return s
注意,如果要检测照片中的多个人脸需要修改输入参数max_face_num,因为该参数默认是1(即默认只识别一张最大的人脸,无论照片中包含几张人脸):
参数 | 必选 | 类型 | 说明 |
---|---|---|---|
max_face_num | 否 | uint32 | 最多处理人脸的数目,默认值为1,仅检测图片中面积最大的那个人脸;最大值10,检测图片中面积最大的几张人脸。 |
我们像这样在params的一堆输入参数后添加max_face_num,改到我们想要的最多识别人脸数(这里改到最大10)。
设置断点并调试,获得人脸识别结果如下:
经过人工整理,如下:
在注释内写了各个参数的含义,具体的输出参数说明见参考文档。
C:\Users\hxz\AppData\Local\Programs\Python\Python38\python.exe E:/study/python/python1/python1-2.py
{
'error_code': 0,#错误码0,即没有错误;如果出现别的错误码可在官方文档中查询错误类型。
'error_msg': 'SUCCESS',
'log_id': 7545450520145,
'timestamp': 1599873549,
'cached': 0,
'result':
{
'face_num': 2,
#检测到的人脸数量
'face_list':
#人脸列表
[{#这是第一张人脸
'face_token': '83ea81c2ca6665edc26f1ce97aab4b76',
#face_token是人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。
'location':
#人脸位置
{
'left': 771.25,
#离图片左侧距离
'top': 412.8,
#离图片上侧距离
'width': 344,
#人脸宽度
'height': 351,
#人脸高度
'rotation': -27
#人脸框相对于竖直方向的顺时针旋转角,[-180,180]
},
'face_probability': 1,
#人脸置信度,范围【0~1】,代表这是一张人脸的概率,0最小、1最大。
'angle':
#人脸旋转角度参数
{
'yaw': 7.39,
#三维旋转之左右旋转角[-90(左), 90(右)]
'pitch': 4.46,
#三维旋转之俯仰角度[-90(上), 90(下)]
'roll': -30.57
#平面内旋转角[-180(逆时针), 180(顺时针)]
},
'face_shape':
#脸型
{
'type': 'oval',
#square: 正方形 triangle:三角形 oval: 椭圆 heart: 心形 round: 圆形
'probability': 0.56
#置信度,范围【0~1】,代表这是人脸形状判断正确的概率,0最小、1最大。
},
'face_type':
#真实人脸/卡通人脸
{
'type': 'human',
#human: 真实人脸 cartoon: 卡通人脸
'probability': 1
#人脸类型判断正确的置信度,范围【0~1】,0代表概率最小、1代表最大。
}
},
{#这是第二张人脸
'face_token': '482e59227e460b832e24db187e6b64e2',
'location':
{
'left': 279.16,
'top': 363.27,
'width': 291,
'height': 289,
'rotation': 26
},
'face_probability': 1,
'angle':
{
'yaw': -9.57,
'pitch': -5.38,
'roll': 23.42
},
'face_shape':
{
'type': 'square',
'probability': 0.44
},
'face_type':
{
'type': 'human',
'probability': 0.99
}
}]
}}
Process finished with exit code 0
本文章使用limfx的vsocde插件快速发布