《百度AI人脸识别与检测》专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统;主要用到的技术有百度开放平台中的人脸检测、人脸识别、Python图形界面开发PyQt5、线程的管理、以及通过python调用百度接口实现人脸检测、百度开放平台中人脸检测技术文档的理解等,由浅入深、由局部到整体的一个项目学习过程,如果你想对人脸识别感兴趣,对python的图形界面设计感兴趣,可以订阅本专栏,因为对你可能有帮助哦!
前文参考:
百度AI人脸识别与检测一:学生人脸识别签到系统简介及百度AI开放平台账号注册和人脸实例应用创建
百度AI人脸识别与检测二:学生人脸识别打卡签到系统主界面功能需求和设计以及通过Python实现界面运行
百度AI人脸识别与检测三:学生人脸识别打卡签到系统通过OpenCV实现电脑摄像头数据在Label控件上的实时显示
百度AI人脸识别与检测四:学生人脸识别打卡签到系统之百度AI人脸检测及相应程序异常处理
百度AI人脸识别与检测五:学生人脸识别打卡签到系统之百度AI人脸识别
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查
百度AI人脸识别与检测七:学生人脸识别打卡签到系统之学生人脸信息的添加
百度AI人脸识别与检测八:学生人脸识别打卡签到系统之删除学生人脸及信息
百度AI人脸识别与检测九:学生人脸识别打卡签到系统之学生相关信息查询
上次博客,林君学长带大家了解了如何通过百度开放平台的相关知识实现学生人脸识别打卡签到系统中的学生信息查询模块,并且展示效果还比较棒,而本次博客,学长将带大家实现学生人脸识别打卡签到系统的最后一个模块,也就是查看学生的基本签到信息,主要包括签到时间、签到人的基本信息等等,然后就是可以将签到的基本信息导出到本地PC的文件系统中进行签到信息的存储。
本章内容结束,《百度AI人脸识别打卡签到系统》系列文章就结束最后的旅程了,希望各位小伙伴在进行对本专栏文章的阅读时候,可以了解到如何使用百度AI开放平台的有关功能接口,同时了解PyQt5是如何正确的使用的。该专栏的分享就到这里了!
百度AI人脸识别与检测十:学生人脸识别打卡签到系统之如何查看学生签到信息?
一、学生签到UI设计
对于如何查看学生签到信息的UI设计,首先我们得进行功能作用的分析,在什么时候,通过什么手段达到什么样的目的,在目的明确的基础之上,在进行学生签到信息查看的UI设计。
1、功能分析
(1)、对于查看学生签到信息表主要是对学生签到情况做一个统计,方便有关人员进行相应的查看。学生签到信息主要包括学生学号、姓名、班级以及签到时间并且可以提供导出为Excel文档表格的功能。那么为了拥有这个信息,我们应该如何取通过代码构建相关功能,这首先是我们需要理解的。
(2)、我们首要明确的是,对于学生签到UI肯定是一个新的界面,而学生签到信息的显示是放在我们之前创建的线程中获取的到结果,如下图所示:
因此,我们首先应该在上图提到的功能模块中将获取到的学生数据信息传递到我们新建立的UI之中,并且在新建的UI之中进行签到数据的显示。
(3)、其次,我们需要知道的是,在点击开始签到的时候,对已知的人脸如果识别到,就应该要进行数据的添加;而在点击结束签到的时候,签到学生的有关信息就应该在新建UI中显示出来,而新建UI应该立即通过弹窗的形式弹出。
(3)、再以上需求的分析基础之上,我们就可以来进行学生签到信息查看UI的基本设计了
2、学生签到信息查看UI设计
对于pyqt5designer的UI设计,必要的是考虑页面应该如何进行布局,在确定总体布局的基础之上,联合其他布局进行嵌入式结构布局。
(1)、打开pyqt5designer.exe工具,新建Dialog,建议命名为find_information.ui
(2)、通过需求,选择合适控件,进行嵌入式的合理布局,林君学长的布局如下所示:
以上控件选择Table Widget和按钮
(3)、在pycharm终端将设计的UI文件转为可解释执行的py文件
pyuic5 find_information.ui -o find_information.py
3、初始化学生签到信息窗口
(1)、在项目中新建名为find_information_window.py的文件,作为窗口的初始化文件,内容如下所示:
from PyQt5.QtWidgets import QDialog
from find_information import Ui_Dialog
class find_information_window(Ui_Dialog,QDialog):
def __init__(self,sign_data,parent=None):
super(find_information_window,self).__init__(parent)
self.setupUi(self)
self.sign_data = sign_data#接收签到数据
(2)、关闭签到的时候,应该弹出该UI界面,因此,在function_window.py文件的关闭签到方法中,应该绑定该界面的弹窗。
#显示本次签到情况,弹出弹窗
self.sign = find_information_window([], self)#传递数据暂时为空
self.sign.exec_()
运行程序,打开签到后关闭,则弹窗弹出,如下所示:
通过以上步骤,学生签到信息弹窗的UI及调用就设置完成,接下来,我们需要完成其需要的功能,具体步骤如下。
二、学生签到信息基本功能实现
1、显示签到数据
(1)、在detect.py线程中,定义变量,存储学生签到的基本信息,如下所示:
# 字典用来存储签到数据
sign_data_list = {}
位置如下所示:
(2)、完善detect.py线程文件中的人脸识别方法face_search,使得将签到得到的数据以及时间存储在sign_data_list变量中。
# 人脸识别搜索检测,只识别一个人
def face_search(self):
request_url = "https://aip.baidubce.com/rest/2.0/face/v3/search"
params = {
"image": self.imageData,
"image_type": "BASE64",
"group_id_list": "class1",
}
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_msg'] == 'SUCCESS':
if data['result']['user_list'][0]['score'] > 90: #大于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_data_list.keys():
self.sign_data_list[key] = data['result']['user_list'][0]
list1 = [data['result']['user_list'][0]['user_id'],data['result']['user_list'][0]['group_id']]#去除名字和班级
self.transmit_data1.emit("学生签到成功\n学生信息如下:\n" + "姓名:" + list1[0] + "\n" + "班级:" + list1[1])#将信号发送给主线程
(3)、在function_window.py文件中的停止签到方法中,将上面打开窗口调用的参数变量修改为变量 sign_data_list
#显示本次签到情况,弹出弹窗
self.sign = find_information_window(self.detect.sign_data_list, self)#传递数据暂时为空
self.sign.exec_()
(4)、在find_information_window.py文件中,将主界面中线程传递过来的变量中的数据进行显示,将数据显示到我们的table widget表格上面,添加代码如下所示:
from PyQt5.QtWidgets import QDialog, QAbstractItemView, QTableWidgetItem, QHeaderView
from find_information import Ui_Dialog
class find_information_window(Ui_Dialog,QDialog):
def __init__(self,sign_data,parent=None):
super(find_information_window,self).__init__(parent)
self.setupUi(self)
self.sign_data = sign_data#接收签到数据
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)#设置表格不可更改
#设置表格为指定长度
self.tableWidget.setColumnWidth(0, 110)
self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)
self.tableWidget.setColumnWidth(1, 55)
self.tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.Fixed)
self.tableWidget.setColumnWidth(2, 45)
self.tableWidget.horizontalHeader().setSectionResizeMode(2, QHeaderView.Fixed)
self.tableWidget.setColumnWidth(3, 180)
for i in self.sign_data.values():
row=self.tableWidget.rowCount()
self.tableWidget.insertRow(row)
self.tableWidget.setItem(row,0,QTableWidgetItem(i['user_id']))
self.tableWidget.setItem(row,1, QTableWidgetItem(i['user_info']))
self.tableWidget.setItem(row,2, QTableWidgetItem(i['group_id']))
self.tableWidget.setItem(row,3, QTableWidgetItem(i['datetime']))
self.tableWidget.resizeColumnToContents(4)
签到后显示的结果便如下所示:
2、实现Excel的导出
(1)、在find_information_window.py文件末尾增加导出为Excel文件的方法,方法名可以命名为:export,具体代码内容如下所示:
#表格数据导出
def export(self):
#打开保存文件弹窗
try:
path, ret = QFileDialog.getSaveFileName(self, "选择导出文件路径", ".", "文件格式(*.xls)")
row = self.tableWidget.rowCount() # 获取行
column = self.tableWidget.columnCount() # 获取列
# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个表的名称,不是文件名称
worksheet = workbook.add_sheet('学生签到信息')
for j in range(column):
table = self.tableWidget.horizontalHeaderItem(j).text() # 获取表头
worksheet.write(0, j, table) # 写入表头
for i in range(row):
for j in range(column):
data = self.tableWidget.item(i, j).text() # 获取签到数据
# 写入excel 参数对应 行, 列, 值
worksheet.write(i + 1, j, data) # 写入签到数据
# 保存
workbook.save(path)
QMessageBox.about(self, "提示", "数据导出成功!")
self.accept()
except:
QMessageBox.about(self, "提示", "数据导出异常!")
(2)、将“导出为Excel”按钮进行事件绑定,绑定到方法export
self.pushButton_2.clicked.connect(self.export)#绑定按钮事件为导出为Excel
位置如下:
(3)、将取消按钮也进行事件绑定,绑定后find_information_window.py文件内部如下所示:
import xlwt
from PyQt5.QtWidgets import QDialog, QAbstractItemView, QTableWidgetItem, QHeaderView, QFileDialog, QMessageBox
from find_information import Ui_Dialog
class find_information_window(Ui_Dialog,QDialog):
def __init__(self,sign_data,parent=None):
super(find_information_window,self).__init__(parent)
self.setupUi(self)
self.sign_data = sign_data#接收签到数据
self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)#设置表格不可更改
#设置表格为指定长度
self.tableWidget.setColumnWidth(0, 110)
self.tableWidget.horizontalHeader().setSectionResizeMode(0, QHeaderView.Fixed)
self.tableWidget.setColumnWidth(1, 55)
self.tableWidget.horizontalHeader().setSectionResizeMode(1, QHeaderView.Fixed)
self.tableWidget.setColumnWidth(2, 45)
self.tableWidget.horizontalHeader().setSectionResizeMode(2, QHeaderView.Fixed)
self.tableWidget.setColumnWidth(3, 180)
for i in self.sign_data.values():
row=self.tableWidget.rowCount()
self.tableWidget.insertRow(row)
self.tableWidget.setItem(row,0,QTableWidgetItem(i['user_id']))
self.tableWidget.setItem(row,1, QTableWidgetItem(i['user_info']))
self.tableWidget.setItem(row,2, QTableWidgetItem(i['group_id']))
self.tableWidget.setItem(row,3, QTableWidgetItem(i['datetime']))
self.tableWidget.resizeColumnToContents(4)
self.pushButton_2.clicked.connect(self.export)#绑定按钮事件为导出为Excel
self.pushButton.clicked.connect(self.closewindow)#取消按钮事件绑定为取消方法
#表格数据导出
def export(self):
#打开保存文件弹窗
try:
path, ret = QFileDialog.getSaveFileName(self, "选择导出文件路径", ".", "文件格式(*.xls)")
row = self.tableWidget.rowCount() # 获取行
column = self.tableWidget.columnCount() # 获取列
# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding='utf-8')
# 创建一个表的名称,不是文件名称
worksheet = workbook.add_sheet('学生签到信息')
for j in range(column):
table = self.tableWidget.horizontalHeaderItem(j).text() # 获取表头
worksheet.write(0, j, table) # 写入表头
for i in range(row):
for j in range(column):
data = self.tableWidget.item(i, j).text() # 获取签到数据
# 写入excel 参数对应 行, 列, 值
worksheet.write(i + 1, j, data) # 写入签到数据
# 保存
workbook.save(path)
QMessageBox.about(self, "提示", "数据导出成功!")
self.accept()
except:
QMessageBox.about(self, "提示", "数据导出异常!")
#取消按钮
def closewindow(self):
self.close()
3、学生签到信息查看演示
(1)、运行程序,开始签到,签到相关,签到成功后点击停止签到
(2)、点击导出为Excel,并且选择存放文件目录,并且命名后点击保存
(3)、保存成功后,查看本地保存的Excel文件,打开如下:
到这里,《百度AI人脸识别与检测》系列专栏中的最后一个版块就实现了,下面我们来回顾一下该项目中,通过这十章的学习,我们完成了一些什么功能,做一个整体项目的展示,看下面的步骤吧!
三、整体项目及展示
1、整体项目源代码资源下载链接
2、学生人脸识别打卡签到系统整体展示
(1)、系统主界面
(2)、学生人脸检测及学生人脸识别信息展示
(3)、班级的增加、删除、查询
(4)、学生信息的增加、删除、查找
(5)、学生签到信息导出
以上就是《百度AI人脸检测与识别》整个专栏的项目了,该专栏到这里也结束了,对于百度AI开放平台的相关模块使用就告一段落了。希望各位小伙伴通过对本专栏中学生人脸识别打卡签到系统的学习,可以明白百度AI智能云的访问规则和使用方法,可以理解如何通过PyQt5中的有关控件实现相关功能,同时也能在项目学习中得到如何将项目从零到一逐步搭建框架,完成功能需求。总之,该专栏完结了,我们下一专栏见!如果阅读有收获,记得准时关注、收藏、转发、评论、点赞哦!
以上就是本次博客系列专栏的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!我们其他内容领域见!
工作单位培训结束,在最后阶段竟然获得了一个优秀奖,哈哈 别提自己有多开心了,在有限的日子里,获得这么多的友谊,这么多的小伙伴,同时也学到这么多的知识,对自己来说是非常开心的,总之,入职第一份工作的入职培训给了自己很大程度上的鼓励,希望以后自己的职业道路一帆风顺吧!
陈一月的又一天编程岁月^ _ ^