一、前言
最近在做课程设计,之前都是用OpenCV做人脸识别,今天了解到百度AI 开放平台也提供人脸识别这一功能,于是来试了试。
本文介绍一系列较为常用的方法和用法,若需要更加具体的食用方法,请参见百度AI 开放平台人脸识别Python SDK文档
二、开始
1)准备工作
首先注册百度AI 开放平台的开发者;然后创建应用(记得在所使用功能处勾选人脸识别等功能);获得AppID、API Key、Secret Key;找到Python SDK 文档说明(我个人比较倾向于使用python sdk 开发 😃 )2)安装Python SDK
二选一:
若已安装pip:
pip install baidu-aip
若已安装setuptools:
python setup.py install
3)新建AipFace
AipFace是人脸识别的Python SDK 客户端,为使用人脸识别的开发人员提供了一系列的交互方法。
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 开放平台实现智能语音识别》已经说过了,这里不再赘述
4)创建用户组
用于创建一个空的用户组,如果用户组已存在 则返回错误。
groupId = "group1"""" 调用创建用户组 """client.groupAdd(groupId);
5)人脸注册
首先有几点需要注意一下:
每个开发者账号可以创建100个appid;每个appid对应一个人脸库,且不同appid之间,人脸库互不相通;每个人脸库下,可以创建多个用户组,用户组(group)数量没有限制;每个用户组(group)下,可添加最多无限张人脸,无限个uid;每个用户(uid)所能注册的最大人脸数量没有限制;
百度并没有提供直接的创建用户接口,所以只要我们注册了某个用户的人脸,就算是创建了一个用户。
image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串"imageType = "BASE64"groupId = "group1"userId = "user1"""" 调用人脸注册 """client.addUser(image, imageType, groupId, userId);
imageType我倾向于使用"BASE64"
,所以在image参数中,我们就需要传入待识别图片的BASE64编码字符串
(对于如何将图片进行BASE64 编码,请参见Python >>> 图片转BASE64编码)
6)人脸检测
检测图片中的人脸并标记出位置信息。
image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串"imageType = "BASE64"""" 调用人脸检测 """client.detect(image, imageType);
imageType我倾向于使用"BASE64"
,所以在image参数中,我们就需要传入待识别图片的BASE64编码字符串
(对于如何将图片进行BASE64 编码,请参见Python >>> 图片转BASE64编码)
返回结果:
7)人脸搜索(识别)
1:N人脸搜索:也称为1:N识别,在指定人脸集合中,找到最相似的人脸;1:N人脸认证:基于uid维度的1:N识别,由于uid已经锁定固定数量的人脸,所以检索范围更聚焦;1:N人脸识别与1:N人脸认证的差别在于:人脸搜索是在指定人脸集合中进行直接地人脸检索操作,而人脸认证是基于uid,先调取这个uid对应的人脸,再在这个uid对应的人脸集合中进行检索(因为每个uid通常对应的只有一张人脸,所以通常也就变为了1:1对比);实际应用中,人脸认证需要用户或系统先输入id,这增加了验证安全度,但也增加了复杂度,具体使用哪个接口需要视您的业务场景判断。
image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串"imageType = "BASE64"groupIdList = "group1"""" 调用人脸搜索 """client.search(image, imageType, groupIdList);
返回结果:
8)人脸更新
用于对人脸库中指定用户,更新其下的人脸图像。
针对一个uid执行更新操作,新上传的人脸图像将覆盖此uid原有所有图像。
image = "取决于image_type参数,传入BASE64字符串或URL字符串或FACE_TOKEN字符串"imageType = "BASE64"groupId = "group1"userId = "user1"""" 调用人脸更新 """client.updateUser(image, imageType, groupId, userId);
9)人脸删除
用于从某一人脸库中删除一个用户的某一人脸。
userId = "user1"groupId = "group1"faceToken = "64247346116276esdfgasdffe5491e30axxxxx"""" 调用人脸删除 """client.faceDelete(userId, groupId, faceToken);
10)用户删除
用于将用户从某个组中删除。
groupId = "group1"userId = "user1"""" 调用删除用户 """client.deleteUser(groupId, userId);
11)删除用户组
删除用户组下所有的用户及人脸,如果组不存在则返回错误。
groupId = "group1"""" 调用删除用户组 """client.groupDelete(groupId);
12)组列表查询
用于查询用户组的列表。
""" 调用组列表查询 """client.getGroupList();""" 如果有可选参数 """options = {}options["start"] = 0options["length"] = 50""" 带参数调用组列表查询 """client.getGroupList(, options)
返回结果:
13)获取用户列表
用于查询指定用户组中的用户列表。
groupId = "group1"""" 调用获取用户列表 """client.getGroupUsers(groupId);
返回结果:
14)获取用户人脸列表
用于获取一个用户的全部人脸列表。
userId = "user1"groupId = "group1"""" 调用获取用户人脸列表 """client.faceGetlist(userId, groupId);
返回结果:
15)用户信息查询
获取人脸库中某个用户的信息(user_info信息和用户所属的组)。
userId = "user1"groupId = "group1"""" 调用用户信息查询 """client.getUser(userId, groupId);