美文网首页玩转树莓派物联网IOT创意开发树莓派
人工智能-树莓派小车(6)——人脸识别

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

作者: IConquer | 来源:发表于2018-02-26 22:37 被阅读188次

    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'))
    

    相关文章

      网友评论

      • YingHe: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'))
        运行的时候这里的sep=""报错或者 # print (face.face_comp('2.jpg'))报错
        YingHe:已安装pip :执行pip install baidu-aip即可。
        已安装setuptools :执行python setup.py install

        这两个的安装是不是这样
        sudo apt-get install baidu-aip
        第二个就不知道了。但是第一个安装的时候是找不安装的包的
        YingHe:@IConquer 程序中有一个 语法错误。给的是这样的意思# print (face.face_comp('2.jpg'))
        这个注释的被选中的错误
        IConquer:@YingHe 什么错
      • 敲代码的小新:楼主厉害啊,今天刚有自己做的只能小车的想法,就搜到你的文章了
        IConquer:@敲代码的小新 谢谢

      本文标题:人工智能-树莓派小车(6)——人脸识别

      本文链接:https://www.haomeiwen.com/subject/vevyxftx.html