百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查

《百度AI人脸识别与检测》专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统;主要用到的技术有百度开放平台中的人脸检测、人脸识别、Python图形界面开发PyQt5、线程的管理、以及通过python调用百度接口实现人脸检测、百度开放平台中人脸检测技术文档的理解等,由浅入深、由局部到整体的一个项目学习过程,如果你想对人脸识别感兴趣,对python的图形界面设计感兴趣,可以订阅本专栏,因为对你可能有帮助哦!

前文参考:

百度AI人脸识别与检测一:学生人脸识别签到系统简介及百度AI开放平台账号注册和人脸实例应用创建
百度AI人脸识别与检测二:学生人脸识别打卡签到系统主界面功能需求和设计以及通过Python实现界面运行
百度AI人脸识别与检测三:学生人脸识别打卡签到系统通过OpenCV实现电脑摄像头数据在Label控件上的实时显示
百度AI人脸识别与检测四:学生人脸识别打卡签到系统之百度AI人脸检测及相应程序异常处理
百度AI人脸识别与检测五:学生人脸识别打卡签到系统之百度AI人脸识别

上次博客我们讲解了如何通过阅读百度AI开放平台的API文档进行学生人脸识别打卡签到系统的的人脸识别,并完成了项目中代码的编写,将学生的人脸信息通过人脸识别模块,然后将识别到的信息在主线程中进行对应的信息显示。但是上次博客是建立在我们在百度AI开放平台上面手动创建的人脸数据库,但在实际打开签到中,这个模块功能应该在软件中实现。但这完成学生人脸信息的录入时,应该首先确定班级,添加好班级信息。因此,本次博客林君学长主要带大家了解百度API文档的用户组(班级)信息的增删查,然后在实际项目中完成班级的增删查。


百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查

  • 一、打卡系统班级添加
    • 1、创建用户组(班级)添加API文档详阅
    • 2、实现系统中班级的添加
    • 3、演示实例
  • 二、打卡系统班级查询
    • 1、创建用户组(班级)查询API文档详阅
    • 2、实现系统中班级的查询
    • 3、演示实例
  • 三、打卡系统班级删除
    • 1、创建用户组(班级)删除API文档详阅
    • 2、实现系统中班级的删除
    • 3、演示实例
  • 四、修改后的项目代码

一、打卡系统班级添加

1、创建用户组(班级)添加API文档详阅

为了实现项目中的任何部分,我们都需要通过百度API文档查询对应的资料,在文档中找到访问规格和数据返回规则,然后根据这些规则实现对应系统中的功能。
(1)、用户组(班级)创建API访问地址
百度AI开放平台之创建用户组API文档详解链接
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第1张图片
(2)访问规则Pyhton代码


# encoding:utf-8

import requests

'''
创建用户组
'''

request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add"

params = "{"group_id":"group1"}"
access_token = '[调用鉴权接口获取的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:
    print (response.json())

上面我们可以了解到,访问规则中主要需要的参数便是用户组的ID,也就是用户名,在项目中理解为班级成名,暂时百度AI开放平台只支持英文命名。

  • group_id:用户组名称

(3)、返回规则
返回信息包括正确返回和错误返回,规则如下所示:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第2张图片
因此,有了API文档的请求和返回规则,便可以开始实现项目中班级的添加了!

2、实现系统中班级的添加

(1)、在function_window.py文件末尾添加班级添加方法,具体代码如下所示:

 #添加班级
    def add_class(self):
        # 打开输入框,进行输入用户组
        group, ret = QInputDialog.getText(self, "添加班级", "请输入班级名称(由数字、字母、下划线组成)")
        if group == "":
            print("取消添加班级")
        else:
            request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add"

            params = {
                "group_id": group
            }
            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:
                print(response.json())
                message = response.json()
                if message['error_code'] == 0:#根据规则,返回0则为班级添加成功
                    QMessageBox.about(self, "班级创建结果", "班级创建成功")
                else:
                    QMessageBox.about(self, "班级创建结果", "班级创建失败")

(2)、对菜单中班级添加按钮进行事件绑定

self.actionaddclass.triggered.connect(self.add_class)#添加班级按钮事件绑定

以上按钮事件绑定的代码添加位置如下所示:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第3张图片

3、演示实例

(1)、班级添加演示实例
运行软件,点击班级信息管理中的添加班级,在跳出的弹窗中输入班级名称class2,然后点击OK。
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第4张图片
班级创建成功返回如下:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第5张图片

(2)、百度AI开放平台查看是否添加成功
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第6张图片
在开放平台中我们可以看到新添加的班级class2,目前班级里面没有成员,后面会增加!下面我们介绍删除班级!


