一、前言

最近在做课程设计,之前都是用OpenCV 做人脸识别,今天了解到百度AI 开放平台也提供人脸识别这一功能,于是来试了试。

本文介绍一系列较为常用的方法和用法,若需要更加具体的食用方法,请参见百度AI 开放平台人脸识别Python SDK文档

二、开始

1)准备工作

  1. 首先注册百度AI 开放平台的开发者;
  2. 然后创建应用(记得在所使用功能处勾选人脸识别等功能);
  3. 获得AppIDAPI KeySecret Key
  4. 找到Python SDK 文档说明(我个人比较倾向于使用python sdk 开发 😃 )

2)安装Python SDK

二选一:

  1. 若已安装pip:
pip install baidu-aip
  1. 若已安装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)人脸注册

首先有几点需要注意一下:

  1. 每个开发者账号可以创建100个appid;
  2. 每个appid对应一个人脸库,且不同appid之间,人脸库互不相通;
  3. 每个人脸库下,可以创建多个用户组,用户组(group)数量没有限制
  4. 每个用户组(group)下,可添加最多无限张人脸,无限个uid;
  5. 每个用户(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"] = 0
options["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);

在这里插入图片描述

更多推荐