人工智能-树莓派小车(6)——人脸识别
Hello 大家好,2018春节这么快就过去了,祝大家新年快乐啦, 新年新气象,新的一年就要搞一点不一样的东西!!!每个人都有一些属于自己的秘密,所以想着可以借助目前比较火的人脸识别来做一个安全系统。当然,基于此人脸识别系统还可以实现人脸签到、人脸闸机等等多种功能,就看你的想象力了,比如给你的电脑上锁,每隔一段时间拍一张照,如果不是你本人就自动锁定系统等等……
基本的原理就是首先创建一个人脸库,将各个用户上传到不同的用户组,来设定所拥有的不同权限,创建人脸库的时候首先要为每个用户上传人脸照片,在上传过程中还要检测上传照片的质量,看是否合格。
人脸识别服务
现在是一个基于互联网的时代,因此我的想法是一切能够在云端做的事情,绝不在本地运行,仅仅将树莓派作为一个终端,来连接各种服务,然后将这些服务呈现给你,这样一是能够保证本地的运行速率,毕竟树莓派性能有限,识别一个照片需要两三秒的时间就有些不优雅了,二是容错率较好,一旦发生错误能更加方便的对其进行修正和重新部署。
因此本人采用了百度的人脸识别服务,目前百度的人脸识别主要提供三种功能:
接口名称 | 接口能力简要描述 |
---|---|
人脸检测 | 检测人脸并定位,返回五官关键点,及人脸各属性值 |
人脸比对 | 返回两两比对的人脸相似值 |
人脸查找 | 在一个人脸集合中找到找到相似的人脸 |
人脸注册 | 包括人脸识别、人脸认证、人脸库管理相关接口 |
人脸识别 Python SDK目录结构
【人工智能-树莓派小车(6)——人脸识别】├── README.md
├── aip//SDK目录
│ ├── _init_.py//导出类
│ ├── base.py//aip基类
│ ├── http.py//http请求
│ └── face.py//人脸识别
└── setup.py//setuptools安装
支持Python版本:2.7.+ ,3.+
安装使用Python SDK有如下方式:
已安装pip :执行pip install baidu-aip即可。
已安装setuptools :执行python setup.py install即可。
新建AipFace
AipFace是人脸识别的Python SDK客户端,为使用人脸识别的开发人员提供了一系列的交互方法。
参考如下代码新建一个AipFace:
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服务控制台中的应用列表中查看。
接口说明 人脸检测
- 检测请求图片中的人脸,返回人脸位置、72个关键点坐标、及人脸相关属性信息。
- 检测响应速度,与图片中人脸数量相关,人脸数量较多时响应时间会有些许延长。
- 典型应用场景:如人脸属性分析,基于人脸关键点的加工分析,人脸营销活动等。
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()image = get_file_content('example.jpg')""" 可选参数 """
##################################################################################
##################################################################################
##################################################################################
##################################################################################
#其中有以下可选参数
#max_face_num :最多处理人脸数目
#face_fields :可定制一些返回的信息,包括(age,beauty,expression,faceshape,gender,glasses,landmark,race,qualities)
##################################################################################
##################################################################################
##################################################################################
##################################################################################
options = {}
options["max_face_num"] = 2
options["face_fields"] = "age"""" 带参数调用人脸检测 """
client.detect(image, options)
人脸检测 返回示例
{
"result_num": 1,
"result": [
{
"location": {
"left": 117,
"top": 131,
"width": 172,
"height": 170
},
"face_probability": 1,
"rotation_angle": 2,
"yaw": -0.34859421849251,
"pitch": 2.3033397197723,
"roll": 1.9135693311691,
"landmark": [
{
"x": 161.74819946289,
"y": 163.30244445801
},
...
],
"landmark72": [
{
"x": 115.86531066895,
"y": 170.0546875
},
...
],
"age": 29.298097610474,
"beauty": 55.128883361816,
"expression": 1,
"expression_probablity": 0.5543018579483,
"gender": "male",
"gender_probability": 0.99979132413864,
"glasses": 0,
"glasses_probability": 0.99999964237213,
"race": "yellow",
"race_probability": 0.99999976158142,
"qualities": {
"occlusion": {
"left_eye": 0,
"right_eye": 0,
"nose": 0,
"mouth": 0,
"left_cheek": 0.0064102564938366,
"right_cheek": 0.0057411273010075,
"chin": 0
},
"blur": 1.1886881756684e-10,
"illumination": 141,
"completeness": 1,
"type": {
"human": 0.99935841560364,
"cartoon": 0.00064159056637436
}
}
}
],
"log_id": 2493878179101621
}
质量判断
可通过人脸检测接口,基于以下字段和对应阈值,进行质量检测的判断,以保证人脸质量符合后续业务操作要求。
文章图片
质量判断依据 人脸注册
用于从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片。
人脸库、用户组、用户、用户下的人脸层级关系如下所示:
|- 人脸库
|- 用户组一
|- 用户01
|- 人脸
|- 用户02
|- 人脸
|- 人脸
....
....
|- 用户组二
|- 用户组三
....
关于人脸库的设置限制
- 每个开发者账号可以创建100个人脸库,人脸库互不相通;
- 每个人脸库下,可以创建多个用户组,用户组(group)数量没有限制;
- 每个用户组(group)下,可添加最多无限张人脸,无限个uid;
- 每个用户(uid)所能注册的最大人脸数量没有限制;
核心代码
uid = "user1"userInfo = "user's info"groupId = "group1,group2"""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()image = get_file_content('example.jpg')""" 可选参数 """
##################################################################################
##################################################################################
##################################################################################
##################################################################################
#其中有以下可选参数
#action_type :参数包含append、replace
#如果为“replace”,则每次注册时进行替换replace(新增或更新)操作,默认为append操作
##################################################################################
##################################################################################
##################################################################################
##################################################################################
options = {}
options["action_type"] = "replace"""" 带参数调用人脸注册 """
client.addUser(uid, userInfo, groupId, image, options)
人脸识别
用于计算指定组内用户,与上传图像中人脸的相似度。识别前提为您已经创建了一个人脸库。
- 说明:人脸识别返回值不直接判断是否是同一人,只返回用户信息及相似度分值。
- 说明:推荐可判断为同一人的相似度分值为80,也可以根据自己需求选择更合适的阈值。
groupId = "group1,group2"""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()image = get_file_content('example.jpg')##################################################################################
##################################################################################
##################################################################################
##################################################################################
#其中有以下可选参数
#ext_fields :特殊返回信息,目前支持faceliveness(活体检测)
#user_top_num :返回用户top数,默认为1,最多返回5个
##################################################################################
##################################################################################
##################################################################################
##################################################################################
options = {}
options["ext_fields"] = "faceliveness"
options["user_top_num"] = 3""" 带参数调用人脸识别 """
client.identifyUser(groupId, image, options)
最终代码
# -*- coding: UTF-8 -*-
'''
人脸模块'''
import uuidfrom aip import AipFace
from prettytable import PrettyTable
from collections import Counter""" APPID AK SK """
APP_ID = '10850801'
API_KEY = '4u4mTUmdVzeNoxBBN9YNEbEf'
SECRET_KEY = '4l4uDDOoor7DME7XBoH8Bx6Q1QY8GWhn 'client = AipFace(APP_ID, API_KEY, SECRET_KEY)class FACE(object):def get_file_content(self,file):
with open(file, 'rb') as fp:
return fp.read()###################################
###################################
#############人脸注册##############
###################################
###################################def face_reg(self,name,filePath,groupId = "friends"):global regist
uid = str(uuid.uuid3(uuid.NAMESPACE_DNS,name)).replace('-', '')
userInfo = name""" 读取图片 """
image = self.get_file_content(filePath)""" 参数 """
options = {}
options["max_face_num"] = 2
options["face_fields"] = "face_probability,qualities,beauty"""" 带参数调用人脸检测 """
quality = client.detect(image, options)""" 人脸检测结果 """
face_probability = quality['result'][0]['face_probability']
Blur = quality['result'][0]['qualities']['blur']
illumination = quality['result'][0]['qualities']['illumination']
completeness = quality['result'][0]['qualities']['completeness']
beauty = quality['result'][0]['beauty']''' 打印照片评价指标 '''
table = PrettyTable(["上传照片参数", "数据"])
table.add_row(["人脸可能性(0-1)", round(face_probability,2)])
table.add_row(["模糊度(0-1)", round(Blur,2)])
table.add_row(["照片亮度", round(illumination,2)])
table.add_row(["人脸完整度(0-1)", round(completeness,2)])
table.add_row(["颜值(0-100)", round(beauty,2)])
table.sort_key("数据")
table.reversesort = True
print(table)if face_probability > 0.7 and Blur < 0.7 and illumination > 40 and completeness > 0.4 :""" 调用人脸注册 """
regist = client.addUser(uid, userInfo, groupId, image);
if str(regist).find("error_msg") != -1:
return regist["error_msg"]
else :
print ('图片没有通过检测')###################################
###################################
#############人脸对比##############
###################################
###################################def face_comp(self,filePath,groupId = "friends"):""" 读取图片 """
image = self.get_file_content(filePath)""" 可选参数 """
options = {}
options["ext_fields"] = "faceliveness"
options["user_top_num"] = 5""" 带参数调用人脸识别 """
face_comp = client.identifyUser(groupId, image, options)""" 输出对比结果 """
comp = face_comp['result']
return comp###################################
###################################
#############多人识别##############
###################################
###################################def faces_comp(self,filePath,groupId = "friends"):""" 读取图片 """
image = self.get_file_content(filePath)""" 可选参数 """
options = {}
options["ext_fields"] = "faceliveness"
options["detect_top_num"] = 3
options["user_top_num"] = 2""" 带参数调用M:N 识别 """
faces_comp = client.multiIdentify(groupId, image, options)return faces_comp
if __name__ == '__main__':
face = FACE()
#face.face_reg('李博','1.jpg')
print("与人脸库中%s的匹配度为%.1f%%"%(face.face_comp('3.jpg')[0]["user_info"],face.face_comp('3.jpg')[0]["scores"][0]),sep='')
# print (face.face_comp('2.jpg'))
推荐阅读
- 丰盛派创始人安裘密语录
- 人工智能|干货!人体姿态估计与运动预测
- 【文魁大脑实用记忆第五期】贤派张丽琼第8次案例一地理记忆有汽泡图
- 韵达基于云原生的业务中台建设 | 实战派
- 浙派名师-丁圆伟
- Python+树莓派制作IoT(物联网)门控设备
- 【思维导图实战派】刻意练习计划“遇见……”|【思维导图实战派】刻意练习计划“遇见……” 1/300 人教版数学五下第三单元《正方体和长方体的认识》
- 青岛机情派iPhone5s指纹识别修复
- 单片机|Arduino、arm、树莓派、单片机四者有什么不同()
- 江湖情——你我的碧落(2)