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("请输入图片地址?\n请您输入:")
            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(目标图片)空格隔开?\n请您输入:").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("请输入图片地址?\n请您输入:")
            f1 = open(r'%s' % url_pic, 'rb')
            pic = base64.b64encode(f1.read())
            f1.close()
            return pic
        else:
            file1path, file2path = map(str, input("请输入图片地址a,b空格隔开?\n请您输入:").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()

 

posted @ 2019-08-01 16:58  piwenfei  阅读(2456)  评论(0编辑  收藏  举报