一、前言
今天给大家带了的人脸识别非常简单,不需要大家了解TensorFlow,只需要对Python基本语法有一定了解。由于TensorFlow的火爆,把人脸识别再度推向我们的视线。像前段时间比较火的dee pfake,和人脸支付技术。虽然现阶段人脸识别仍有很大的争议性,但是它已经走进我们的视线当中了。很多小区在门禁系统中加入了人脸识别的功能,有些景区也添加了刷脸通道。但是对于技术的争议不是今天探讨的课题。下面开始我们的准备工作。
二、准备工作
今天是通过使用百度的SDK来实现的,首先我们要进入AI开放平台[1]。
我们选择开放能力->人脸与人体识别->人脸识别,进入后或出现下面page1的界面,点击立即使用。
点击后出现page2的界面。登录自己的账号就可以了。进去后我们会看到如下page3界面。如果没有应用就创建应用:
如果应用的话就管理应用。然后我们看到page4中几个重要的参数。分别是AppID、API Key、Secret Key。到这里我们的准备工作就完成了。初步准备工作完成了,我们还需要做一件事,就是下载人脸识别的SDK。我们可以点击page4中的服务端SDK下载Python对应的SDK,也可以使用pip下载:
代码语言:javascript复制pip install baidu-aip
接下来我们就可以着手代码的编写了。
三、实现人脸识别
使用SDK实现人脸识别非常简单,下面我会从最简单的人脸识别开始。然后识别多个人脸,再到情绪识别、年龄识别等。
3.1、人脸识别
人脸识别非常简单,首先需要我们上面申请到的3个参数:
代码语言:javascript复制# 导入需要用的模块
from aip import AipFace
# 准备AppID、API Key、Secret Key
APP_ID = '18101974'
API_KEY = 'HG5NFSFpfBiqqmBYVBpXQFKs'
SECRET_KEY = 'ytdOFrcBxZvvGlMKGtmkmpBQ6arbjupx'
# 调用人脸检测
client = AipFace(APP_ID, API_KEY, SECRET_KEY)
# 图片的类型,三种可选BASE64、URL、FACE_TOKEN
image_type = 'URL'
# 图片的url
iamge = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577292322895&di=f7fa123b95016762f1f0c3d2999328c4&imgtype=0&src=http://ww1.sinaimg.cn/large/c7b64b24jw1f7k7i3aap4j20qo1407ck.jpg'
# 识别人脸
face_data = client.detect(iamge, image_type)
在识别人脸时,我们调用了client.detect()方法,在上面的例子中,接收了两个参数。分别是image和image_type。参数详情如下:
参数名称 | 参数类型 | 参数作用 |
---|---|---|
image | string | 图片信息(总数据大小应小于10M),图片上传方式根据image_type来判断 |
image_type | string | 图片类型 BASE64:图片的base64值,base64编码后的图片数据,编码后的图片大小不超过2M;URL:图片的 URL地址( 可能由于网络等原因导致下载图片时间过长);FACE_TOKEN: 人脸图片的唯一标识,调用人脸检测接口时,会为每个人脸图片赋予一个唯一的FACE_TOKEN,同一张图片多次检测得到的FACE_TOKEN是同一个 |
可以看到,image_type可以为三种值,这里我们选用url的方式。
其返回的为json数据,具体数据就不给大家展示了,其结构如下和image链接的图片如下:
其中,左边为image链接的图片。虽然很漂亮,但是这不是我们研究的重点,我们把视线转移到右边这段冷冰冰的文字,我选取几个重要参数和大家说一下:
参数名称 | 参数类型 | 参数作用 |
---|---|---|
face_list | array | 人脸信息列表 |
face_probability | double | 人脸置信度,范围【0~1】,代表这是一张人脸的概率,0最小、1最大。 |
location | array | 人脸的位置 |
left | double | 人脸区域离左边界的距离 |
top | double | 人脸区域离上边界的距离 |
width | double | 人脸区域的宽度 |
height | double | 人脸区域的高度 |
rotation | int64 | 人脸框相对于竖直方向的顺时针旋转角,[-180,180] |
face_num | int | 人脸的个数 |
从上面的数据中,我们可以获取人脸的位置。我们可以将检测到的人脸裁剪下来,这就需要用的Pillow模块了。其安装如下:
代码语言:javascript复制pip install pillow
Pillow模块的一些简单操作可以看看这篇博客[2],因为我们只使用截图功能所以还是非常简单的。我们在上面的基础上加如下代码:
代码语言:javascript复制# 从Pillow中导入Image模块
from PIL import Image
import urllib
# 将image保存到本地文件
resp = urllib.request.urlopen(image_url)
f = open('im.jpg', 'wb')
f.write(resp.read())
# 使用Image模块,打开刚刚保存的图像
im = Image.open('im.jpg')
# 获取face_data中人脸的位置
left = face_data['result']['face_list'][0]['location']['left']
top = face_data['result']['face_list'][0]['location']['top']
width = face_data['result']['face_list'][0]['location']['width']
height = face_data['result']['face_list'][0]['location']['height']
# 截取人脸
face_im = im.crop((left, top, left width, top height))
face_im.save('face_im.jpg')
代码执行后截取的face_im.jpg如下:
上面这段代码有许多不严谨的地方,因为现在是简单的实现功能,所以没太在意。接下来我们实现更复杂的人脸识别,虽然在技术上要复杂的多,但是在代码上却没有什么太多的添加。
3.2、多人脸识别
也非常简单,我们执行上面代码,发现即使我们识别多人脸的图片,face_num依旧是1。这并非是识别失败,而是由一个参数决定的,即 max_face_num。其类型为string,默认值为1,所以我们只能识别一个人脸,我们将 识别人脸代码修改如下:
代码语言:javascript复制# 类型依旧是URL
image_type = 'URL'
# 一张包含多个人脸的image
image = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577296093031&di=f88c884ea4440935055c704fd20c0549&imgtype=0&src=http://5b0988e595225.cdn.sohucs.com/images/20180209/3a8e9aca0b8c481298246a26451bf242.jpeg'
# 准备参数
options = {}
options['max_face_num'] = '4'
# 识别人脸,比之前多了个options,options为字典类型
face_data = client.detect(image, image_type, options)
我们修改后,face_data将最多返回四个人脸数据。所以我们需要多face_list进行遍历:
代码语言:javascript复制# 将url中的图片保存到本地
resp = urllib.request.urlopen(image_url)
f = open('im.jpg', 'wb')
f.write(resp.read())
# 打开图片
im = Image.open('im.jpg')
# 用于区分图片
n = 0
# 遍历face_list
for i in face_data['result']['face_list']:
n = 1
left = i['location']['left']
top = i['location']['top']
width = i['location']['width']
height = i['location']['height']
# 截图并保存
face_im = im.crop((left, top, left width, top height))
face_im.save('face_im' str(n) '.jpg')
执行上面代码后我们截取到如下几个人脸(左边为原图,右边为人脸):
因为设置max_face_num为4,所以检测到了四张人脸。
3.3、情绪识别
识别情绪也非常简单,我们在传入参数时再添加如下参数:
代码语言:javascript复制# 准备参数
options = {}
options['face_field'] = 'expression'
在添加该参数后,返回数据中,face_list下多了参数 expression 。具体结构如下:
我们识别其中蓝色的即为识别出来的情绪。
除此之外,我们还可以识别性别、年龄、颜值、是否带眼睛、单双眼皮、情绪等...更详细的内容可以参考其官方文档Python-SDK[3]
四、总结
除了上面这些简单操作外,SDK还提供了更加复杂的人脸服务。像人脸注册、人脸更新、身份验证等功能,这种面向企业的应用,个人认为还是不要过度依赖。无止境的广告短信,莫名其妙的推销电话,这些都是信息泄露的后果。在大数据时代,人类没有隐私可言。即使是对于软件行业的人来说,很多东西依旧是无可奈可。所以我们需要多加注意,对自己的隐私多留一份心。
References
[1]
AI开放平台: https://ai.baidu.com/
[2]
这篇博客: https://blog.csdn.net/ZackSock/article/details/103648643
[3]
Python-SDK: https://ai.baidu.com/ai-doc/FACE/ek37c1qiz