• python3 百度AI-v3之 人脸对比 & 人脸检测 & 在线活体检测 接口


    #!/usr/bin/python3
    # 百度人脸对比 & 人脸检测api-v3
    
    import sys, tkinter.messagebox, ast
    import ssl, json,requests
    import pdb
    import base64
    from urllib import request, parse
    from aip import AipFace
    
    ssl._create_default_https_context = ssl._create_unverified_context
    
    class BaiDuAipFaceAndFaceIdentify(object):
    
        def __init__(self):
            # client_id 为官网获取的AK, client_secret 为官网获取的SK
            self.__client_id = "mH7LbbbnfolCy55Tp6xIXA5N"
            self.__client_secret = "8vokD7ug44e2LzZHvfb0zPTUTTUTfc79"
            self.get_token_url = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s' % (
                self.__client_id, self.__client_secret)
            self.match_url = 'https://aip.baidubce.com/rest/2.0/face/v3/match?access_token='
            self.token = 0
            # 获取token
    
        def get_token(self):
    
            req = request.Request(self.get_token_url)
            req.add_header('Content-Type', 'application/json; charset=UTF-8')
            response = request.urlopen(req)
            # 获得请求结果
            content = response.read()
            # print(content)
            # 结果转化为字符
            content = bytes.decode(content)
            # 转化为字典
            content = eval(content[:-1])
            self.__token = content['access_token']
    
        # 转换图片
        # 读取文件内容,转换为base64编码
        # 二进制方式打开图文件
        def imgdata(self, file1path, file2path):
    
            f1 = open(r'%s' % file1path, 'rb')
            pic1 = base64.b64encode(f1.read())
            f1.close()
            f2 = open(r'%s' % file2path, 'rb')
            pic2 = base64.b64encode(f2.read())
            f2.close()
            # 将图片信息格式化为可提交信息,这里需要注意str参数设置
    
            params = json.dumps([{"image": str(pic1, 'utf-8'),
                                  "image_type": "BASE64"
                                  # "face_type":"LIVE",
                                  # "quality_control":"LOW"
                                  # "liveness_control":"NONE"
                                  },
                                 {"image": str(pic2, 'utf-8'),
                                  "image_type": "BASE64"
                                  #  "face_type": "LIVE",
                                  # "quality_control": "LOW"
                                  # "liveness_control": "NONE"
                                  },
                                 ])
            return params
    
        # 提交进行对比获得结果
        def FaceMath(self):
            token = self.__token
            pics = self.base64_img(2)
            # 将图片信息格式化为可提交信息,这里需要注意str参数设置
            params = []
            for pic in pics:
                params.append({"image": str(pic, 'utf-8'),
                                  "image_type": "BASE64"
                                  # "face_type":"LIVE",
                                  # "quality_control":"LOW"
                                  # "liveness_control":"NONE"
                                  })
                # pdb.set_trace()
            params = json.dumps(params)
    
            url = self.match_url + token
            # urlencode处理需提交的数据
            content = self.post(url,params)
            # 获得分数
            score = content['result']['score']
            tkinter.messagebox.showinfo('图片相似度','两个人的相似度为:%d'%score)
            if score > 80:
                print('照片相似度:' + str(score) + ',为同一个人')
            else:
                print('照片相似度:' + str(score) + ',不是同一个人')
    
            # 此函数进行人脸识别,返回识别到的人脸列表
            # 此函数被parse_face_pic调用,没用到
    
        """   
        def identify_faces(self, pic, url_fi):
                headers = {
                    'Content-Type': 'application/json; charset=UTF-8'
                }
                post_data = {
                    'image': pic,
                    'image_type': 'BASE64',
                    'face_field': 'facetype,gender,age,beauty',  # expression,faceshape,landmark,race,quality,glasses
                    'max_face_num': 2
                }
    
                response_fi = requests.post(url_fi, headers=headers, data=post_data)
                json_fi_result = json.loads(response_fi.text)
                return json_fi_result['result']['face_list']
                # 下边的print也许是最直观,你最想要的
                # print(json_fi_result['result']['face_list'][0]['age'])
                # print(json_fi_result['result']['face_list'][0]['beauty'])
            """
            # 此函数用于解析进行人脸图片,输出图片上的人脸的性别、年龄、颜值
            # 此函数调用identify_faces
        def parse_face_pic(self):
                url_pic = input("请输入图片地址?
    请您输入:")
                f1 = open(r'%s' % url_pic, 'rb')
                pic = base64.b64encode(f1.read())
                f1.close()
                # 调用get_access_token获取access_token
                access_token = self.__token
                url = 'https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=' + access_token
                # 调用identify_faces,获取人脸列表
                #json_faces = self.identify_faces(pic, url_fi)
                params = json.dumps({
                    'image':str(pic, 'utf-8'),
                    'image_type': 'BASE64',
                    'face_field': 'facetype,gender,age,beauty',  # expression,faceshape,landmark,race,quality,glasses
                    'max_face_num': 2
                })
                json_faces = self.post(url, params)
                pdb.set_trace()
                if len(json_faces) == 0:
                    print('未识别到人脸')
                else:
                    for json_face in json_faces['result']['face_list']:
                        #pdb.set_trace()  # 调试
                        print('种类:' + json_face['face_type']['type'])
                        if str(json_face['gender']['type']) == 'female':
                            print('性别: 女' )
                        else:
                            print('性别: 男')
    
                        print('年龄:' + str(json_face['age']))
                        print('颜值:' + str(json_face['beauty']))
    
    
        #face_merge 暂时没有v3 api ,所以暂时没用
        def face_merge(self):
            file1path, file2path = map(str, input("请输入需要融合图片地址a(模版),b(目标图片)空格隔开?
    请您输入:").split())
            f1 = open(r'%s' % file1path, 'rb')
            pic1 = base64.b64encode(f1.read())
            f1.close()
            f2 = open(r'%s' % file2path, 'rb')
            pic2 = base64.b64encode(f2.read())
            f2.close()
            headers = {
                'Content-Type': 'application/json; charset=UTF-8'
            }
            post_data = {"image_template":
                    {'image': pic1,
                    'image_type': 'BASE64',
                    'quality_control': "NONE"
                    },
                "image_target":
                    {'image': pic2,
                     'image_type': 'BASE64',
                     'quality_control': "NONE"
                     }
            }
            access_token = self.__token
            url_fi = 'https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token=' + access_token
            response_fi = requests.post(url_fi, headers=headers, data=post_data)
            json_fi_result = json.loads(response_fi.text)
            print(json_fi_result)
            pdb.set_trace()
    
        #face_faceverify
        def face_faceverify(self):
            pics = self.base64_img(2)
            # 将图片信息格式化为可提交信息,这里需要注意str参数设置
            params=[]
            for pic in pics:
                params.append({"image": str(pic, 'utf-8'),
                                  "image_type": "BASE64",
                                  'face_field': "age,beauty,expression"
                                  })
                #pdb.set_trace()
            params = json.dumps(params)
    
            access_token = self.__token
            url = 'https://aip.baidubce.com/rest/2.0/face/v3/faceverify?access_token=' + access_token
            content = self.post(url,params)
            #pdb.set_trace()
            for json_face in content['result']['face_list']:
                # pdb.set_trace()  # 调试
                print('表情:' + json_face['expression']['type'])
    
                print('年龄:' + str(json_face['age']))
                print('颜值:' + str(json_face['beauty']))
    
        #post 请求工具方法
        def post(self,url,params):
            req = request.Request(url=url, data=params.encode('utf-8'))
            req.add_header('Content-Type', 'application/json; charset=UTF-8')
            response = request.urlopen(req)
            content = response.read()
    
            content = content.decode('utf-8')
            #print(content)
            content = ast.literal_eval(content)
            return  content
        #本地图片上传base64
        #type 1 /单张图片 2 /两张图片
        def base64_img(self,type):
            imgs = []
            if type==1:
                url_pic = input("请输入图片地址?
    请您输入:")
                f1 = open(r'%s' % url_pic, 'rb')
                pic = base64.b64encode(f1.read())
                f1.close()
                return pic
            else:
                file1path, file2path = map(str, input("请输入图片地址a,b空格隔开?
    请您输入:").split())
                f1 = open(r'%s' % file1path, 'rb')
                imgs.append(base64.b64encode(f1.read()))
                f1.close()
                f2 = open(r'%s' % file2path, 'rb')
                imgs.append(base64.b64encode(f2.read()))
                f2.close()
                return imgs
    
    
    if __name__ == '__main__':
        # file1path = './1.png'
        # file2path = './2.png'
        b = BaiDuAipFaceAndFaceIdentify()
        b.get_token()
    
        #调用人脸对比方法
        b.FaceMath()
        #调用人脸检测方法
        b.parse_face_pic()
        #调用在线活体检测
        b.face_faceverify()
  • 相关阅读:
    位向量法、二进制法枚举子集
    jfinal 下载文件时重命名
    Java程序员开发参考资源
    (二)Hive1.2.2
    (一)Hive1.2.2
    YARN资源调度框架
    MapReduce并行编程模型
    HDFS 分布式文件系统
    Kafka
    观察者模式
  • 原文地址:https://www.cnblogs.com/piwefei/p/11283785.html
Copyright © 2020-2023  润新知