人工智能-树莓派小车(6)——人脸识别

Hello 大家好,2018春节这么快就过去了,祝大家新年快乐啦, 新年新气象,新的一年就要搞一点不一样的东西!!!每个人都有一些属于自己的秘密,所以想着可以借助目前比较火的人脸识别来做一个安全系统。当然,基于此人脸识别系统还可以实现人脸签到、人脸闸机等等多种功能,就看你的想象力了,比如给你的电脑上锁,每隔一段时间拍一张照,如果不是你本人就自动锁定系统等等……
基本的原理就是首先创建一个人脸库,将各个用户上传到不同的用户组,来设定所拥有的不同权限,创建人脸库的时候首先要为每个用户上传人脸照片,在上传过程中还要检测上传照片的质量,看是否合格。
人脸识别服务 现在是一个基于互联网的时代,因此我的想法是一切能够在云端做的事情,绝不在本地运行,仅仅将树莓派作为一个终端,来连接各种服务,然后将这些服务呈现给你,这样一是能够保证本地的运行速率,毕竟树莓派性能有限,识别一个照片需要两三秒的时间就有些不优雅了,二是容错率较好,一旦发生错误能更加方便的对其进行修正和重新部署。
因此本人采用了百度的人脸识别服务,目前百度的人脸识别主要提供三种功能:

接口名称 接口能力简要描述
人脸检测 检测人脸并定位,返回五官关键点,及人脸各属性值
人脸比对 返回两两比对的人脸相似值
人脸查找 在一个人脸集合中找到找到相似的人脸
人脸注册 包括人脸识别、人脸认证、人脸库管理相关接口
安装人脸识别 Python SDK
人脸识别 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 }

质量判断
可通过人脸检测接口,基于以下字段和对应阈值,进行质量检测的判断,以保证人脸质量符合后续业务操作要求。
人工智能-树莓派小车(6)——人脸识别
文章图片
质量判断依据 人脸注册
用于从人脸库中新增用户,可以设定多个用户所在组,及组内用户的人脸图片。
人脸库、用户组、用户、用户下的人脸层级关系如下所示:
|- 人脸库 |- 用户组一 |- 用户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'))

    推荐阅读