利用百度人脸识别API和pyqt5实现基于人脸识别的可视化课堂签到管理系统
一、项目介绍
基于人脸识别的课堂签到管理系统
二、概要设计
工程项目:基于人脸识别的课堂签到管理系统
分为:三个阶段
1.定义阶段
可行性分析
技术可行性
成本可行性:自底向上估价
开发评估成本
开发的时间周期,开发的人力
10天 3-4人
收益评估成本
需求分析:
a、摄像头进行人脸检测
b、人脸比对判断
c、人脸库
d、人脸库添加、删除
e、数据库保存
f、导出签到数据
2.开发阶段
概要设计:规定接口,模块功能的组成
详细设计:对每一个功能的实现流程进行设计
实现:对详细设计的功能进行代码实现
测试 :测试功能的正确性,稳定性
3.运行维护阶段
交付客户,上线运营
维护软件正常工作运行状态,进行版本更新
采用pyqt5作为界面开发
1、设计界面程序
pyqt5designer.exe打开ui界面设计工具,进行界面设计
a、创建项目,选择对应的虚拟解释环境
b、使用qt的工具,创建一个界面
在下方找到terminal—》pyqt5deisgner.exe
qt的界面设计
c、把界面UI文件添加到项目中,作为项目文件
d、把ui界面转换成python文件的界面程序
python只会解释.py文件,在项目中就不认识.ui
需要把.ui转换成.py
pyuic5 源UI文件.ui -o 目标文件.py
e、创建一个新的类,继承ui类与基础界面类
在新的类中既有设计的ui类中的界面内容,也有基础界面类(窗口类)显示等操作
三、实现效果
能够实现管理学生人脸签到的系统
分析:
1、摄像头进行人脸检测
关键代码:
def detect_face(self, base64_image):
# 发送请求的地址
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/detect"
# 请求参数是一个字典,在字典中存储了,百度AI要识别的图片信息,要识别的属性内容
params = {
"image": base64_image, # 图片信息字符串
"image_type": "BASE64", # 图片信息的格式
"face_field": "gender,age,beauty,expression,face_shape,glasses,emotion,mask", # 请求识别人脸的属性,各个属性在字符串中用','逗号隔开
"max_face_num": 10,
}
# 访问令牌
access_token = self.access_token
# 把请求地址和访问令牌组成可用的网络请求地址
request_url = request_url + "?access_token=" + access_token
# 参数,设置请求的格式体
headers = {
'content-type': 'application/json'}
# 发送网络post请求,请求百度AI进行人脸检测,返回检测结果
# 发送网络请求,就会等待一段时间,程序就在这里阻塞执行
response = requests.post(request_url, data=params, headers=headers)
if response:
data = response.json()
if data['error_code'] != 0:
self.transmit_data.emit(data)
self.search_data.emit(data['error_msg'])
return
if data['result']['face_num'] > 0:
self.transmit_data.emit(dict(data))
self.face_search()
实现效果:
通过百度API返回人脸的一些信息
2、人脸识别判断
关键代码:
def face_search(self):
list = self.getlist()
grouplist = list[‘result’][‘group_id_list’]
request_url = “https://aip.baidubce.com/rest/2.0/face/v3/search”
params = {
“image”: self.base64_image,
“image_type”: “BASE64”,
“group_id_list”: “class3” # 从哪些组中进行人脸识别
}
access_token = self.access_token
request_url = request_url + “?access_token=” + access_token
headers = {‘content-type’: ‘application/json’}
response = requests.post(request_url, data=params, headers=headers)
if response:
data = response.json()
if data[‘error_code’] == 0:
if data[‘result’][‘user_list’][0][‘score’] > 90:
# -------显示到窗口------- #
# 存储要保存的签到数据,方便进行显示
del(data['result']['user_list'][0]['score'])
datetime = QDateTime.currentDateTime()
datetime = datetime.toString()
data['result']['user_list'][0]['datetime'] = datetime
key = data['result']['user_list'][0]['group_id'] + data['result']['user_list'][0]['user_id']
if key not in self.sign_list.keys():
self.sign_list[key] = data['result']['user_list'][0]
print(self.sign_list[key])
group1 = self.sign_list[key]['group_id']
user_id = self.sign_list[key]['user_id']
name = self.sign_list[key]['user_info'][5:9]
time = self.sign_list[key]['datetime']
self.insert_stu(user_id, name, group1, time)
# ---------------------- #
self.search_data.emit("签到成功\n学生信息:\n"+data['result']['user_list'][0]['user_info'])
else:
self.search_data.emit("未注册人脸信息")
实现效果:
通过调用百度人脸识别的API搜索比对人脸库里已经录入的人脸信息,根据匹配程度返回识别结果,成功返回为签到成功并输出人脸信息
3、人脸库管理
关键代码:
def add_group(self):
# 打开对话框,进行输出用户组