** 说明:利用百度AI开放平台实现人脸识别没有什么特别的算法,直接调用百度的API就可以了,所以比较适合小白学习。**
百度AI开放平台网站:
首先要注册并登录该网站,找到人脸检测后,点击立即使用,并创建一个人脸检测应用。之后点管理应用,就可以找到需要的AppID,API Key,Secret Key等。
并且官方有比较详细的技术文档,大家可以参考我的博客一起使用。
1.人脸检测
步骤:
1:创建人脸检测应用,获取API key 和 serect Key
2: 获取Access Token
3:准备照片,填写参数
4:调用人脸检测的API进行检测
5:显示检测结果
功能说明:在一张图片上用矩形框圈出人脸,并显示出该图片。
import requestsimport cv2 as cvimport base64import urllib.parsefrom pprint import *import matplotlib.image as npimgimport matplotlib.pyplot as plt# 获取Access Tokenhost = '/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'response = requests.get(host)if response:# print(response.json())access_token = (response.json())['access_token'] # 提取access_tokenprint(access_token)# 这里要改写成你自己的图片路径image = npimg.imread('G:/python/face_tracking/face_recgnize/Facedata/User.0.1.jpg') # 已经是numpy数组形式# 读取并解码照片# 这里要改写成你自己的图片路径with open('G:/python/face_tracking/face_recgnize/Facedata/User.0.1.jpg','rb')as f: img_jpg = f.read() # 以二进制读取图片img64 = base64.b64encode(img_jpg) # 对图片进行base64编码params = {}params['image'] = img64params['image_type'] = 'BASE64' # 图片要求为base64编码格式params['face_field'] = 'age,gender' # 我这里只需要姓名和性别,需要其他信息的参照官方文档params = urllib.parse.urlencode(params).encode() # params为字典格式,需要对它进行编码print(params)# 调用人脸检测apirequest_url = "/rest/2.0/face/v3/detect" + "?access_token=" + access_tokenheaders = {'content-type': 'application/json'}response = requests.post(request_url, data=params, headers=headers)if response:response = response.json()pprint (response) # 结构化输出数据# 显示边框if response['error_code'] == 0:result = response['result']print("检测到的人脸数量:{}".format(result['face_num']))# 针对每一个检测到的人脸进行显示边框,年龄和性别(只有当置信度>0.8时任为成功)for face in result['face_list']:if face['face_probability']>0.8:loc = face['location']pt1 = (int(loc['left']),int(loc['top']))pt2 = (int(loc['left'] + loc['width']),int(loc['top'] + loc['height']))cv.rectangle(image,pt1,pt2,(255,0,0),3) # 画边框cv.putText(image,"{}:{}".format(face["gender"]['type'],face['age']),(pt1[0],pt1[1]-10),cv.FONT_HERSHEY_SIMPLEX,0.5,(255,0,0),2)plt.figure(figsize=(10,8),dpi=100)plt.imshow(image)plt.axis("off")plt.show() # 显示图片
2.人脸对比
说明:既然要实现人脸对比,那么必然要有两张照片了,大家可以挑选自己的两张不同的照片进行测试。
'''人脸对比'''import requestsimport base64from urllib import parsefrom pprint import *import urllibimport json# client_id 为官网获取的AK, client_secret 为官网获取的SKhost = '/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'response = requests.get(host)if response:# print(response.json())access_token = (response.json())['access_token'] # 提取access_tokenprint(access_token)# 读取并解码照片# 第一张照片with open('G:/python/face_tracking/baidu_face/Facedata/User.1.3.jpg','rb')as f:img_jpg = f.read() # 以二进制读取图片img64 = base64.b64encode(img_jpg) # 对图片进行base64编码params1 = {}params1['image'] = str(img64, 'utf-8')params1['image_type'] = 'BASE64'# 第二张照片,需要和第一张进行对比with open('G:/python/face_tracking/face_recgnize/Facedata/User.0.1.jpg','rb')as f2:img_jpg = f2.read() # 以二进制读取图片img64 = base64.b64encode(img_jpg) # 对图片进行base64编码params2 = {}params2['image'] = str(img64, 'utf-8')params2['image_type'] = 'BASE64'params = []params.append(params1)params.append(params2)params = json.dumps(params).encode("utf-8") # 通过json转为字符串,再通过encode转为字节串print(type(params))# 调用人脸检测apirequest_url = "/rest/2.0/face/v3/match" + "?access_token=" + access_tokenheaders = {'content-type': 'application/json'}response = requests.post(request_url, data=params, headers=headers)if response:response = response.json()pprint (response) # 结构化输出数据
'''这是我这里的输出结果,其中score就是两张照片中的任务进行比对的得分。''''cached': 0,'error_code': 0,'error_msg': 'SUCCESS','log_id': 1535890555949,'result': {'face_list': [{'face_token': 'c4a44140466b8dfad811e5abf4fd0962'},{'face_token': '587aa381118897c78a1b0a98b6ae71b5'}],'score': 95.90228271},'timestamp': 1583584806}
3.人脸搜索
说明:实现人脸搜索,首先要有人脸库吧,根据你提供的一张照片,它便会自动到人脸库中寻找最相似的那一张照片,并且将它的信息返回。
人脸库的创建:
点击人脸库管理,创建用户组,然后就可以在用户组中创建多个用户,并提交他们的照片(注意,同一个人可以提交多张照片,但是不要把用户和对应的照片弄混。)
'''进行人脸搜索'''import requestsimport base64from urllib import parsefrom pprint import *import urllibimport json# client_id 为官网获取的AK, client_secret 为官网获取的SKhost = '/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'response = requests.get(host)if response:# print(response.json())access_token = (response.json())['access_token'] # 提取access_tokenprint(access_token)request_url = "/rest/2.0/face/v3/search"# 根据这里提供的照片去人脸库进行搜索with open('G:/python/face_tracking/face_recgnize/Facedata/User.0.1.jpg','rb')as f:img_jpg = f.read() # 以二进制读取图片img64 = base64.b64encode(img_jpg) # 对图片进行base64编码params = {}params['image'] = img64params['image_type'] = 'BASE64'params['group_id_list'] = 'group_01'params = urllib.parse.urlencode(params).encode() # params为字典,需要对它进行编码request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/json'}response = requests.post(request_url, data=params, headers=headers)if response:pprint (response.json())
'''group_id为查找到的照片,属于我的人脸库中哪一组score同样为相似度user_id表面是人脸库中的哪一个用户'''{'cached': 0,'error_code': 0,'error_msg': 'SUCCESS','log_id': 6594458435001,'result': {'face_token': '587aa381118897c78a1b0a98b6ae71b5','user_list': [{'group_id': 'group_01','score': 95.900688171387,'user_id': '1','user_info': ''}]},'timestamp': 1583585152}
总结
最后,如何在打开摄像头的同时,进行人脸识别呢?就要靠大家自己去思考了。欢迎在下方进行交流。如果后期多个人有需要,我会将代码上传。