前言
最近做的一个人脸识别的小项目,使用到的是百度的人脸识别SDK。百度的人脸识别支持人脸检测、人脸对比以及人脸查找;人脸检测功能可以检测人脸并定位,返回五官特征点及人脸的各属性值,人脸对比功能则会对两张图片进行对比并返回相似值,人脸的查找是在自建的人脸库中找到相似的脸,这其中也包括了人脸识别,人脸认证以及人脸库的相关操作。
本次项目使用的语言为python,使用的开发环境为PyCharm,系统为Windows10。
笔者暂时把自己的博客当作是是踩坑的记录。文章中如有错误及不当,敬请指正。
前期准备pthon 3.7 安装
下载安装包
登录python官网下载对应的安装包,小六的电脑为Windows 10,所以下载的安装文件为Windows 系统,64位版本;
安装
建议勾选Add Python to PATH,然后点击Install Now,其他默认即可;
pip安装
pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。(百度百科这么说的)
检查电脑中是否已经安装pip。
打开cmd命令行,输入pip –version,如果电脑中已经安装好了pip,那么会得到这样的返回。
如果没有安装,那么会显示:
这种情况的话去pip下载地址下载第二个压缩包文件,
之后将压缩包解压,在命令行中进入压缩包解压后的文件夹,输入python setup.py install进行安装。
正常的话会显示:
再输入pip –version进行测试,当显示pip的版本信息即可。
卸载pip(如果有需要的话,没错,就是我,大半夜强行卸载重装的我。)
命令行执行python -m pip uninstall pip,然后输入y确认卸载。
百度人脸识别sdk安装
命令行输入pip install baidu-aip进行安装,当显示Successfully installed baidu-aip…即表示sdk安装成功。
百度ai平台账号注册及应用申请
百度ai平台的官网地址为http://ai.baidu.com/百度的账号的申请就不用说了,申请好了账号电机右上角控制台,然后点击左边的人脸识别,点击创建应用。
填写应用名称,选择应用类型,填写应用描述,最后点击创建应用即可。
之后就会得到下面的应用,其中AppID,APIKey和Secret Key在后面的功能调用中会用到。
功能调用
Client客户端
AipFace是人脸识别的Python SDK客户端,为使用人脸识别的开发人员提供了一系列的交互方法。
打开PyCharm,新建工程,在src目录下建立一个AipFac目录,作为本次人脸识别小项目各个子功能程序的存放地址。
新建Client.py,使用示例代码:
1
2
3
4
5
6
7
8from aip import AipFace
“”” 你的 APPID AK SK “””
APP_ID = ‘16528434’
API_KEY = ‘Rat9t59Hdkp8lM1BhvahOGCX’
SECRET_KEY = ‘你的secret——key’
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
该程序只是一个人脸识别的python SDK客户端,作为后续功能实现的平台。程序运行结果如下:
人脸检测
人脸检测接口检测图片中的人脸并标记出位置信息;
新建face_Detect.py,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13import base64
from src.Aipface import client
base64_data=base64.b64encode(open(“..\photo\1.jpg”, “rb”).read())
image = base64_data.decode()
imageType = “BASE64”
options = {}
options[“face_field”] = “age,beauty,experssion,gender,glasses,race,quality,eye_status,emotion”
options[“max_face_num”] = 2
options[“face_type”] = “LIVE”
options[“liveness_control”] = “LOW”
client.detect(image, imageType,options)
本程序中使用的图片在上级目录中的photo文件夹中,图片名称为1.jpg,程序执行后并不会直接显示有效信息,因为client.detect(image, imageType,options)只是一个返回信息的函数,想要显示信息,可以将程序的最后改为:
1
2s=client.detect(image, imageType,options)
print(s)
此时程序运行在控制台输出数据:
数据的格式及处理会在后面详细说明。
人脸搜索
接口能力
1:N人脸搜索:也称为1:N识别,在指定人脸集合中,找到最相似的人脸;
N人脸认证:基于uid维度的1:N识别,由于uid已经锁定固定数量的人脸,所以检索范围更聚焦;
这里演示使用1:N搜索,新建face_Search.py,实例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12from src.Aipface import client
with open(“..\photo\1.jpg”, “rb”) as f:
base64_data = base64.b64encode(f.read())
s = base64_data.decode()
image = s
imageType = “BASE64”
groupIdList = “Groop1”
“”” 调用人脸搜索 “””
s=client.search(image, imageType, groupIdList)
print(s)
代码中使用的照片为上一级目录里photo文件夹中的1.jpg,在Groop1这个人脸库用户组中进行查找,数据的返回数据暂时打印到控制台。
人脸对比
接口能力
两张人脸图片相似度对比:比对两张图片中人脸的相似度,并返回相似度分值;
多种图片类型:支持生活照、证件照、身份证芯片照、带网纹照四种类型的人脸对比;
活体检测:基于图片中的破绽分析,判断其中的人脸是否为二次翻拍(举例:如用户A用手机拍摄了一张包含人脸的图片一,用户B翻拍了图片一得到了图片二,并用图片二伪造成用户A去进行识别操作,这种情况普遍发生在金融开户、实名认证等环节。);
质量检测:返回模糊、光照等质量检测信息,用于辅助判断图片是否符合识别要求;
这里演示两张人脸图片的相似度对比,新建face_Match.py,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22from src.Aipface import client
import base64
APP_ID = ‘16528434’
API_KEY = ‘Rat9t59Hdkp8lM1BhvahOGCX’
SECRET_KEY = ‘iQ7fryNaPv7eWKluXrlQ6zKBtpj8h0vi’
base64_data=base64.b64encode(open(“..\photo\1.jpg”, “rb”).read())
image1 = base64_data.decode()
base64_data=base64.b64encode(open(“..\photo\2.jpg”, “rb”).read())
image2 = base64_data.decode()
result = client.match([
{
‘image’: image1,
‘image_type’: ‘BASE64’,
},
{
‘image’: image2,
‘image_type’: ‘BASE64’,
}
])
print(result)
代码中使用的照片为上一级目录里photo文件夹中的1.jpg和2.jpg,两张图片里的人脸进行相似度打分,数据的返回数据暂时打印到控制台。
人脸库操作
接口能力
人脸的注册,更新,删除;
用户列表,用户信息,人脸列表等信息的查询;
创建,删除,复制人脸及用户组;
这里演示人脸的注册,新建face_Add.py,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18import base64
from src.Aipface import client
with open(“..\photo\2.jpg”, “rb”) as f:
base64_data = base64.b64encode(f.read())
s = base64_data.decode()
image = s
imageType = “BASE64”
groupId = “group1”
userId = “qiuTao”
“”” 如果有可选参数 “””
options = {}
options[“user_info”] = “MySelf”
options[“quality_control”] = “NORMAL”
options[“liveness_control”] = “LOW”
options[“action_type”] = “REPLACE”
print(client.addUser(image, imageType, groupId, userId, options))
代码中使用的照片为上一级目录里photo文件夹中的2.jpg,将人脸注册到group1用户组内,并命名该用户的id为qiuTao,注册的结果暂时打印到控制台。
返回信息的处理
人脸识别相关功能的程序执行返回的数据是json格式。
以人脸的搜索为例,上述人脸搜索的返回值为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18{
‘error_code’: 0,
‘error_msg’: ‘SUCCESS’,
‘log_id’: 1345050726507356651,
‘timestamp’: 1562650735,
‘cached’: 0,
‘result’: {
‘face_token’: ‘a12c44c7c8463f2611ce82dbd7795811’,
‘user_list’: [
{
‘group_id’: ‘Groop1’,
‘user_id’: ‘qiuTao’,
‘user_info’: ”,
‘score’: 99.62272644043
}
]
}
}
从上面我们可以看出,error_code为错误代码,当它不为0的时候,error_msg为显示一些对应错误的提示,就表示程序或多或少出现了某些问题导致请求错误,这时候需要去对应错误代码的官方解释来进行一定的调试;
error_msg为错误信息,当error_code为0时,error_msg的值为SUCCESS;
result又是一个字典,里面包含了比较重要的信息。
face_token是人脸标志;
user_list在人脸库中搜索到的人脸列表;
group_id为搜索到的人脸所在的用户组;
user_id为搜索到的人脸对应的用户id;
user_info为搜索到的用户的相关信息(在人脸注册或更新时候添加的信息);
score为搜索到的人脸库中的图片和程序中的图片的相似度得分。
要想从这样的数据中获取对自己信息,可以先使用type()来得到返回值的类型:
,然后针对python中字典的描述,最笨最直接的一种方法可以使用索引的方法来得到信息。
比如这里我们想得到人脸搜索的user_id,可以使用下面的方法:
1print(s[‘result’][‘user_list’][0][“user_id”])
我知道,可能没有比这更笨的方法了,等我看完python的基础视频会再回来修正的。
程序执行的结果为:
这里得到了user_id具体的值,可以在后续的程序中调用。
图片上传格式
百度ai人脸识别支持的图片上传的格式有三种,分别是BASE64, URL和FACE_TOKEN:
BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;
URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);
FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个;
URL格式上传的是一整张图片,显而易见的一个缺点就是上传的数据量会比较大,而FACE_TOKEN的方式针对的是已经被百度人脸识别的后台处理过后的人脸标识,本项目中不合适。
本次小项目使用的图片上传格式为BASE64。
BASE64就是一种编码方式,使用64个可打印字符来表示二进制数据。
要将图片转换成BASE64格式,首先要加载python内置的base64:
1import base64
然后对图片进行处理:
1
2with open(“/home/chaowei/1.png”,”rb”) as f:
base64_data = base64.b64encode(f.read())
其中,b64encode是编码,b64decode是解码 ;
所以本项目中图片转换的示例代码为:
1
2
3base64_data=base64.b64encode(open(“..\photo\1.jpg”, “rb”).read())
image = base64_data.decode()
imageType = “BASE64”
imageType为图片的格式,这里格式为BASE64。
Endding
我知道我现在还很菜的,我不知道以后自己会不会是个很厉害的程序猿,我只希望自己能够慢慢的努力,挣扎,不放弃。
记很喜欢的一句话:
螃蟹在剥我的壳
笔记本在写我
漫天的我落在了枫叶上雪花上,
而你,在想我