第一步:成为百度云开发者的一员
点击此链接:https://cloud.baidu.com/ 进入百度云首页:
新手指南链接:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjgn3包含以下所有步骤
若已经拥有百度账号,可直接点击登录(默认大家已有百度账号);若没有,可点击注册(这里不再详细述说)
登录后选择管理控制台(登录即默认进入管理控制台);
若无,在首页右上角可点击进入并在左边栏目选择:产品服务->人工智能->人脸识别
进入人脸识别页面后可点击创建应用:
并根据自己需求填写,最后点击立即创建,这里页面未显示,就在页面底下:
接下来回到上个页面:点击管理应用,此时平台已经为你分配了此应用的相关凭证,主要为以下标记的框APP_ID, API_KEY, SECRET_KEY:
第二步:使用Python-SDK实现人脸检测并返回相关属性
直达链接:https://ai.baidu.com/tech/face/detect
或在首页->开放能力->人脸与人体识别->人脸检测,然后点击技术文档
在左边栏目选择SDK文档->REST-API-SDk->Python-SDK,并通过相关方法安装Python-SDK,标绿部分为本地安装模式:
接下来实例化人脸检测,此处的APP_ID, API_KEY, SECRET_KEY,这里的三个值来源于前面管理应用时,官网分配给你的相关凭证:
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)
最后配置人脸检测接口,此处的image可接受格式为BASE64,URL,FACE_TOKEN,此三种即为imageType填写的内容,这里我们选择BASE64格式
face-field可选项如下:age,beauty,expression,face_shape,gender,glasses,landmark,landmark72,landmark150,race,quality,eye_status,emotion,face_type;此处可选项即为人脸属性的输出选项
client.detect返回的是一个字典形式的数据,其中 max_face_num决定了一张图片中检测多少人脸的数量。:
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"
options["liveness_control"] = "LOW"
""" 或者 """
options = {
"max_face_num" = 10
"face_field" = "age,beauty,expression,face_shape,gender,glasses,landmark,landmark150,race,quality,eye_status,emotion,face_type"
}
""" 带参数调用人脸检测 """
result = client.detect(image, imageType, options)
因此我们需要将png、jpg、jpeg、bmp格式的图片转换为BASE64格式,定义img2base64转换函数如下:
def img2base64(img_path):
import base64
with open(img_path, "rb") as fp:
img = fp.read() # 读取图片数据
base64_data = "%s" % base64.b64encode(img) # 将图片数据转换为base64数据
image = base64_data.decode("utf-8")
return image
可自行对上述代码进行更改,封装成自己需要的形式。
返回参数详情如下:
字段 | 必选 | 类型 | 说明 |
---|---|---|---|
face_num | 是 | int | 检测到的图片中的人脸数量 |
face_list | 是 | array | 人脸信息列表,具体包含的参数参考下面的列表。 |
+face_token | 是 | string | 人脸图片的唯一标识 |
+location | 是 | array | 人脸在图片中的位置 |
++left | 是 | double | 人脸区域离左边界的距离 |
++top | 是 | double | 人脸区域离上边界的距离 |
++width | 是 | double | 人脸区域的宽度 |
++height | 是 | double | 人脸区域的高度 |
++rotation | 是 | int64 | 人脸框相对于竖直方向的顺时针旋转角,[-180,180] |
+face_probability | 是 | double | 人脸置信度,范围【0~1】,代表这是一张人脸的概率,0最小、1最大。 |
+angel | 是 | array | 人脸旋转角度参数 |
++yaw | 是 | double | 三维旋转之左右旋转角[-90(左), 90(右)] |
++pitch | 是 | double | 三维旋转之俯仰角度[-90(上), 90(下)] |
++roll | 是 | double | 平面内旋转角[-180(逆时针), 180(顺时针)] |
+age | 否 | double | 年龄 ,当face_field包含age时返回 |
+beauty | 否 | int64 | 美丑打分,范围0-100,越大表示越美。当face_fields包含beauty时返回 |
+expression | 否 | array | 表情,当 face_field包含expression时返回 |
++type | 否 | string | none:不笑;smile:微笑;laugh:大笑 |
++probability | 否 | double | 表情置信度,范围【0~1】,0最小、1最大。 |
+face_shape | 否 | array | 脸型,当face_field包含face_shape时返回 |
++type | 否 | double | square: 正方形 triangle:三角形 oval: 椭圆 heart: 心形 round: 圆形 |
++probability | 否 | double | 置信度,范围【0~1】,代表这是人脸形状判断正确的概率,0最小、1最大。 |
+gender | 否 | array | 性别,face_field包含gender时返回 |
++type | 否 | string | male:男性 female:女性 |
++probability | 否 | double | 性别置信度,范围【0~1】,0代表概率最小、1代表最大。 |
+glasses | 否 | array | 是否带眼镜,face_field包含glasses时返回 |
++type | 否 | string | none:无眼镜,common:普通眼镜,sun:墨镜 |
++probability | 否 | double | 眼镜置信度,范围【0~1】,0代表概率最小、1代表最大。 |
+eye_status | 否 | array | 双眼状态(睁开/闭合) face_field包含eye_status时返回 |
++left_eye | 否 | double | 左眼状态 [0,1]取值,越接近0闭合的可能性越大 |
++right_eye | 否 | double | 右眼状态 [0,1]取值,越接近0闭合的可能性越大 |
+emotion | 否 | array | 情绪 face_field包含emotion时返回 |
++type | 否 | string | angry:愤怒 disgust:厌恶 fear:恐惧 happy:高兴 sad:伤心 surprise:惊讶 neutral:无情绪 |
++probability | 否 | double | 情绪置信度,范围0~1 |
+race | 否 | array | 人种 face_field包含race时返回 |
++type | 否 | string | yellow: 黄种人 white: 白种人 black:黑种人 arabs: 阿拉伯人 |
++probability | 否 | double | 人种置信度,范围【0~1】,0代表概率最小、1代表最大。 |
+face_type | 否 | array | 真实人脸/卡通人脸 face_field包含face_type时返回 |
++type | 否 | string | human: 真实人脸 cartoon: 卡通人脸 |
++probability | 否 | double | 人脸类型判断正确的置信度,范围【0~1】,0代表概率最小、1代表最大。 |
+landmark | 否 | array | 4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_field包含landmark时返回 |
+landmark72 | 否 | array | 72个特征点位置 face_field包含landmark72时返回 |
+landmark150 | 否 | array | 150个特征点位置 face_field包含landmark150时返回 |
+quality | 否 | array | 人脸质量信息。face_field包含quality时返回 |
++occlusion | 否 | array | 人脸各部分遮挡的概率,范围[0~1],0表示完整,1表示不完整 |
+++left_eye | 否 | double | 左眼遮挡比例,[0-1] ,1表示完全遮挡 |
+++right_eye | 否 | double | 右眼遮挡比例,[0-1] , 1表示完全遮挡 |
+++nose | 否 | double | 鼻子遮挡比例,[0-1] , 1表示完全遮挡 |
+++mouth | 否 | double | 嘴巴遮挡比例,[0-1] , 1表示完全遮挡 |
+++left_cheek | 否 | double | 左脸颊遮挡比例,[0-1] , 1表示完全遮挡 |
+++right_cheek | 否 | double | 右脸颊遮挡比例,[0-1] , 1表示完全遮挡 |
+++chin | 否 | double | 下巴遮挡比例,,[0-1] , 1表示完全遮挡 |
++blur | 否 | double | 人脸模糊程度,范围[0~1],0表示清晰,1表示模糊 |
++illumination | 否 | double | 取值范围在[0~255], 表示脸部区域的光照程度 越大表示光照越好 |
++completeness | 否 | int64 | 人脸完整度,0或1, 0为人脸溢出图像边界,1为人脸都在图像边界内 |
返回示例如下:
{
"face_num": 1,
"face_list": [
{
"face_token": "35235asfas21421fakghktyfdgh68bio",
"location": {
"left": 117,
"top": 131,
"width": 172,
"height": 170,
"rotation": 4
},
"face_probability": 1,
"angle" :{
"yaw" : -0.34859421849251
"pitch" 1.9135693311691
"roll" :2.3033397197723
}
"landmark": [
{
"x": 161.74819946289,
"y": 163.30244445801
},
...
],
"landmark72": [
{
"x": 115.86531066895,
"y": 170.0546875
},
...
],
"age": 29.298097610474,
"beauty": 55.128883361816,
"expression": {
"type": "smile",
"probability" : 0.5543018579483
},
"gender": {
"type": "male",
"probability": 0.99979132413864
},
"glasses": {
"type": "sun",
"probability": 0.99999964237213
},
"race": {
"type": "yellow",
"probability": 0.99999976158142
},
"face_shape": {
"type": "triangle",
"probability": 0.5543018579483
}
"quality": {
"occlusion": {
"left_eye": 0,
"right_eye": 0,
"nose": 0,
"mouth": 0,
"left_cheek": 0.0064102564938366,
"right_cheek": 0.0057411273010075,
"chin": 0
},
"blur": 1.1886881756684e-10,
"illumination": 141,
"completeness": 1
}
}
]
}
第三步:本地测试
调用百度云人脸检测链接,并运用flask部署,完整代码如下:
from baiduyun_face_detection.aip import AipFace
import base64
from flask import Flask, jsonify, request
app = Flask(__name__)
class baiduyun_sdk():
def __init__(self,):
self.app_id = "你的APP_ID"
self.api_key = "你的API_KEY"
self.secret_key = "你的SECRET_KEY"
self.imageType = "BASE64"
self.options = {
"max_face_num": 10,
"face_fields":"age,beauty,expression,face_shape,gender,glasses,landmark,landmark150,race,quality,eye_status,emotion,face_type"
}
# 获取到通往百度云人脸检测的链接
def get_baiduyun_face_detect_url(self):
client = AipFace(self.app_id, self.api_key, self.secret_key)
return client
# 获取图片的base64格式,因为百度云暂时只接受三种输入格式:BASE64、FACE_TOKEN、URL(个人理解为网络图片链接)
def img2base64(self,image_bytes):
# with open(image_bytes, "rb") as fb:
img = image_bytes.read()
base64data = "%s" % base64.b64encode(img)
image = base64data.decode("utf-8")
return image
# 获取图片属性并返回一个json文件
def get_attributes(self,image_bytes):
image = self.img2base64(image_bytes = image_bytes)
image_type = self.imageType
options = self.options
client = self.get_baiduyun_face_detect_url()
attribute = client.detect(image, image_type, options)
return attribute
@app.route("/attribute", methods= ["POST"])
def attribute():
response = {}
image_bytes = request.files["file"]
if image_bytes != None:
response['rtCode'] = '20000'
else:
response['rtCode'] = '20002'
result = baiduyun_sdk().get_attributes(image_bytes = image_bytes)
response["result"] = result["result"]
return jsonify(response)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
``本地测试调用代码如下:
import requests
resp = requests.post("http://192.168.1.***:5000/attribute",#这里需要修改自己的地址
files="file":open("D:/***/images/duorentu.jpg","rb")})# 这需要修改自己的图片路径
print(resp.json())