- 👋 Hi, I’m @货又星
- 👀 I’m interested in …
- 🌱 I’m currently learning …
- 💞️ I’m looking to collaborate on …
- 📫 How to reach me …
文章目录
概要
本应用案例旨在利用百度智能云人脸识别接口实现基于认知服务的人脸面部识别功能。通过使用百度智能云提供的人脸识别API,我们可以在客户端或服务器端实现对用户上传的图像或视频中的人脸进行检测、识别和比对,从而实现人脸面部识别的功能。
通过以下步骤,我们就可以利用百度智能云人脸识别接口实现基于认知服务的人脸面部识别功能。这种技术可以广泛应用于安防监控、门禁系统、人脸支付等场景,为用户提供便捷、安全的服务。
关键:百度智能云人脸识别接口
对于这个接口的获取以及应用模板请看上一篇文章:百度智能云申请ak、sk,获取access_token,利用接口实现人脸识别、人脸检测
step1:利用复制的ak、sk获取access_token
ak、sk需要我们首先在百度智能云上创建一个应用,详细内容请看上面的链接
完成应用创建后,就可以复制出ak、sk了,接着我们获取access_token,并利用它完成本项目。虽然上一篇文章已经讲过一遍怎么利用ak、sk获取access_token了,但这里我们还是再说一下。
# 获取access_token值
def get_token(ak,sk):
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+ak+'&client_secret='+sk
try:
response = requests.get(host)
token=response.json()['access_token']
return token
except Exception as e:
print(f"access_token请求异常:{e}")
return None
"""
access_token请求异常:HTTPSConnectionPool(host='aip.baidubce.com', port=443): Max retries exceeded with url: /oauth/2.0/token?grant_type=client_credentials&client_id=CHmwxSnNAcSkGKUreqUDjUft&client_secret=yipa9XjHFgT1puWmpIgrG8unUgM07QDC (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000002B6D1BC3430>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
网络异常:检查网络
access_token请求异常:'access_token'
access_token调用异常:检查ak或sk
"""
主要内容是利用复制的ak、sk获取access_token,但在这里我们给它加了一个错误处理,这里简单列出两种:网络异常和调用异常。
step2:对图片进行Base64编码
这里是最容易理解的,打开图片,并利用base64库进行编码转换就可以了,base64库的安装也很简单,直接pip就可以了。
pip install base64
base64编码函数:
# 对图片进行Base64编码
def pic_base(filepath):
with open(filepath,'rb') as file:
img = base64.b64encode(file.read()).decode('utf-8')
return img
step3:调用接口识别人脸
其实这一步在上一篇文章的示例代码也是有的。这里首先需要用到第一步获取的access_token,对它稍做处理,得到要访问url链接。接着利用第二步的函数对图片进行base64编码,并设置参数。然后是请求头,这个是固定的。最后使用post请求就可以了。
# 调用接口识别人脸
def face_rec(access_token,f):
# 传入参数、请求头,调用接口识别人脸
try:
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
request_url = request_url + "?access_token=" + access_token # 接口网址
img = pic_base(f)
params = {"image":img,"image_type":"BASE64","face_field":"age,gender,expression,beauty,glasses"} # 参数:图片、编码、特征
headers = {'content-type': 'application/json'} # 请求头
response = requests.post(request_url, data=params, headers=headers)
pic_json = response.json() # 识别结果
except Exception as e:
print(f"接口调用异常:{e}")
return None
"""
接口调用异常:can only concatenate str (not "NoneType") to str
access_token请求为空,即请求异常
"""
同样这里也有一个错误处理,给出一种情况:即access_token为空,获取异常的情况。
获得识别结果后,对它进行解析就可以了,这里我们解析得出年龄、性别、表情、眼镜、颜值得识别结果。
# 输出年龄、性别、表情、眼镜、颜值识别结果
try:
result=pic_json['result']
print('年龄为:',result['face_list'][0]['age'])
print('性别为:',result['face_list'][0]['gender']['type'] )
print('表情为:',result['face_list'][0]['expression']['type'])
print('是否戴眼镜:',result['face_list'][0]['glasses']['type'])
print('颜值为:',result['face_list'][0]['beauty'])
except:
print(pic_json['error_msg'])
"""
pic not has face
图片识别不到人脸
"""
注意如果你放入的图片并不是人,那么可能会报错,识别不到人脸。
结果示例
源码分享
百度智能云申请ak、sk,获取access_token,利用接口实现人脸识别、人脸检测
import base64
import requests
from PIL import Image
import matplotlib.pyplot as plt
# 获取access_token值
def get_token(ak,sk):
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+ak+'&client_secret='+sk
try:
response = requests.get(host)
token=response.json()['access_token']
return token
except Exception as e:
print(f"access_token请求异常:{e}")
return None
"""
access_token请求异常:HTTPSConnectionPool(host='aip.baidubce.com', port=443): Max retries exceeded with url: /oauth/2.0/token?grant_type=client_credentials&client_id=CHmwxSnNAcSkGKUreqUDjUft&client_secret=yipa9XjHFgT1puWmpIgrG8unUgM07QDC (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x000002B6D1BC3430>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
网络异常:检查网络
access_token请求异常:'access_token'
access_token调用异常:检查ak或sk
"""
# 对图片进行Base64编码
def pic_base(filepath):
with open(filepath,'rb') as file:
img = base64.b64encode(file.read()).decode('utf-8')
return img
# 调用接口识别人脸
def face_rec(access_token,f):
# 传入参数、请求头,调用接口识别人脸
try:
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
request_url = request_url + "?access_token=" + access_token # 接口网址
img = pic_base(f)
params = {"image":img,"image_type":"BASE64","face_field":"age,gender,expression,beauty,glasses"} # 参数:图片、编码、特征
headers = {'content-type': 'application/json'} # 请求头
response = requests.post(request_url, data=params, headers=headers)
pic_json = response.json() # 识别结果
except Exception as e:
print(f"接口调用异常:{e}")
return None
"""
接口调用异常:can only concatenate str (not "NoneType") to str
access_token请求为空,即请求异常
"""
# 输出年龄、性别、表情、眼镜、颜值识别结果
try:
result=pic_json['result']
print('年龄为:',result['face_list'][0]['age'])
print('性别为:',result['face_list'][0]['gender']['type'] )
print('表情为:',result['face_list'][0]['expression']['type'])
print('是否戴眼镜:',result['face_list'][0]['glasses']['type'])
print('颜值为:',result['face_list'][0]['beauty'])
except:
print(pic_json['error_msg'])
"""
pic not has face
图片识别不到人脸
"""
if __name__ == "__main__":
file_path = r" " # 图片链接
pic=Image.open(file_path)
plt.imshow(pic)
plt.show() # 展示图片
ak = " " # 复制的ak
sk = " " # 复制的sk
access_token = get_token(ak,sk) # 获取access_token值
face_rec(access_token, file_path) # 识别人脸
一个不普通的报错处理
Traceback (most recent call last):
File "D:\college\算法\海豚人工智能与大数据实验室\基于认知服务的人脸面部识别应用案例.py", line 49, in <module>
pic=Image.open(file_path)
File "D:\anaconda3\lib\site-packages\PIL\Image.py", line 3186, in open
raise UnidentifiedImageError(
PIL.UnidentifiedImageError: cannot identify image file '11.jpg'
gpt识别这个报错:
这个错误是因为PIL库无法识别’11.jpg’这个文件。可能的原因是文件损坏或者不是有效的图像文件。你可以尝试以下方法解决这个问题:
确保文件路径正确,文件存在且没有损坏。
使用其他图像处理库(如OpenCV)尝试打开图像。
但其实并不是,我们打印响应结果的json文件即pic_json,它显示:
{'error_code': 18, 'error_msg': 'Open api qps request limit reached'}
所以这其实是因为qps调用超限额,重新领取该服务类型全部接口的免费测试资源就可以了。
资源领取请看百度智能云申请ak、sk,获取access_token,利用接口实现人脸识别、人脸检测中的免费尝鲜部分。