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

Hello 大家好,2018春节这么快就过去了,祝大家新年快乐啦, 新年新气象,新的一年就要搞一点不一样的东西!!!每个人都有一些属于自己的秘密,所以想着可以借助目前比较火的人脸识别来做一个安全系统。当然,基于此人脸识别系统还可以实现人脸签到、人脸闸机等等多种功能,就看你的想象力了,比如给你的电脑上锁,每隔一段时间拍一张照,如果不是你本人就自动锁定系统等等……

基本的原理就是首先创建一个人脸库,将各个用户上传到不同的用户组,来设定所拥有的不同权限,创建人脸库的时候首先要为每个用户上传人脸照片,在上传过程中还要检测上传照片的质量,看是否合格。

人脸识别服务

现在是一个基于互联网的时代,因此我的想法是一切能够在云端做的事情,绝不在本地运行,仅仅将树莓派作为一个终端,来连接各种服务,然后将这些服务呈现给你,这样一是能够保证本地的运行速率,毕竟树莓派性能有限,识别一个照片需要两三秒的时间就有些不优雅了,二是容错率较好,一旦发生错误能更加方便的对其进行修正和重新部署。
因此本人采用了百度的人脸识别服务,目前百度的人脸识别主要提供三种功能:

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

安装人脸识别 Python SDK

人脸识别 Python SDK目录结构

├── 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 uuid

from 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'))
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值