上节回顾
我们完成了图片识别部分的学习!
在过去的几天学习中,我们了解了 像素、 分辨率等图像的概念与 深度学习、 卷积神经网络等图像识别方法。
从今天开始,我们将进入图形识别中一类特定的分支——人脸识别。我们的目的是能够利用Python快速实现一个具有人脸识别功能的程序。今天,先让我们了解下人脸识别技术的应用方向以及实现原理。
人脸识别的概念
首先是人脸识别的概念。
关于人脸识别的概念没有一个严格的定义,一般有狭义与广义之分。
生物信息识别认证
狭义的表述上,认为人脸识别是通过比较人脸视觉特征信息为手段的一种身份验证技术。
它的应用场景与我们所熟知的指纹识别、虹膜识别等技术相同,是一种利用生物信息识别进行身份认证的技术。
广义的人脸识别
人脸图像采集
人脸图像采集包含了人脸检测、五官定位、人脸属性识别等操作。
1. 人脸检测
识别图像中的人脸区域并给出人脸区域的矩形坐标,是人脸识别的基础功能。
2. 五官定位
若要实现类似于“美颜”、“脸部卡通特效”等更精准的脸部修改,需要程序在检测到人脸的同时,精准定位出五官的位置。
3. 人脸属性识别
若要对识别到的人脸进行更深层次的分析,比如判断“年龄”、“颜值”等信息,我们需要对脸部信息进行属性预测。
人脸搜索
检测两张图片中的人脸,并判断他们是否为同一人的过程,称为人脸对比。
在多个图像中,通过人脸信息找到对应的人,这个过程称为人脸搜索。
这些功能主要应用于身份验证、安防系统等,如天眼系统、Face_id等。
我们需要通过机器来分析识别,检测出人脸的位置信息、并精准标记出每个五官的位置。
根据识别后的数据,程序还可以对人脸信息进行年龄预测功能。一起来执行代码,尝试一下吧~
示例代码:
from aip import AipFace
""" 你的 APPID AK SK """
APP_ID = '10252021'
API_KEY = 'ZHe7788sh11GEjIAdEKeY'
SECRET_KEY = 'JMMzHe7788BUSH1ZhEnM1YUEhh'
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
import base64
def get_img(path):
with open(path, "rb") as f:
res = f.read()
img = base64.b64encode(res)
return img
""" 如果有可选参数 """
options = {}
options["face_field"] = "age,quality,landmark150"
options["max_face_num"] = 10
# img_path = "img/girl_face 1.png"
img = str(get_img(img_path), 'utf-8')
""" 带参数调用人脸检测 """
ret_data = client.detect(img, "BASE64", options)
print(ret_data)
from PIL import ImageDraw, Image, ImageFont
# 创建画布
with Image.open(img_path) as img:
img_cp = img.copy().convert('RGB')
draw = ImageDraw.Draw(img_cp)
font = ImageFont.truetype('img/yahei_consola.ttf', img_cp.size[0] * 1 // 30)
r_size = img_cp.size[0] / 730
if ret_data['result']:
for face_dict in ret_data['result']['face_list']:
r = list(face_dict['location'].values())
left, top, width, height = r[:4]
age = face_dict['age']
face_qa = face_dict['quality']['occlusion']
markpoint = []
for pos in face_dict['landmark150'].values():
x = pos['x']
y = pos['y']
xy = (x, y)
markpoint.append(xy)
draw.point(markpoint, (0, 255, 255))
for i in markpoint:
x, y = i
r = r_size
draw.ellipse([(x-r, y-r), (x+r, y+r)], fill=(0, 255, 255))
draw.rectangle((left, top, left+width, top+height), outline=(0, 255, 0), width=1)
draw.text((left + 5, top+height), '预测年龄为'+str(age)+'岁', fill=(0, 255, 255), font=font, align="left")
img_cp.save('/User/out.png')
else:
print('人脸识别失败!')
结果:
人脸搜索的作用是在多个图像中,找出指定的面孔;年龄、颜值等信息通过获取人脸属性来判断,而不是人脸搜索。
人脸识别的原理
你是如何对毕业照中不同的面孔进行识别、区分的呢?对于程序来说,又是如何做到的呢?
在多数情况下,我们通过图像或视频来获取人脸数据。所以与图像识别的原理相同,人脸识别需要依靠深度学习与卷积神经网络来实现。
以人脸检测为例
人脸检测是人脸识别系统中最基础的功能,它要求机器能够从画面中定位人脸的位置。
我们以它为例,来看一下机器在对人脸进行检测的过程中,做了哪些事情。
人脸检测过程
图案:由简单图形构成
花把:由1组成,空白由0组成
人脸识别也是如此
破案了,原来机器会把图像拆分成多个部分进行对比、识别与判断。
判断的图案越复杂,程序的计算量就会越大,获取结果的时间也就越长。
所以在执行这一过程时,往往会使用计算能力更强的显卡(GPU)实现,硬件要求更高,成本更大。
好消息是,利用一些第三方接口,即API,能够让我们更小成本的实现人脸识别的过程。
接下来,让我们利用API帮助小叶实现“口罩佩戴检测”系统。
项目:
背景:疫情期间,利用人脸识别技术,督促乘客带口罩
步骤:根据小叶的需求,我们将“口罩佩戴检测”系统的过程分为下面四个步骤。
1. 获取具有人脸识别功能的接口;
2. 对图像进行人脸检测;
3. 在图中标记人脸区域;
4. 口罩佩戴情况监测;
今天让我们先来完成第一步~
1. 获取具有人脸识别功能的接口;
使用现有的接口
为了降低学习其它API的时间与安装成本,在这里我们依旧选择百度AI平台。
我们可以在平台控制台 中的【产品服务】找到【人脸识别】板块,它提供了人脸识别所需的各种接口。
在平台中创建程序
进入【人脸识别】页面以后,我们需要通过【去创建】功能,创建一个私人使用的人脸识别应用。
在【创建应用】页面:
1. 为你的应用设定名称;
2. 领取接口的免费额度;
3. 对应用进行简短的描述;
4. 填写完毕后,选择【立即创建】完成操作。
查看密钥与文档
创建成功后,通过【查看应用详情】可以获得该接口的授权密钥。
通过【查看文档】可以获得该接口的官方使用说明文档。
拿到了程序密钥后,接下来我们就可以在Python程序中创建一个提供人脸识别功能接口的客户端。
Ps:
AipFace是人脸识别的Python SDK客户端,它为使用人脸识别的开发人员提供了一系列的功能方法。这些方法包括但不限于人脸检测、人脸对比、人脸搜索等功能,只要安装了baidu-aip,即可使用。
创建一个人脸识别客户端,我们需要执行3个步骤。
第1步,从aip中导入AipFace类;
第2步,以字符串的形式,存储人脸识别应用的密钥信息;
第3步,将密钥信息传递给AipFace生成客户端,并存储在client中。
现在给定人脸识别的应用密钥为:
app_id:10252021
api_key:ZHe7788sh11GEjIAdEKeY
secret_key:JMMzHe7788BUSH1ZhEnM1YUEhh(每个人的都不一样)
试着在右边的编辑器中创建一个人脸识别客户端。
示例代码:
# 导入AipFace类
from aip import AipFace
# 以字符串的形式存储密钥
APP_ID = '10252021'
API_KEY = 'ZHe7788sh11GEjIAdEKeY'
SECRET_KEY = 'JMMzHe7788BUSH1ZhEnM1YUEhh'
# 将密钥信息传递给AipFace生成客户端,并将结果存储在client中
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
下节预告
在今天的课程中,通过创建AipFace,我们完成了开发“口罩佩戴检测”系统的第一步。
在下节课中,我们将通过AipFace提供的人脸检测detect方法,实现项目的第二部:
对图像进行人脸检测。