利用百度API实现人脸特征检测

前言

在进人脸识别之前,要对人脸的特征进行检测,获取关键部位信息。百度的api提供这一接口。对一张照片的人脸进行关键特征部位的检测,本文提供以下代码供参考。

五官位置会标记具体坐标;72个关键点坐标也包含具体坐标,但不包含对应位置的详细位置描述。
# -*- coding: utf-8 -*-# from aip import AipFaceimport cv2import base64import mathimport matplotlib.pyplot as pltfrom graphics import*#import tkinter as tkfrom tkinter import filedialogfrom time import sleep APP_ID = '16290061'API_KEY = '4uKwGeC2Ci7aHbn6dHuYIrGc'SECRET_KEY = 'KRdPZdtYwLsdEthIGu03jb7GEeRtTUMF'aipFace = AipFace(APP_ID, API_KEY, SECRET_KEY) filepath = "C:/Users/ZXY13/Desktop/train_face/1.jpg"win = GraphWin('人脸关键点检测', 500, 90)win.setBackground("yellow")Text(Point(win.getWidth()/2, 40), "请在文件夹中选择一张人脸图片进行关键点检测").draw(win)sleep(1)filepath = filedialog.askopenfilename() from PIL import Imageim = Image.open(filepath) with open(filepath, "rb") as fp:    base64_data = base64.b64encode(fp.read())image = str(base64_data, 'utf-8')imageType = "BASE64" options = {}options["face_field"] = "age,beauty,expression,faceshape,gender,glasses,landmark,race,quality,facetype"options["max_face_num"] = 10options["face_type"] = "LIVE" result = aipFace.detect(image, imageType, options)img = cv2.imread(filepath) face_num = result['result']['face_num']face_list = result['result']['face_list'] xvalue = []yvalue = []xvaluef = []yvaluef = [] plt.figure(figsize=(9,6.5))for num in range(0,int(face_num)):           location = result['result']['face_list'][num-1]['location']    landmark72 = result['result']['face_list'][num-1]['landmark72']     xvaluef1 = []    yvaluef1 = []    xvaluef2 = []    yvaluef2 = []    xvaluef3 = []    yvaluef3 = []    xvaluef4 = []    yvaluef4 = []    xvaluef5 = []    yvaluef5 = []    xvaluef6 = []    yvaluef6 = []    xvaluef7 = []    yvaluef7 = []    xvaluef8 = []    yvaluef8 = []     for i in range(0,72):        xvalue.append(landmark72[i]['x'])        yvalue.append(landmark72[i]['y'])        xvaluef.append(im.size[0]-landmark72[i]['x'])        yvaluef.append(im.size[1]-landmark72[i]['y'])      for i in range(0,13):        xvaluef1.append(landmark72[i]['x'])        yvaluef1.append(im.size[1]-landmark72[i]['y'])     for i in range(13,21):        xvaluef2.append(landmark72[i]['x'])        yvaluef2.append(im.size[1]-landmark72[i]['y'])    xvaluef2.append(landmark72[13]['x'])    yvaluef2.append(im.size[1]-landmark72[13]['y'])     for i in range(22,30):        xvaluef3.append(landmark72[i]['x'])        yvaluef3.append(im.size[1]-landmark72[i]['y'])    xvaluef3.append(landmark72[22]['x'])    yvaluef3.append(im.size[1]-landmark72[22]['y'])     for i in range(30,38):        xvaluef4.append(landmark72[i]['x'])        yvaluef4.append(im.size[1]-landmark72[i]['y'])    xvaluef4.append(landmark72[30]['x'])    yvaluef4.append(im.size[1]-landmark72[30]['y'])     for i in range(39,47):        xvaluef5.append(landmark72[i]['x'])        yvaluef5.append(im.size[1]-landmark72[i]['y'])    xvaluef5.append(landmark72[39]['x'])    yvaluef5.append(im.size[1]-landmark72[39]['y'])     for i in range(47,57):        xvaluef6.append(landmark72[i]['x'])        yvaluef6.append(im.size[1]-landmark72[i]['y'])    xvaluef6.append(landmark72[47]['x'])    yvaluef6.append(im.size[1]-landmark72[47]['y'])     for i in range(58,66):        xvaluef7.append(landmark72[i]['x'])        yvaluef7.append(im.size[1]-landmark72[i]['y'])    xvaluef7.append(landmark72[58]['x'])    yvaluef7.append(im.size[1]-landmark72[58]['y'])     for i in range(66,71):        xvaluef8.append(landmark72[i]['x'])        yvaluef8.append(im.size[1]-landmark72[i]['y'])        xvaluef8.append(landmark72[66]['x'])    yvaluef8.append(im.size[1]-landmark72[66]['y'])     plt.subplot(2,2,num+2)    plt.plot(xvaluef1,yvaluef1)#'ro',markersize=1    plt.plot(xvaluef2,yvaluef2)    plt.plot(xvaluef3,yvaluef3)    plt.plot(xvaluef4,yvaluef4)    plt.plot(xvaluef5,yvaluef5)    plt.plot(xvaluef6,yvaluef6)    plt.plot(xvaluef7,yvaluef7)    plt.plot(xvaluef8,yvaluef8)    plt.axis('off')     Theta = location['rotation'] / 60     A = (int(location['left']),int(location['top']))    B = (int(location['left'])+int(location['width']*math.cos(Theta)),int(location['top'])+int(location['width']*math.sin(Theta)))    AC_Len = math.sqrt(location['width']**2 + location['height']**2)    AC_Theta = math.atan(location['height']/location['width'])+location['rotation']/60     C = (int(location['left']) + int(AC_Len*math.cos(AC_Theta)), int(location['top'])+int(AC_Len*math.sin(AC_Theta)))    D = (int(location['left'])-int(location['height']*math.sin(Theta)), int(location['top']) + int(location['height']*math.cos(Theta)))    cv2.line(img, A, B, (0, 0, 255), 2)    cv2.line(img, B, C, (0, 0, 255), 2)    cv2.line(img, C, D, (0, 0, 255), 2)    cv2.line(img, D, A, (0, 0, 255), 2) plt.axis('off')plt.subplot(2,2,1)img = img[:,:,[2,1,0]]plt.imshow(img,cmap='gray')plt.plot(xvalue,yvalue,'bo',markersize=1)plt.axis('off')plt.show() plt.figure(figsize=(9,6.5))plt.imshow(img,'gray')plt.plot(xvalue,yvalue,'bo',markersize=1)plt.axis('off')plt.show()  

