** 说明:利用百度AI开放平台实现人脸识别没有什么特别的算法,直接调用百度的API就可以了,所以比较适合小白学习。**
百度AI开放平台网站:
首先要注册并登录该网站,找到人脸检测后,点击立即使用,并创建一个人脸检测应用。之后点管理应用,就可以找到需要的AppID,API Key,Secret Key等。
并且官方有比较详细的技术文档,大家可以参考我的博客一起使用。
步骤:
1:创建人脸检测应用,获取API key 和 serect Key
2: 获取Access Token
3:准备照片,填写参数
4:调用人脸检测的API进行检测
5:显示检测结果
功能说明:在一张图片上用矩形框圈出人脸,并显示出该图片。
import requests
import cv2 as cv
import base64
import urllib.parse
from pprint import *
import matplotlib.image as npimg
import matplotlib.pyplot as plt
# 获取Access Token
host = 'https://aip.baidubce.com/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_token
print(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'] = img64
params['image_type'] = 'BASE64' # 图片要求为base64编码格式
params['face_field'] = 'age,gender' # 我这里只需要姓名和性别,需要其他信息的参照官方文档
params = urllib.parse.urlencode(params).encode() # params为字典格式,需要对它进行编码
print(params)
# 调用人脸检测api
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect" + "?access_token=" + access_token
headers = {'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() # 显示图片
说明:既然要实现人脸对比,那么必然要有两张照片了,大家可以挑选自己的两张不同的照片进行测试。
'''
人脸对比
'''
import requests
import base64
from urllib import parse
from pprint import *
import urllib
import json
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/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_token
print(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))
# 调用人脸检测api
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/match" + "?access_token=" + access_token
headers = {'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}
说明:实现人脸搜索,首先要有人脸库吧,根据你提供的一张照片,它便会自动到人脸库中寻找最相似的那一张照片,并且将它的信息返回。
人脸库的创建:
点击人脸库管理,创建用户组,然后就可以在用户组中创建多个用户,并提交他们的照片(注意,同一个人可以提交多张照片,但是不要把用户和对应的照片弄混。)
'''
进行人脸搜索
'''
import requests
import base64
from urllib import parse
from pprint import *
import urllib
import json
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/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_token
print(access_token)
request_url = "https://aip.baidubce.com/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'] = img64
params['image_type'] = 'BASE64'
params['group_id_list'] = 'group_01'
params = urllib.parse.urlencode(params).encode() # params为字典,需要对它进行编码
request_url = request_url + "?access_token=" + access_token
headers = {'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}
最后,如何在打开摄像头的同时,进行人脸识别呢?就要靠大家自己去思考了。欢迎在下方进行交流。如果后期多个人有需要,我会将代码上传。