综合实验:利用Face++ API进行人脸识别
实验介绍
试想,以后的视频监控不再仅仅是远程监控视频,更有可能进行智能识别,比如移动物体的检测、人脸信息的采集、某样物体特征的提取和识别,等等。除了能用开源而悠久的OpenCV实现特征提取,比如实现人脸识别,但实现的效果尚未满足实际的要求。本实验采用了Face++ 提供的API从人脸提取了很多信息,比如人的年龄、性别、种族、是否微笑,并且可以对比人脸是否相似,从一群人的人脸中找到最相似的那个人。
1.Face++人脸识别系统
Face++是新一代云端视觉服务平台,提供一整套世界领先的人脸检测,人脸识别,面部分析的视觉技术服务。
Face++ 人脸识别系统包含五个核心概念:Image, Face, Person, Faceset 和Group。这是在运用Face++ API时需要重点区分的。
- 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内全局唯一。
2.基本工作流程
图2.6.1 实验原理图
软硬件清单
硬件清单
- pcDuino8 Uno
软件清单
系统使用Ubuntu14.04,基本的软件包括:
- python2.7
- Face++ python SDK
- git
注意:Face++是云端的服务,必须要接入网络
实验步骤
1.注册Face++账户,获得API_Key和API_Secret
- 点击进入Face++开发者首页,点击右上方的我的应用图标1,您可能需要注册或登录。
- 点击屏幕右方的创建应用图标2,创建一个新的应用。
图2.6.2 注册Face++账户
- 点击提交按键,自动进入应用信息界面,您将看到API_Key和API_Secret。
图2.6.3 获得API_Key和API_Secret
- 把API_Key和API_Secret复制到您的API相关文件中,如apikey.cfg(在很多官方下载SDK中都含有此文件),或您自己写的程序里。
注意,如果您注册时选择了阿里云(中国)服务器,请使用如下配置:
SERVER = 'http://api.cn.faceplusplus.com/'
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_API_SECRET'
如果您注册时选择了亚马逊(美国)服务器,请使用如下配置:
SERVER = 'http://api.us.faceplusplus.com/'
API_KEY = 'YOUR_API_KEY'
API_SECRET = 'YOUR_API_SECRET'
保存apikey.cfg,应用配置成功。
2.如何封装Face++ API
基本封装命令的介绍:
python create_group.py <group_name> #创建一个组
python detection.py <image_path> #提取一张人脸照片的信息
python add_new_face.py <person_name> <image_path> <group_name> #将某个人的脸加入到组中,并训练模型
python recognition.py <group_name> <face_image_path> #从组中找寻最像的一张人脸。
python dump_info.py #列出创建的人名和组名
其他的命令:
python del_group.py <group_name> #删除一个组
python del_person.py <person_name> #删除一个人
如果你想调用Face++ 的API,不得不自己手动封装这些API接口。当然,本人也封装了一些基本的python脚本,已经放到了github上。可以下载下来,供参考:
$ git clone https://github.com/YaoQ/faceplusplus-demo
3.测试人脸检测
根据在github上提供的示例,我试着使用Face++ API:/detection/detect去检测 Tom Cruise的脸。
图2.6.4 Tom Cruise的脸
$ git clone https://github.com/YaoQ/faceplusplus-demo
cd faceplusplus-demo
$ python detection.py images/tom.jpg
检测得到了这张脸的基本信息,内容如下:
Detection result for {}:
{'face': [{'attribute': {'age': {'range': 10, 'value': 37},
'gender': {'confidence': 99.9999,
'value': 'Male'},
'race': {'confidence': 98.9731,
'value': 'White'},
'smiling': {'value': 67.826}},
'face_id': '5ca95ae41e7319170bb8bf022ad677f3',
'position': {'center': {'x': 48.305085, 'y': 54.666667},
'eye_left': {'x': 39.201864, 'y': 45.51},
'eye_right': {'x': 58.873051, 'y': 47.075833},
'height': 44.333333,
'mouth_left': {'x': 38.516441, 'y': 65.636333},
'mouth_right': {'x': 56.491356,
'y': 66.942833},
'nose': {'x': 46.791017, 'y': 58.3435},
'width': 45.084746},
'tag': ''}],
'img_height': 630,
'img_id': '6bef5d3f0f1bdb0f3840bdd34a54ad30',
'img_width': 620,
'session_id': '78919817e956400d88398e3535f85cb6',
'url': None}
4.识别一张人脸
这一步,我提取了3张人脸的信息,并针对每张脸创建了一个人,再将这3个人加入到一个叫做test的组中。然后再找一张新的人脸,去跟组中所有的脸进行匹配,并找出最匹配的那一个人。测试图片有:奥巴马、汤姆·克鲁斯和姚明:
图2.6.5 Groupe 组
用于测试的人脸(注意:这是一张手绘画):
图2.6.6 Test照片
基本的操作过程如下:
$ python create_group.py test
$ python add_new_face.py tom images/tom.jpg test
$ python add_new_face.py obama images/obama.jpg test
$ python add_new_face.py yao images/yao.jpg test
$ python recognition.py test images/test.jpg
识别的结果:
The person with highest confidence: obama Confidence is : 12.066551
图片一对比,就知道检测的结果不尽如人意,当然仅仅是几张图片的对比,并不能说明什么问题。一个人,最多可以添加10000张照片,如果这样大规模的加入一个人人脸的特征,识别的准确性应该会有很大提升。