二、打卡系统班级查询

1、创建用户组(班级)查询API文档详阅

(1)、创建用户组(班级)查询API文档链接地址:
创建用户组(班级)查询API文档链接地址
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第7张图片
(2)、用户组获取请求规则Python代码


# encoding:utf-8

import requests

'''
组列表查询
'''

request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getlist"

params = "{"start":0,"length":100}"
access_token = '[调用鉴权接口获取的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:
    print (response.json())

请求参数如下所示:请求参数并不是必须要有的,所以,可以忽略!
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第8张图片
(3)、返回参数
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第9张图片

  • group_id_list :返回获取到的用户组列表,也就是项目中获取到的班级列表

2、实现系统中班级的查询

(1)、在function_window.py文件末尾添加班级查询方法,具体代码如下所示:

 #班级查询
    def get_class(self):
        request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getlist"
        params = {
            "start":0,
            "length":100
        }
        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:
            return response.json()
    #将查询到的结果显示在MessageBOX框上面
    def display_class(self):
        list=self.get_class()
        str=''
        for i in list['result']['group_id_list']:
            str=str+'\n'+i
        QMessageBox.about(self,"班级列表",str)

以上代码包括查询和将查询结果进行显示
(2)、对菜单中查询班级按钮进行事件绑定

self.actionfindclass.triggered.connect(self.display_class)#查询班级按钮事件绑定

添加的具体位置如下所示:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第10张图片

3、演示实例

(1)、运行程序,选择菜单栏中的查询班级,然后点击,进行班级查询,查询结果如下所示:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第11张图片

可以看到,查询结果包括我们之前创建的class1以及上面创建的class2,class是学长自己之前创建的!
以上的消息显示是通过MessageBox控件进行显示的,如果小伙伴需要更美观好看一点,可以通过其他控件,或者开其他窗口进行显示!


三、打卡系统班级删除

1、创建用户组(班级)删除API文档详阅

(1)、创建用户组(班级)删除API文档链接地址
学生人脸识别打卡签到系统之班级删除API文档链接
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第12张图片
(2)、用户组删除访问规则代码详细


# encoding:utf-8

import requests

'''
删除用户组
'''

request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/delete"

params = "{"group_id":"group1"}"
access_token = '[调用鉴权接口获取的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:
    print (response.json())

同样的,我们可以看出,删除用户组同样只需要提供用户组的ID,也就是系统中所用到的班级名称

  • group_id:删除用户组需要提供的用户组id

(3)、返回规则
返回规则同样包括删除正确和错误的返回
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第13张图片
接下来,百度API文档的基础之上,让我们在系统中实现班级的删除吧!

2、实现系统中班级的删除

(1)、在function_window.py文件末尾添加班级删除方法,具体代码如下所示:

    #班级删除
    def delete_calss(self):
        #打开输入框,进行输入用户组
        list = self.get_class()#首先获取用户组信息
        group,ret=QInputDialog.getText(self, "存在的用户组", "用户组信息"+str(list['result']['group_id_list']))
        if group == "":
            print("取消删除用户组")
        else:
            request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/delete"

            params = {
                "group_id": group#要删除用户组的id
            }
            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:
                print(response.json())
                message = response.json()
                if message['error_code'] == 0:
                    QMessageBox.about(self, "用户删除结果", "用户删除成功")
                else:
                    QMessageBox.about(self, "用户删除结果", "用户删除失败")

为了方便删除,需要在删除的时候有班级列表的提示,因此在删除时候,首先应该查找一次班级列表有哪些,在已知的班级列表中输入名称进行删除
(2)、对菜单中删除班级按钮进行事件绑定

self.actiondelclass.triggered.connect(self.delete_calss)#删除班级按钮事件绑定

以上事件绑定添加的位置如下所示:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第14张图片

3、演示实例

(1)、运行软件,选择班级管理菜单栏中删除班级,在提示的列表中输入正确的班级名称,然后点击OK进行删除,如下所示:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第15张图片

我们删除刚刚创建的班级class2,删除成功后返回:
百度AI人脸识别与检测六:学生人脸识别打卡签到系统之班级的增删查_第16张图片
(2)、在百度AI开放平台上面查看班级是否删除成功,如下所示:
在这里插入图片描述
可以看到,上面创建的class2班级已经成功删除。今天的博客就到此为止啦,希望通过本次博客的阅读,学长能让大家了解到学生人脸识别打卡签到系统是如何进行班级删除的,如何完成班级删除中的模块,已经如何正确、规范性的阅读百度API文档中的相关参数和规则!

四、修改后的项目代码

由于本次只涉及到对项目中function_window.py文件进行了部分修改,因此,修改后的function_window.py文件中的全部代码如下所示:

