百度人脸 检测 识别 python3.5 APIV3版本
程序员文章站
2023-12-21 18:29:58
...
第一次写博客,我自己就想试试百度的人脸识别,代码也没有优化,简单的实现了一下供大家参 考。
实现的功能,一个文件夹有6个人的正脸照片,假设是上传的人脸库。另一个文件夹有100张图片,就是抓拍的这6个人的图片,有的图片只有一个人,有的图片有多个人。实现的功能是在图片中标注出人脸框,上面写上ID1:0.89,代表百度认为这个脸最像谁并输出归一化的相似度分数。
我自己之前试了一下,如果照片里只有一个人,那就直接把待测照片和人脸库照片直接交给百度的match识别函数就行,百度直接给你对比分数,效果还很好。如果照片有多张人脸,我就用检测(detect)接口先进行检测,把人脸图截取保存,再用截出来人脸图进行识别。这仅仅是我的想法,不一定正确,仅供参考。
另外,对于只有一个人的图片,如果你采取截图再识别(match)的方法,我试着分数会降低,不如直接识别(match)。
百度输出的分数是0-100,我给化到0-1了。
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 2 17:36:41 2018
@author: 我永远喜欢青山七海
"""
from aip import AipFace
import base64
import cv2
# 定义常量
APP_ID = 'XXXXXXX'
API_KEY = 'XXXXXXX'
SECRET_KEY = 'XXXXXXX'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
IMAGE_TYPE='BASE64'
id=[]
id.append(0)#23333333
f1 = open('D:\\ID1.jpg','rb')
id.append(base64.b64encode(f1.read()))
f1.close
f2 = open('D:\\ID2.jpg','rb')
id.append(base64.b64encode(f2.read()))
f2.close
f3 = open('D:\\ID3.jpg','rb')
id.append(base64.b64encode(f3.read()))
f3.close
f4 = open('D:\\ID4.jpg','rb')
id.append(base64.b64encode(f4.read()))
f4.close
f5 = open('D:\\ID5.jpg','rb')
id.append(base64.b64encode(f5.read()))
f5.close
f6 = open('D:\\ID6.jpg','rb')
id.append(base64.b64encode(f6.read()))
f6.close
def match(img):
score=[]
for i in range(1,7):
params1 = [{"image":str(img,'utf-8'),"image_type":IMAGE_TYPE},{"image":str(id[i],'utf-8'),"image_type":IMAGE_TYPE}]
result = client.match(params1);
#print(result)
if result['error_msg']=='pic not has face':
print('no match ')
return 0
#print('match result')
#print (result)
tmp=result['result']['score']/100.0
score.append(tmp)
#print(result['result']['score'])
#print('match result')
print ([float("%.2f" % max(score)),score.index(max(score))+1])
return[float("%.2f" % max(score)),score.index(max(score))+1]#最高分数和ID
def detect(img64,j):
options = {'max_face_num': 5, }# 图像数量
result1=client.detect(img64, "BASE64", options)
if result1['error_msg']=='pic not has face':
print('no face')
return []
faceNum=result1['result']['face_num']
if faceNum == 0:
return []
img=cv2.imread('D:\\test\\{}.jpg'.format(j))
result=[]
for i in range(faceNum):#保存小图
'''if result1['result']['face_list'][i]['face_probability'] >0.3:
location=result1['result']['face_list'][i]['location']
left_top=(int(location['left']),int(location['top']))
right_bottom=(left_top[0]+int(location['width']),left_top[1]+int(location['height']))
result.append([left_top,right_bottom])
#print(left_top[1],right_bottom[1],left_top[0],right_bottom[0])
cropImg=img[max(0,left_top[1]):max(0,right_bottom[1]),max(0,left_top[0]):max(0,right_bottom[0])]
cv2.imwrite('D:\\cropImg\\{}.{}.jpg'.format(j,i),cropImg)'''
location=result1['result']['face_list'][i]['location']
left_top=(int(location['left']),int(location['top']))
right_bottom=(left_top[0]+int(location['width']),left_top[1]+int(location['height']))
result.append([left_top,right_bottom])
#print(left_top[1],right_bottom[1],left_top[0],right_bottom[0])
cropImg=img[max(0,left_top[1]):max(0,right_bottom[1]),max(0,left_top[0]):max(0,right_bottom[0])]
cv2.imwrite('D:\\cropImg\\{}.{}.jpg'.format(j,i),cropImg)
#print('detect result\n')
#print(result)
return result
if __name__ == '__main__':
for j in range(1,101):
print('.........................')
print(j)
f = open('D:\\test\\{}.jpg'.format(j),'rb')
image = base64.b64encode(f.read())
img64 = str(image,'utf-8')
result_detect=detect(img64,j)
print (len(result_detect))
im=cv2.imread('D:\\test\\{}.jpg'.format(j))
if result_detect==0 or result_detect==[]:
cv2.imwrite('D:\\result\\{}.jpg'.format(j),im)
continue
if len(result_detect)==1:
result_match=match(image)
left_top,right_bottom=result_detect[0]
cv2.rectangle(im,left_top,right_bottom,(0,0,255),2)
text = 'ID{}'.format(result_match[1])+':{}'.format(result_match[0])
cv2.putText(im, text, (left_top[0],left_top[1]-6), cv2.FONT_HERSHEY_SIMPLEX,3, (0, 255, 0),5 )
cv2.imwrite('D:\\result\\{}.jpg'.format(j),im)
if len(result_detect)>1:
for i in range(len(result_detect)):
f1 = open('D:\\cropImg\\{}.{}.jpg'.format(j,i),'rb')
image = base64.b64encode(f1.read())
result_match=match(image)
if result_match==0:
cv2.imwrite('D:\\result\\{}.jpg'.format(j),im)
continue
left_top,right_bottom=result_detect[i]
cv2.rectangle(im,left_top,right_bottom,(0,0,255),2)
text = 'ID{}'.format(result_match[1])+':{}'.format(result_match[0])
cv2.putText(im, text, (left_top[0],left_top[1]-6), cv2.FONT_HERSHEY_SIMPLEX,3, (0, 255, 0),5 )
cv2.imwrite('D:\\result\\{}.jpg'.format(j),im)
手里有国内其他两家人脸识别的数据,效果来看,百度的人脸检测率一般,但是绝对够用,不是顶尖。相对来说通过率太恐怖了,真的是无论低光照还是大角度偏转,通过率都非常好,但是误识率我这没法测。
代码写的很烂见笑了