## 实战:调用百度人工智能AI api
### 一、创建应用
![image-20180924174312682](/Users/chenzhi/all-in-here/image-20180924174312682.png)
https://ai.baidu.com/docs#/Face-API/top
![image-20180924174448017](/Users/chenzhi/Library/Application Support/typora-user-images/image-20180924174448017.png)
![image-20180924185430244](/Users/chenzhi/Library/Application Support/typora-user-images/image-20180924185430244.png)
### 二、API文档说明
#### Python SDK文档
http://ai.baidu.com/docs#/Face-Python-SDK/top
接口说明
| 接口名称 | 接口能力简要描述 |
| -------- | ------------------------------------------------------------ |
| 人脸检测 | 检测人脸并定位,返回五官关键点,及人脸各属性值 |
| 人脸比对 | 返回两两比对的人脸相似值 |
| 人脸查找 | 在一个人脸集合中找到找到相似的人脸,由一系列接口组成,包括人脸识别、人脸认证、人脸库管理相关接口(人脸注册、人脸更新、人脸删除、用户信息查询、组列表查询、组内用户列表查询、组间复制用户、组内删除用户) |
#### pip安装
`pip install baidu-aip`
#### 创建AipFace
AipFace是人脸识别的Python SDK客户端,为使用人脸识别的开发人员提供了一系列的交互方法。
```pyth
from aip import AipFace
""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
```
> > 常量`APP_ID`在百度云控制台中创建,常量`API_KEY`与`SECRET_KEY`是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的**应用列表**中查看。
>
> **注意**:如您以前是百度云的老用户,其中`API_KEY`对应百度云的“Access Key ID”,`SECRET_KEY`对应百度云的“Access Key Secret”。
#### 配置AipFace
| 接口 | 说明 |
| ---------------------------- | ---------------------------------------------- |
| setConnectionTimeoutInMillis | 建立连接的超时时间(单位:毫秒 |
| setSocketTimeoutInMillis | 通过打开的连接传输数据的超时时间(单位:毫秒) |
#### 人脸检测 接口说明
```python
image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串"
imageType = "BASE64"
""" 调用人脸检测 """
client.detect(image, imageType);
""" 如果有可选参数 """
options = {}
options["face_field"] = "age"
options["max_face_num"] = 2
options["face_type"] = "LIVE"
""" 带参数调用人脸检测 """
client.detect(image, imageType, options)
```
**人脸检测 请求参数详情**
| 参数名称 | 是否必选 | 类型 | 默认值 | 说明 |
| ------------ | -------- | ------ | ------ | ------------------------------------------------------------ |
| image | 是 | string | | 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断 |
| image_type | 是 | string | | 图片类型 **BASE64**:图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长)**;FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个 |
| face_field | 否 | string | | 包括**age,beauty,expression,faceshape,gender,glasses,landmark,race,quality,facetype信息** 逗号分隔. 默认只返回face_token、人脸框、概率和旋转角度 |
| max_face_num | 否 | string | 1 | 最多处理人脸的数目,默认值为1,仅检测图片中面积最大的那个人脸;**最大值10**,检测图片中面积最大的几张人脸。 |
| face_type | 否 | string | | 人脸的类型 **LIVE**表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等**IDCARD**表示身份证芯片照:二代身份证内置芯片中的人像照片 **WATERMARK**表示带水印证件照:一般为带水印的小图,如公安网小图 **CERT**表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片 默认**LIVE** |
### Demo1示例:人脸检测
#### 1. api接口对象
```pyt
"""
定义常量
你的 APPID AK SK
"""
APP_ID = '14274926'
API_KEY = '6ms7nbS4Kl0o05CVk6IcVyYS'
SECRET_KEY = 'uiAzvTy9p0S9cwcB1cWSyo98TvrVBKKE'
# 初始化AipFace对象
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
print(client)
```
1. 读取图片
```python
def img_content(file_name):
with open(file_name, "rb") as f: # 二进制方式打开图文件
base64_data = base64.b64encode(f.read()) # 读取文件内容,转换为base64编码
# 将图片信息格式化为可提交信息,这里需要注意str参数设置
# params = json.dumps({"image": str(base64_data)})
# # params = {"image": str(base64_data)}
#
# print(params)
# print(type(params))
return base64_data
```
#### 3. 设置请求参数
```
# 请求项
options = {
'max_face_num': 2, # 图像数量
'face_field': "age,beauty,expression,faceshape", # 图片想关参数
'face_type':'LIVE',
}
```
#### 4. 调用人脸检测 并 打印
```python
# 图片转base64
img = img_content('timg2.jpg')
# 调用人脸属性检测接口
result = client.detect(img, imageType, options) # 图片、 图片类型、请求项
```
#### 5. 返回数据说明
```python
<type 'dict'>
{
"cached": 0,
"error_code": 0,
"error_msg": "SUCCESS",
"log_id": 2510110184552,
"result": {
"face_list": [
{
"age": 27,
"angle": {
"pitch": 7.550878048,
"roll": 2.938822985,
"yaw": 10.52069664
},
"beauty": 65.67142487,
"expression": {
"probability": 0.9994981289,
"type": "smile"
},
"face_probability": 1,
"face_shape": {
"probability": 0.799141109,
"type": "oval"
},
"face_token": "a449750e2ee299ea8da219b1eb640d75",
"location": {
"height": 330,
"left": 172.2874756,
"rotation": 2,
"top": 353.2367249,
"width": 363
}
}
],
"face_num": 1
},
"timestamp": 1537831007
}
```
### Demo2示例:人脸比对
#### 1. 接口说明
- **两张人脸图片相似度对比**:比对两张图片中人脸的相似度,并返回相似度分值;
- **多种图片类型**:支持**生活照**、**证件照**、**身份证芯片照**、**带网纹照**四种类型的人脸对比;
> 用于比对多张图片中的人脸相似度并返回两两比对的得分,可用于判断两张脸是否是同一人的可能性大小。
>
> 典型应用场景:如**人证合一验证**,**用户认证**等,可与您现有的人脸库进行比对验证。
#### 2. 接口及参数
```pyth
result = client.match([
{
'image': base64.b64encode(open('1.jpg', 'rb').read()),
'image_type': 'BASE64',
},
{
'image': base64.b64encode(open('2.jpg', 'rb').read()),
'image_type': 'BASE64',
}
])
```
**请求参数**
| 参数 | 必选 | 类型 | 说明 |
| ---------------- | ---- | ------ | ------------------------------------------------------------ |
| image | 是 | string | 图片信息(**总数据大小应小于10M**),图片上传方式根据image_type来判断。 **两张图片通过json格式上传,格式参考表格下方示例** |
| image_type | 是 | string | 图片类型 **BASE64**:图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M;**URL**:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长)**;FACE_TOKEN**: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个。 |
| face_type | 否 | string | 人脸的类型 **LIVE**表示生活照:通常为手机、相机拍摄的人像图片、或从网络获取的人像图片等,**IDCARD**表示身份证芯片照:二代身份证内置芯片中的人像照片, **WATERMARK**表示带水印证件照:一般为带水印的小图,如公安网小图 **CERT**表示证件照片:如拍摄的身份证、工卡、护照、学生证等证件图片 默认LIVE |
| quality_control | 否 | string | 图片质量控制 **NONE**: 不进行控制 **LOW**:较低的质量要求 **NORMAL**: 一般的质量要求 **HIGH**: 较高的质量要求 **默认 NONE** |
| liveness_control | 否 | string | 活体检测控制 **NONE**: 不进行控制 **LOW**:较低的活体要求(高通过率 低攻击拒绝率) **NORMAL**: 一般的活体要求(平衡的攻击拒绝率, 通过率) **HIGH**: 较高的活体要求(高攻击拒绝率 低通过率) **默认NONE** |
**返回参数**
| 参数名 | 必选 | 类型 | 说明 |
| ----------- | ---- | ------ | :------------: |
| score | 是 | float | 人脸相似度得分 |
| face_list | 是 | array | 人脸信息列表 |
| +face_token | 是 | string | 人脸的唯一标志 |
#### 3. demo2 代码
```python
# _*_ coding: utf-8 _*_
import json
from aip import AipFace
import base64
"""
定义常量
你的 APPID AK SK
"""
APP_ID = '14274926'
API_KEY = '6ms7nbS4Kl0o05CVk6IcVyYS'
SECRET_KEY = 'uiAzvTy9p0S9cwcB1cWSyo98TvrVBKKE'
# 初始化AipFace对象
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
print(client)
imageType = "BASE64"
# 读取图片
def img_content(file_name):
with open(file_name, "rb") as f: # 二进制方式打开图文件
base64_data = base64.b64encode(f.read()) # 读取文件内容,转换为base64编码
return base64_data
# 获取图片
img1 =img_content("gao.jpg")
# img1 = img_content('timg.jpeg')
img2 = img_content('timg2.jpg')
# 调用人脸比对接口
result = client.match([
{
'image':img1,
'image_type':imageType
},
{
'image': img2,
'image_type': imageType
},
])
print(type(result))
print (json.dumps(result, sort_keys=True, indent=2)) # 排序并缩进两个字符输出
score = result["result"]["score"]
print ("图片1 与 图片2 的相似度为: %f "%score)
"""
<type 'dict'>
"cached": 0,
"error_code": 0,
"error_msg": "SUCCESS",
"log_id": 1015505994599,
"result": {
"face_list": [
{
"face_token": "9709cdcc4faa697a389f98c31fe27d3e"
},
{
"face_token": "a449750e2ee299ea8da219b1eb640d75"
}
],
"score": 91.50602722
},
"timestamp": 1537832354
}
"""
``` |
|