利用树莓派开发板以及现有的摄像头,通过调用百度智能云的API接口进行人脸识别对比完成了整个过程实现简易的人脸识别门禁系统,并通过server酱平台,向相应的URL发送一个POST或者GET请求完成了对开门者信息推送到主人微信上的一个功能。通过多次的测试与后台上的数据分析,本设计识别速度快、准确率高,对于未来人脸识别门禁系统的实现有一定的意义。
1.百度智能云
百度智能云是百度旗下面向企业、开发者和政府机构的智能云计算服务商,致力于为各行业提供以ABC(人工智能、大数据、云计算)技术为一体的平台服务。对于开发者而言,灵活利用其提供的大量模块化接口,可快速完成相关的开发,大大缩短开发周期。
人脸识别门禁系统也正借用了百度智能云所提供的人脸识别的开发平台,通过调用其API接口,树莓派将通过摄像头录入的人脸传输到百度智能云到提前录入的人脸库中搜索,若有相对应的人脸则开门,否则处于关门的状态。
通过申请好的百度账号登入百度智能云,并在百度智能云中创建好我们个人所需的应用——人脸识别。如下图即为我为人脸识别所创建的一个应用——门禁识别。
下载SDK
创建完毕后,下载SDK文档,因为是在树莓派中运行,所以选中python HTTP SDK下载到本地,并在后续中导入到树莓派中,后续需要使用。
查看应用详情,记录下AppID、API Key和Secret Key,在后面的代码中会用到这些参数,并通过这些参数将树莓派与百度智能云建立有效连接,成果进入到人脸库中搜索人脸
在人脸库管理中新建用户组,再从用户组中新建人脸id和照片。在本次实验室为提高准确率上传了本人三张照片。
添加上去就行了,这就不放图了。。。
配置树莓派
将上一小节中提到的SDK文件,传输到树莓派的文件目录下,然后cd进入该目录,安装pip以及setuptools,安装过程此处忽略。
在安装好pip以及setuptools之后,cd到传输至树莓派中的SDK文件下,安装baidu-aip,执行以下命令即可:
pip install baidu-aippython setup.py install
至此树莓派的环境配置完成。
设计拍照
本次设计拍照功能的实现使用的是python中的picamera模块来控制操作树莓派的摄像头,它为 Raspberry Pi 的相机模块提供纯 Python 接口。使用capture()方法捕获图像,使用start_recording() 方法开始录制视频,或使用start_preview()方法开始实时显示摄像机的输入,使用camera.resolution = (a, b)设置图像大小的尺寸。
设计的拍照代码如下:
获取acess_token和API
用了一个软件(post),按照下面输进去就可以了
grant_type:必须参数,固定为client_credentials;client_id:必须参数,应用的API Key(前面提到的);client_secret:必须参数,应用的Secret Key。通过POST输入上述参数即可得到我们所需要的access_token,将得到的access_token带入到下图代码中即可得到我们所需的API。
向服务器申请access_token,并拼接至request_url,request_url即为申请API接口时得到的人脸对比请求地址。
人脸识别测试
以上导入的照片依然是本人的照片,由以上结果可以看出识别率比较高测试结果比较可信。
介绍到这就差不多了,下面就是还有一个微信推送
推荐一个特别好用的平台,Sever酱,
Sever酱对于每一个用户都设置了一个SCKEY码,该码是独一无二的每一个用户有且仅有一个,发送消息也比较简单只需要向以下URL发一个GET或者POST请求,它主要接收两个参数,text(发送内容)和desp(标题),比如要向我自己发送一个消息:
https://sc.ftqq.com/SCU178916Ta7fe4a659a31bb6766fd4fd5bfbc867460cdc24f25a69.send?text=你好呀~
所以我们想使用python编译发送消息,只需要接用urllib.request.urlopen()模块即可。其主要是用于打开一个远程的url连接,并且向这个连接发出请求,获取响应结果,返回的结果是一个http响应对象,这个响应对象中记录了本次http访问的响应头和响应体。
测试结果
from aip import AipFace
from picamera import PiCamera
import urllib.request
import RPi.GPIO as GPIO
import base64
import time# 百度人脸识别API账号信息
APP_ID = '替换成你的'
API_KEY = '替换成你的'
SECRET_KEY = '替换成你的'
client = AipFace(APP_ID, API_KEY, SECRET_KEY) # 创建一个客户端用以访问百度云
# 图像编码方式
IMAGE_TYPE = 'BASE64'
camera = PiCamera() # 定义一个摄像头对象
# 用户组
GROUP = 'yusheng01'# 照相函数
def getimage():camera.resolution = (1024, 768) # 摄像界面为1024*768camera.start_preview() # 开始摄像time.sleep(2)camera.capture('faceimage.jpg') # 拍照并保存time.sleep(2)# 对图片的格式进行转换
def transimage():f = open('faceimage.jpg', 'rb')img = base64.b64encode(f.read())return img# 上传到百度api进行人脸检测
def go_api(image):result = client.search(str(image, 'utf-8'), IMAGE_TYPE, GROUP); # 在百度云人脸库中寻找有没有匹配的人脸if result['error_msg'] == 'SUCCESS': # 如果成功了name = result['result']['user_list'][0]['user_id'] # 获取名字score = result['result']['user_list'][0]['score'] # 获取相似度if score > 80: # 如果相似度大于80if name == 'yusheng_02':print("欢迎%s !" % name)time.sleep(3)if name == 'xiaoming':print("欢迎%s !" % name)time.sleep(3)if name == "xiaoyu":print("欢迎%s !" % name)else:print("对不起,我不认识你!")name = 'Unknow'return 0curren_time = time.asctime(time.localtime(time.time())) # 获取当前时间# 将人员出入的记录保存到Log.txt中f = open('Log.txt', 'a')f.write("Person: " + name + " " + "Time:" + str(curren_time) + '\n')f.close()return 1if result['error_msg'] == 'pic not has face':print('检测不到人脸')time.sleep(2)return 0else:print(result['error_code'] + ' ' + result['error_code'])return 0# 主函数
if __name__ == '__main__':while True:print('准备')if True:getimage() # 拍照img = transimage() # 转换照片格式res = go_api(img) # 将转换了格式的图片上传到百度云if (res == 1): # 是人脸库中的人print("开门")else:print("关门")print('稍等三秒进入下一个')time.sleep(3)
运行成功了!✌