具体的api手册请去官网学习。目标是实现刷脸签到系统。测试功能的源码可以在github上看到
https://github.com/luyishisi/The_python_code.git 文件夹是python_face++
解释基础概念:
Face++ 人脸识别系统包含五个核心概念:Image, Face, Person, Faceset 和Group。
Image 指用户或应用程序给Face++ API提供的图片,以供后续检测/识别使用。用户可以通过指定url或在程序中上传(通过HTTP POST提交图片的二进制文件)提供Image。
Face 指Image中检测出的人脸。一张Image中可能包含多个Face。
Person 指同一个人的Face集合。Person中的多个Face可能来源于多个Image,但必须是同一个人的多张Face。一个Face可以属于多个不同的Person。Person被用在人脸验证(verify)和人脸识别(identify)中。
Faceset 指一个或多个Face的集合。Faceset和Person一样,都是Face的集合,但Faceset并不要求Face来源于同一个人。一个Face可以属于多个不同的Person和Faceset。Faceset被用在人脸搜索(search)中。
Group 指多个Person的集合。在多数Face++人脸识别场景中,用户需指定一个Group来限定在此集合中进行识别。
ID和Name两套索引系统用来定位和访问上述所有元素, Image,Face,Person,Faceset 和 Group都有系统分配的全局唯一的ID。为便于用户使用有语义信息的名字进行开发,用户也可给Person 和 Group设置一个Name。Name由用户提供,必须在App内全局唯一。
初步检测:调用/detection/detect 对目标图片进行人脸检测,检测出相应人脸位置及属性,获取相应的face_id。
创建Person:调用/person/create创建一个Person,获得相应的person_id, 并调用/person/add_face将Face加入到相应Person中。
构建Group:调用 /group/create 创建新的Group, 使用/group/add_person将候选Person加入到Group中,以供识别新创建的Person。
模型训练:调用/train/identify 训练相应Group的识别模型。
试用说明:
首先从官网注册账号,然后注册一个产品获取api的两个关键信息。
API Key
187aa2ee8fc784972b7302f3b31becab×××
API Secret
F1czaFXaRJ5VzRcdVNZppUwJpDg4zjUY×××
然后下载下sdk文件,在目录下运行python hello.py 。
在文件中修改好api的两个全局变量就能正常运行。
源码学习与测试
hello代码中虽然很详细,但是在一系列实践的过程还是有点小疑惑,唯有步步测试。
导入face++的api类库
from facepp import API
测试零:自定义输出函数
导入库后显示判断当前的数据类型,再采用不同的输出方式,有汉字就用utf-8,字典的输出方式需要认真看看,之后在截取数据需要使用,
Python
import time
from pprint import pformat
def print_result(hint, result):
def encode(obj):
if type(obj) is unicode:
return obj.encode('utf-8')
if type(obj) is dict:
return {encode(k): encode(v) for (k, v) in obj.iteritems()}
if type(obj) is list:
return [encode(i) for i in obj]
return obj
print hint
result = encode(result)
print '\n'.join([' ' + i for i in pformat(result, width = 75).split('\n')])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
importtime
frompprintimportpformat
defprint_result(hint,result):
defencode(obj):
iftype(obj)isunicode:
returnobj.encode('utf-8')
iftype(obj)isdict:
return{encode(k):encode(v)for(k,v)inobj.iteritems()}
iftype(obj)islist:
return[encode(i)foriinobj]
returnobj
printhint
result=encode(result)
print'\n'.join([' '+iforiinpformat(result,width=75).split('\n')])
测试一:人脸分析
首先是自定义图片路径,在hello.py,40行开始,image_dir 定义的是基础路径,这个需要用网络上的图片地址,如果是本地的图片需要转换成二进制上传再调用,定义一个persons字典。里面三个作为基础的人脸库,hello.py功能是得出target_image 是否在里面出现,存在则返回名字。
Python
# 人名及其脸部图片
IMAGE_DIR = ''
PERSONS = [
('luyi', IMAGE_DIR + 'http://urlteam.org/wp-content/uploads/2016/01/2016-01-
]
# 步骤1:检测出三张输入图片中的Face,找出图片中Face的位置及属性
FACES = {name: api.detection.detect(url = url)
for name, url in PERSONS}
for name, face in FACES.iteritems():
print_result(name, face)
1
2
3
4
5
6
7
8
9
10
11
12
13
# 人名及其脸部图片
IMAGE_DIR=''
PERSONS=[
('luyi',IMAGE_DIR+'http://urlteam.org/wp-content/uploads/2016/01/2016-01-
]
# 步骤1:检测出三张输入图片中的Face,找出图片中Face的位置及属性
FACES={name:api.detection.detect(url=url)
forname,urlinPERSONS}
forname,faceinFACES.iteritems():
print_result(name,face)
运行后返回的数值是如下图
其中每一项的含义基本看英文能懂,可以翻阅api文档
http://www.faceplusplus.com.cn/detection_detect/
上面显示
有95.9602%的可能是男性,,年龄检测是26岁,+-26岁/。不算太离谱99.85%是亚洲人
现在考虑一个如何用python,进行数据捕捉字典。
字典读取的方式比较神奇,第一次接触到这么多重嵌套的字典。
本来多重嵌套不过是增加几个【】【】而已。但是这个字典是字典嵌套列表再嵌套字典再嵌套字典,我也是醉了,face里面是列表,列表的内容是字典,。好,不绕口令了,要想读取年龄,则
在自定义输出函数的下方增加一句话
print (result[‘face’][0][‘attribute’][‘age’][‘value’])
重点就在于那个【0】这个代表列表的第一组。别的就和普通的嵌套字典调用一个原理了。
测试二:人脸部位位置分析
/detection/landmark api文档是:http://www.faceplusplus.com.cn/detectionlandmark/
检测给定人脸(Face)相应的面部轮廓,五官等关键点的位置,包括25点和83点两种模式。
值得注意的是需要的参数,需要用赋值的形式给予,如下
Python
for name, face in FACES.iteritems():
rst = api.detection.landmark(api_key=API_KEY,api_secret=API_SECRET,
person_name = name, face_id = p['face'][0]['face_id'])
print_result(format(name), rst)
1
2
3
4
forname,faceinFACES.iteritems():
rst=api.detection.landmark(api_key=API_KEY,api_secret=API_SECRET,
person_name=name,face_id=p['face'][0]['face_id'])
print_result(format(name),rst)