#!/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()