部分函数解释

BASE64:图片的base64值,base64编码后的图片数据,需urlencode,编码后的图片大小不超过2M; options[“face_field”]:在”face_field”我们可以选择我们需要百度云服务器回传的信息,如年龄(age),美貌评分(beauty),表情(expression),等等。若想选择这些参数,只需将其所表示的英文名称赋值于options[“face_field”]就可以了,比如我想检测出我上传的图片的人是啥人种,年龄大致多少,就可以这么写。 aipFace.detect(image, imageType, options):即为面部检测函数,内部可填入三个参数,image,imageType,options。这三个参数你也已经在上面的代码中赋值好了

人脸检测返回数据参数详情


log_iduint64日志id
result_numuint32人脸数目
resultobject[]人脸属性对象的集合
+agedouble年龄。face_fields包含age时返回
+beautydouble美丑打分,范围0-100,越大表示越美。face_fields包含beauty时返回
+locationobject人脸在图片中的位置
++leftuint32人脸区域离左边界的距离
++topuint32人脸区域离上边界的距离
++widthuint32人脸区域的宽度
++heightuint32人脸区域的高度
+face_probabilitydouble人脸置信度,范围0-1
+rotation_angleint32人脸框相对于竖直方向的顺时针旋转角,[-180,180]
+yawdouble三维旋转之左右旋转角[-90(左), 90(右)]
+pitchdouble三维旋转之俯仰角度[-90(上), 90(下)]
+rolldouble平面内旋转角[-180(逆时针), 180(顺时针)]
+expressionuint32表情,0,不笑;1,微笑;2,大笑。face_fields包含expression时返回
+expression_probabilitydouble表情置信度,范围0~1。face_fields包含expression时返回
+faceshapeobject[]脸型置信度。face_fields包含faceshape时返回
++typestring脸型:square/triangle/oval/heart/round
++probabilitydouble置信度:0~1
+genderstringmale、female。face_fields包含gender时返回
+gender_probabilitydouble性别置信度,范围0~1。face_fields包含gender时返回
+glassesuint32是否带眼镜,0-无眼镜,1-普通眼镜,2-墨镜。face_fields包含glasses时返回
+glasses_probabilitydouble眼镜置信度,范围0~1。face_fields包含glasses时返回
+landmarkobject[]4个关键点位置,左眼中心、右眼中心、鼻尖、嘴中心。face_fields包含landmark时返回
++xuint32x坐标
++yuint32y坐标
+landmark72object[]72个特征点位置,示例图 。face_fields包含landmark时返回
++xuint32x坐标
++yuint32y坐标
+qualitiesobject人脸质量信息。face_fields包含qualities时返回
++occlusionobject人脸各部分遮挡的概率,[0, 1],0表示完整,1表示不完整
+++left_eyedouble左眼
+++right_eyedouble右眼
+++nosedouble鼻子
+++mouthdouble
+++left_cheekdouble左脸颊
+++right_cheekdouble右脸颊
+++chindouble下巴
++blurdouble人脸模糊程度,[0, 1]。0表示清晰,1表示模糊
++illumination-取值范围在[0,255],表示脸部区域的光照程度
++completeness-人脸完整度,[0, 1]。0表示完整,1表示不完整
++typeobject真实人脸/卡通人脸置信度
+++human-真实人脸置信度,[0, 1]
+++cartoon-卡通人脸置信度,[0, 1]

获取结果

这些就是我们在进行人脸识别的依据的特征信息。






免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空