Facenet-based face recognition, web API was created by Python Flask
- facenet是谷歌的一篇很有名的论文和开源项目,其实现了将输入的人像最终转换为shape为1*128的向量,然后通过计算不同照片之间的欧几里得距离来判断他们的相似度,当然其中还包含许多技巧以及创新的想法,最终的在lfw人脸信息数据库上的准确率达到99%+++
- Flask是一个使用Python编写的轻量级Web应用框架,基于Werkzeug WSGI工具箱和Jinja2 模板引擎。可以使用python flask框架搭建后端服务程序,提供Restful API
配置文件命名为_config.yml,放在web_face_api目录下,内容如下:
# _config.yml
database:
host: 'database_url'
port: 3306
user: 'name'
passwd: 'password'
db_name: 'FaceDB'
restful:
# set host='0.0.0.0' if want to accessed by others
host: 'localhost'
# flask default port, note the firewall
port: 5000
# flask mode
debug: true
# upload file dir
upload_dir: 'upload'
# face dir
crop_face_dir: 'crop_faces'
# tensorflow model dir
model_dir: "../20180402-114759/"
# html templates
templates:
upload_html: 'up.html'
index_html: 'index.html'
- 安装 python 库
hwy@server: ~/FaceRecognition $ sudo pip install -r requirements.txt
- 部署服务
# 开启防火墙
hwy@server: ~$ sudo apt-get install ufw -y
hwy@server: ~$ sudo ufw allow 22
hwy@server: ~$ sudo ufw allow 5000
hwy@server: ~$ sudo ufw enable
# 开启服务
hwy@server: ~/FaceRecognition/web_face_api $ sudo python web_face_restful.py
传入图片进行人脸检测,可以检测图片内的所有人脸(目前设置最小值为30×30 pix),对于每个检测出的人脸,会给出其唯一标识 face_token,可用于后续的人脸分析、人脸比对等操作。每个 face_token 以及对应的人脸信息通过 model 计算出来的1*128的向量,作为一个数据元保存在临时存储区(服务重启后该face_token失效),需要保存的face_token可以通过addface API存入数据库中。
图片格式:JPG(JPEG),PNG 图片像素尺寸:最小 4848 像素,最大 40964096 像素 图片文件大小:2 MB
POST
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | image_file | File | 图片,二进制文件,需要用post form-data的方式上传 |
| 字段 | 类型 | 说明 |
|---|---|---|
| sucess | Bool | 标志位,表示请求是否成功 |
| face_num | Int | 图片中人脸的数量 |
| faces | Array | 被检测出的人脸数组,具体包含内容见下文。注:如果没有检测出人脸则为空数组 |
| 字段 | 类型 | 说明 |
|---|---|---|
| face_token | String | 人脸信息在整个系统中的唯一标识,24位随机生成字符串 |
| face_name | String | 生成人脸图片的名称,保存在CROP_FACES文件夹中 |
| top_left | Object | 人脸位置矩形边框的左上角坐标,数据类型为元组,如:(1.0, 1.0) |
| bottom_right | Object | 人脸位置矩形边框的右下角坐标 |
查找相似人脸,根据face_token或者上传的图片文件,以及threshold从数据库的face_set中找到最近距离的人脸信息
图片格式:JPG(JPEG),PNG 图片像素尺寸:最小 4848 像素,最大 40964096 像素 图片文件大小:2 MB
POST GET
| 是否必选 | 参数名 | 类型 | 参数说明 |
| 必选(二选一) | face_token | String | 进行搜索的目标人脸的 face_token ,使用 get 的方法调用 |
| image_file | File | 目标人脸所在的图片,二进制文件,需要用 post form-data 的方式上传。 | |
| 必选 | threshold | String | 用于比较的距离阈值, 表示两个人脸信息向量在欧式空间的归一化距离, 越接近0表示相似程度越高(参考值0.65) |
| 字段 | 类型 | 说明 |
|---|---|---|
| sucess | Bool | 标志位,表示操作是否成功 |
| face_token | String | 进行搜索的目标人脸的 face_token |
| threshold | String | 用于比较的距离阈值, 表示两个人脸信息向量在欧式空间的归一化距离 |
| cmp_result | Array | 人脸搜索的结果,返回 face_set 人脸距离在 threshold 以下的所有人脸信息的集合,具体内容见下文。注:如果没有相似人脸信息则为空数组 |
| 字段 | 类型 | 说明 |
|---|---|---|
| face_token | String | 搜索到的人脸 face_token |
| distant | Float32 | 目标人脸与 face_set 搜索人脸的距离 |
| face_name | String | 搜索人脸的名称(需要在上传人脸信息时提供) |
向 FaceSet 中添加人脸标识 face_token。
GET
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | face_token | String | 需要保存到 face_set 中的 face_token |
| 可选 | face_name | String | face_token 对应的人脸名称标识,若参数为空,默认为unknown |
| 字段 | 类型 | 说明 |
|---|---|---|
| sucess | Bool | 标志位,表示操作是否成功 |
| face_token | String | 保存到face_set中的face_token |
| face_neme | String | 保存到face_set中的face_name |
从 FaceSet 中删除人脸标识 face_token。
http://localhost:5000/removeface
GET
| 是否必选 | 参数名 | 类型 | 参数说明 |
|---|---|---|---|
| 必选 | face_token | String | 需要从 face_set 中移除的 face_token |
| 字段 | 类型 | 说明 |
|---|---|---|
| sucess | Bool | 标志位,表示操作是否成功 |
| face_token | String | 从 face_set 中移除的 face_token |
| 错误码 | 错误信息 | 说明 |
|---|---|---|
| 1001 | BAD_ARGUMENTS | 某个参数解析出错(比如必须是数字,但是输入的是非数字字符串; 或者长度过长,etc.) |
| 1002 | MISSING_ARGUMENTS | 缺少某个必选参数。 |
| 1003 | INTERNAL_ERROR | 服务器内部错误 |
| 1004 | FIlE_ERROR | 文件错误,上传文件类型不支持 |
| 1005 | UPLOAD_ERROR | 上传错误,参数和数据获取失败 |
| 1006 | FACE_TOKEN_ERROR | 查找不到face_token信息,不能识别face_token |
| 1007 | FACE_INFO_ERROR | 未检测到人脸信息 |