import base64

import cv2
import requests
from PyQt5.QtCore import QTimer
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QMainWindow, QMessageBox, QInputDialog
from cameraVideo import camera
from mainWindow import Ui_MainWindow
from detect import detect_thread
class function_window(Ui_MainWindow,QMainWindow):
    '''
    初始化函数
    '''
    def __init__(self):
        super(function_window, self).__init__()
        self.setupUi(self)
        self.label.setScaledContents(True)#设置图像自适应label显示框
        self.pushButton.clicked.connect(self.open_Sign)#打开签到事件绑定
        self.pushButton_2.clicked.connect(self.close_Sign)#关闭签到事件绑定
        self.actionaddclass.triggered.connect(self.add_class)#添加班级按钮事件绑定
        self.actionfindclass.triggered.connect(self.display_class)#查询班级按钮事件绑定
        self.actiondelclass.triggered.connect(self.delete_calss)#删除班级按钮事件绑定
        self.access_token=self.get_accessToken()#获取Access_token访问令牌,并复制为全局变量
        self.start_state=True
    '''
        打开签到
    '''
    def open_Sign(self):
        if self.start_state==True:
            # 启动摄像头
            self.cameravideo = camera()
            # 启动定时器进行定时,每隔多长时间进行一次获取摄像头数据进行显示
            self.timeshow = QTimer(self)
            self.timeshow.start(10)
            # 每隔10毫秒产生一个信号timeout
            self.timeshow.timeout.connect(self.show_cameradata)
            self.detect = detect_thread(self.access_token)  # 创建线程
            self.detect.start()  # 启动线程
            # 签到500毫秒获取一次,用来获取检测的画面
            self.faceshow = QTimer(self)
            self.faceshow.start(500)
            self.faceshow.timeout.connect(self.get_cameradata)
            self.detect.transmit_data.connect(self.get_data)
            self.detect.transmit_data1.connect(self.get_seach_data)
            self.start_state=False
        else:
            QMessageBox.about(self, "提示", "正在检测,请先关闭!")

    '''
        关闭签到
    '''
    def close_Sign(self):
        if self.start_state==False:
            self.faceshow.stop()  # 计时器停止
            self.detect.ok = False  # 停止run函数运行
            self.detect.quit()  # 关闭线程
            # 关闭定时器,不再获取摄像头的数据
            self.timeshow.stop()
            self.timeshow.timeout.disconnect(self.show_cameradata)
            # 关闭摄像头
            self.cameravideo.colse_camera()
            self.start_state=True
            # 判断定时器是否关闭,关闭,则显示为自己设定的图像
            if self.timeshow.isActive() == False:
                self.label.setPixmap(QPixmap("image/1.jpg"))
                self.plainTextEdit_2.clear()
            else:
                QMessageBox.about(self, "警告", "关闭失败,存在部分没有关闭成功!")
        else:
            QMessageBox.about(self, "提示", "请先开始检测!")
    #获取人脸检测数据并显示到文本框中
    def get_data(self,data):
        if data['error_code']!=0:
            self.plainTextEdit_2.setPlainText(data['error_msg'])
            return
        elif data['error_msg'] == 'SUCCESS':
            self.plainTextEdit_2.clear()
            # 在data字典中键为result对应的值才是返回的检测结果
            face_num = data['result']['face_num']
            # print(face_num)
            if face_num == 0:
                self.plainTextEdit_2.setPlainText("当前没有人或人脸出现!")
                return
            else:
                self.plainTextEdit_2.clear()
                self.plainTextEdit_2.appendPlainText("检测到人脸!")
                self.plainTextEdit_2.appendPlainText("——————————————")
            # 人脸信息获取['result']['face_list']是列表,每个数据就是一个人脸信息,需要取出每个列表信息(0-i)
            for i in range(face_num):
                age = data['result']['face_list'][i]['age']  # 年龄
                # print(age)
                beauty = data['result']['face_list'][i]['beauty']  # 美观度
                gender = data['result']['face_list'][i]['gender']['type']  # 性别
                expression = data['result']['face_list'][i]['expression']['type']
                face_shape = data['result']['face_list'][i]['face_shape']['type']  # 脸型
                glasses = data['result']['face_list'][i]['glasses']['type']  # 是否戴眼镜
                emotion = data['result']['face_list'][i]['emotion']['type']  # 情绪
                mask = data['result']['face_list'][i]['mask']['type']  # 是否戴口罩
                # 往窗口中添加文本,参数就是需要的文本信息
                # print(age,gender,expression,beauty,face_shape,emotion,glasses,mask)
                self.plainTextEdit_2.appendPlainText("第" + str(i + 1) + "个学生人脸信息:")
                self.plainTextEdit_2.appendPlainText("——————————————")
                self.plainTextEdit_2.appendPlainText("年龄:" + str(age))
                if gender == 'male':
                    gender = "男"
                else:
                    gender = "女"
                self.plainTextEdit_2.appendPlainText("性别:" + str(gender))
                self.plainTextEdit_2.appendPlainText("表情:" + str(expression))
                self.plainTextEdit_2.appendPlainText("颜值分数:" + str(beauty))
                self.plainTextEdit_2.appendPlainText("脸型:" + str(face_shape))
                self.plainTextEdit_2.appendPlainText("情绪:" + str(emotion))
                if glasses == "none":
                    glasses="否"
                elif glasses == "common":
                    glasses="是:普通眼镜"
                else:
                    glasses="是:太阳镜"
                self.plainTextEdit_2.appendPlainText("是否佩戴眼镜:" + str(glasses))
                if mask == 0:
                    mask = "否"
                else:
                    mask = "是"
                self.plainTextEdit_2.appendPlainText("是否佩戴口罩:" + str(mask))
                self.plainTextEdit_2.appendPlainText("——————————————")
        else:
            print("人脸获取失败!")

    '''
        获取图像,并转换为base64格式
    '''
    def get_cameradata(self):
        camera_data1 = self.cameravideo.read_camera()
        # 把摄像头画面转化为一张图片,然后设置编码为base64编码
        _, enc = cv2.imencode('.jpg', camera_data1)
        base64_image = base64.b64encode(enc.tobytes())
        #产生信号,传递数据
        self.detect.get_imgdata(base64_image)
    '''
        摄像头数据显示
    '''
    def show_cameradata(self):
        #获取摄像头数据
        pic=self.cameravideo.camera_to_pic()
        #在lebel框中显示数据、显示画面
        self.label.setPixmap(pic)

    '''
        获取Access_token访问令牌
    '''
    def get_accessToken(self):

        # client_id 为官网获取的AK, client_secret 为官网获取的SK
        host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=TKGXdKC7WPWeADGHmFBN8xAr&client_secret=lsr1tAuxv3tRGmOgZTGgNyri667dfKGg'
        # 进行网络请求,使用get函数
        response = requests.get(host)
        if response:
            data = response.json()
            self.access_token = data['access_token']
            return self.access_token
        else:
            QMessageBox(self,"提示","请检查网络连接!")


    def get_seach_data(self,data):
        self.plainTextEdit.setPlainText(data)


    #添加班级
    def add_class(self):
        # 打开输入框,进行输入用户组
        group, ret = QInputDialog.getText(self, "添加班级", "请输入班级名称(由数字、字母、下划线组成)")
        if group == "":
            print("取消添加班级")
        else:
            request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add"

            params = {
                "group_id": group
            }
            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:
                print(response.json())
                message = response.json()
                if message['error_code'] == 0:#根据规则,返回0则为班级添加成功
                    QMessageBox.about(self, "班级创建结果", "班级创建成功")
                else:
                    QMessageBox.about(self, "班级创建结果", "班级创建失败")

    #班级查询
    def get_class(self):
        request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getlist"
        params = {
            "start":0,
            "length":100
        }
        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:
            return response.json()
    #将查询到的结果显示在MessageBOX框上面
    def display_class(self):
        list=self.get_class()
        str=''
        for i in list['result']['group_id_list']:
            str=str+'\n'+i
        QMessageBox.about(self,"班级列表",str)
    #班级删除
    def delete_calss(self):
        #打开输入框,进行输入用户组
        list = self.get_class()#首先获取用户组信息
        group,ret=QInputDialog.getText(self, "存在的班级", "班级信息"+str(list['result']['group_id_list']))
        if group == "":
            print("取消删除班级")
        else:
            request_url = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/delete"

            params = {
                "group_id": group#要删除用户组的id
            }
            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:
                print(response.json())
                message = response.json()
                if message['error_code'] == 0:
                    QMessageBox.about(self, "班级删除结果", "班级删除成功")
                else:
                    QMessageBox.about(self, "班级删除结果", "班级删除失败")

以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!

加入中科创达的第一天,同时也是正式工作的第一天,激动、励志…总之感觉。发文较晚,不过以后的发文基本都会在晚上,因为白天在上班中啦!
原来落霞与孤鹜齐飞,秋水共长天一色是在人开心的时候写的。

陈一月的又一天编程岁月^ _ ^

你可能感兴趣的:(百度AI人脸检测与识别,《百度AI人脸识别与检测》,Python,百度,人脸识别,学生人脸识别打卡签到系统)