(适合小白)利用百度AI开放平台实现人脸检测,对比和搜索。

** 说明:利用百度AI开放平台实现人脸识别没有什么特别的算法,直接调用百度的API就可以了,所以比较适合小白学习。**

百度AI开放平台网站:
首先要注册并登录该网站,找到人脸检测后,点击立即使用,并创建一个人脸检测应用。之后点管理应用,就可以找到需要的AppID,API Key,Secret Key等。
并且官方有比较详细的技术文档,大家可以参考我的博客一起使用。

1.人脸检测

步骤:
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()   # 显示图片
    

(适合小白)利用百度AI开放平台实现人脸检测,对比和搜索。_第1张图片

2.人脸对比

说明:既然要实现人脸对比,那么必然要有两张照片了,大家可以挑选自己的两张不同的照片进行测试。

'''
人脸对比
'''
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}

3.人脸搜索

说明:实现人脸搜索,首先要有人脸库吧,根据你提供的一张照片,它便会自动到人脸库中寻找最相似的那一张照片,并且将它的信息返回。

人脸库的创建:
点击人脸库管理,创建用户组,然后就可以在用户组中创建多个用户,并提交他们的照片(注意,同一个人可以提交多张照片,但是不要把用户和对应的照片弄混。)
(适合小白)利用百度AI开放平台实现人脸检测,对比和搜索。_第2张图片

'''
进行人脸搜索
'''
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}

总结

最后,如何在打开摄像头的同时,进行人脸识别呢?就要靠大家自己去思考了。欢迎在下方进行交流。如果后期多个人有需要,我会将代码上传。

你可能感兴趣的:(Python)