人脸签到系统 pyQT+数据库+深度学习

news2024/12/24 10:23:23

一、简介

        人脸签到系统是一种基于人脸识别技术的自动签到和认证系统。它利用计算机视觉和深度学习算法来检测、识别和验证个体的面部特征,以确定其身份并记录其出现的时间。这个系统通常用于各种场景,包括企业、学校、会议、活动和公共交通等,以替代传统的签到方式,如签到表或磁卡,提供更高的安全性、准确性和便捷性。

二、效果展示

*左上角是采集人脸和签到的界面显示

*左下角输入采集人脸的信息

*右侧实时展示已经存放人脸的各种属性信息

三、实现细节

1、多线程实时现实摄像头内容

        采用QT多线程实时对摄像头捕捉到的画面进行显示,当点击结束签到时,程序退出摄像头线程

class SignThread(QThread):
    changePixmap = pyqtSignal(QImage)
    update_database=pyqtSignal(str)

    def run(self):

        self.is_running=True
        cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
        while True:
            ret, frame = cap.read()
            if ret and self.is_running:

                cls,rate=predict(frame)
                if float(rate)>70:
                    print(rate)

                    conn = sqlite3.connect("data.db")
                    cursor = conn.cursor()

                    # cursor.execute("INSERT OR REPLACE INTO students VALUES (?, ?, ?, ?, ?, ?)",
                    #                (student_id, name, age, classname, major, sign_up))
                    cursor.execute("UPDATE students SET sign_up=? WHERE name=?", ('是', cls))

                    conn.commit()
                    conn.close()

                    self.update_database.emit("签到人:"+cls+",   准确率:"+rate)

                rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

                h, w, ch = rgbImage.shape
                bytesPerLine = ch * w
                image = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
                self.changePixmap.emit(image)
            else:
                #当按下暂停键,停止键以后,界面变为白色
                width = 640
                height = 480

                # 创建一个全白色的 QImage
                white_color = QColor(255, 255, 255)  # 白色
                image = QImage(width, height, QImage.Format_RGB888)
                image.fill(white_color)
                self.changePixmap.emit(image)
                break

    def stop(self):
        self.is_running=False

2、深度学习

在train.py对录取人脸手动进行训练,训练完成后,打开main.py主界面进行预测识别,开始签到

#数据增强的方式
traintransform = transforms .Compose([
 transforms .RandomRotation (20),               #随机旋转角度
 transforms .ColorJitter(brightness=0.1),     #颜色亮度
 transforms .Resize([224, 224]),               #设置成224×224大小的张量
 transforms .ToTensor(),                        # 将图⽚数据变为tensor格式
# transforms.Normalize(mean=[0.485, 0.456, 0.406],
# std=[0.229, 0.224, 0.225]),
])


valtransform = transforms .Compose([
 transforms .Resize([224, 224]),
 transforms .ToTensor(), # 将图⽚数据变为tensor格式
])


trainData = dsets.ImageFolder (trainpath, transform =traintransform ) # 读取训练集,标签就是train⽬录下的⽂件夹的名字,图像保存在格⼦标签下的⽂件夹⾥
valData = dsets.ImageFolder (valpath, transform =valtransform )       #读取演正剧
trainLoader = torch.utils.data.DataLoader(dataset=trainData, batch_size=batch_size, shuffle=True)     #将数据集分批次  并打乱顺序
valLoader = torch.utils.data.DataLoader(dataset=valData, batch_size=batch_size, shuffle=False)          #将测试集分批次并打乱顺序

train_sum=len(trainData)    #计算  训练集和测试集的图片总数
test_sum = len(valData)

import numpy as np

import torchvision.models as models
model = models.resnet50(pretrained=True) #pretrained表⽰是否加载已经与训练好的参数
model.fc = torch.nn.Linear(2048, num_of_classes) #将最后的fc层的输出改为标签数量(如3),512取决于原始⽹络fc层的输⼊通道
model = model.to(device) # 如果有GPU,⽽且确认使⽤则保留;如果没有GPU,请删除

criterion = torch.nn.CrossEntropyLoss() # 定义损失函数

optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 定义优化器

from torch.autograd import Variable
#定义训练的函数
def train(model, optimizer, criterion):
    model.train()
    total_loss = 0
    train_corrects = 0
    for i, (image, label) in enumerate (tqdm(trainLoader)):
         image = Variable(image.to(device)) # 同理
         label = Variable(label.to(device)) # 同理
         #print(i,image,label)
         optimizer.zero_grad ()
         target = model(image)
         loss = criterion(target, label)
         loss.backward()
         optimizer.step()
         total_loss += loss.item()
         max_value , max_index = torch.max(target, 1)
         pred_label = max_index.cpu().numpy()
         true_label = label.cpu().numpy()
         train_corrects += np.sum(pred_label == true_label)
    return total_loss / float(len(trainLoader)), train_corrects / train_sum


testLoader=valLoader
#定义测试的函数
def evaluate(model, criterion):
    model.eval()
    corrects = eval_loss = 0
    with torch.no_grad():
        for image, label in tqdm(testLoader):
            image = Variable(image.to(device)) # 如果不使⽤GPU,删除.cuda()
            label = Variable(label.to(device)) # 同理
            pred = model(image)
            loss = criterion(pred, label)
            eval_loss += loss.item()
            max_value, max_index = torch.max(pred, 1)
            pred_label = max_index.cpu().numpy()
            true_label = label.cpu().numpy()
            corrects += np.sum(pred_label == true_label)
    return eval_loss / float(len(testLoader)), corrects, corrects / test_sum

3、数据库设计

例如下:对新生信息进行插入操作

student_id = self.studentID.text()
name = self.name.text()
age = self.age.text()
classname = self.classname.text()
major = self.major.text()
sign_up='否'

conn = sqlite3.connect("data.db")
cursor = conn.cursor()

cursor.execute("INSERT OR REPLACE INTO students VALUES (?, ?, ?, ?, ?, ?)",
               (student_id, name, age, classname, major,sign_up))

conn.commit()
conn.close()

self.label_txt.setText(f"Saved: {name}")
self.show_data()

如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给恒川的意见,欢迎评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

海格里斯HEGERLS托盘式四向穿梭车系统核心技术有哪些?

四向穿梭车立体仓库是常见的自动化立体库解决方案,可以应用在不规则、异型、长宽比较大或者少品种大批量、多品种大批量的仓库。其核心设备四向穿梭车克服了环形穿梭车的缺点,具有很高的灵活性和柔性。对于大型的立体库系统,四向穿梭车具有很…

2023最新计算机大数据毕业设计选题推荐100例

文章目录 0 前言1 如何选题1.1 选题技巧:如何避坑(重中之重)1.2 为什么这么说呢?1.3 难度把控1.4 题目名称1.5 最后 2 大数据 - 选题推荐2.1 大数据挖掘类2.2 大数据处理、云计算、区块链 毕设选题2.3 大数据安全类2.4 python大数据 游戏设计、动画设计类…

人工智能基础-趋势-架构

在过去的几周里,我花了一些时间来了解生成式人工智能基础设施的前景。在这篇文章中,我的目标是清晰概述关键组成部分、新兴趋势,并重点介绍推动创新的早期行业参与者。我将解释基础模型、计算、框架、计算、编排和矢量数据库、微调、标签、合…

HTTPS原理(证书验证+数据传输)

HTTPS协议相关的概念有SSL、非对称加密、CA证书等 为什么用了HTTPS就是安全的?HTTPS底层原理如何实现?用了HTTPS就一定安全吗? HTTPS实现原理 HTTPS在内容传输上的加密使用的是对称加密,证书验证阶段使用非对称加密 中间人攻…

无涯教程-JavaScript - INTRATE函数

描述 INTRATE函数返回完全投资证券的利率。 语法 INTRATE (settlement, maturity, investment, redemption, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 RequiredMaturity 证券的到期…

innovus:如何设置clock cell list(icg logic_cells buffer inverter)

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 set_ccopt_property inverter_cells [list CKINV*LVT] set_ccopt_property buffer_cells [list CKBUF*LVT] set_ccopt_property clock_gating_cells [list CLKNQ*LVT set_cc…

数据结构与算法(一)数组的相关概念和底层java实现

一、前言 从今天开始,笔者也开始从0学习数据结构和算法,但是因为这次学习比较捉急,所以记录的内容并不会过于详细,会从基础和底层代码实现以及力扣相关题目去写相关的文章,对于详细的概念并不会过多讲解 二、数组基础…

数字化互联网数字孪生:重塑未来的创新思维

数字孪生是当今数字化互联网时代的一个引人注目的概念,它正在改变着各个行业的方式和节奏。数字孪生不仅是一种技术,更是一种思维方式。 数字化互联网的崛起 数字化互联网正在以前所未有的速度和规模改变着我们的生活和工作方式。从智能手机到物联网设备…

按图搜索淘宝商品(拍立淘)API接口 搜爆款商品 图片搜索功能api 调用示例

接口名称:item_search_img 公共参数 请求地址: 测试item_search_img 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_s…

品牌为什么要做价格管控

价格管控的目的其实是为了治理低价,低价的存在会使渠道变得不可控,比如经销商低价跟价,消费者因为低价而转投其他品牌,这些无形中都会影响品牌的销量,阻碍品牌发展,所以做价格管控,就是在做好低…

智慧公厕助推城市管理智能化和治理精细化

随着城市化进程的不断加快,城市管理面临着诸多挑战和问题。而智慧公厕作为城市数字化赋能的重要一环,正成为推动城市管理智能化和治理精细化的关键力量。本文将以智慧公厕头部厂家广州中期科技有限公司,所实施大量精品案例项目的实景实图&…

(源码版)2023全国大学生数学建模竞赛E题黄河水沙监测数据分析详解+Python代码源码SARIMA模型

前言 比赛结束了不知道大家情况如何,就我个人而言的话,由于工作任务比较繁重仅完成了对D题和E题的思路解答和建模,还是比较遗憾的。一个人要完成多题的建模和分析确实不是一件容易的事情,当然我向大家做出承诺历年的建模比赛我都…

修改el-card的header的背景颜色

修改el-card的header的背景颜色 1.修改默认样式 好处是当前页面的所有的el-card都会变化 页面卡片&#xff1a; <el-card class"box-card" ><div slot"header" class"clearfix"><span>卡片名称</span><el-button s…

华为数通方向HCIP-DataCom H12-821题库(单选题:341-360)

第341题 在BGP中代表对等体之间已经建立连接的状态是以下哪一种? A、Active B、Connect C、Established D、Open 答案:C 第342题 以下关于路由选择工具的描述,错误的是哪一项? A、访问控制列表用于匹配路由信息或者数据包的地址,过滤不符合条件的路由信息或数据包 …

构造函数注入指定bean名称

配置类 Configuration public class ThreadPoolTaskExecutorConfig {Beanpublic ThreadPoolTaskScheduler syncScheduler() {ThreadPoolTaskScheduler syncScheduler new ThreadPoolTaskScheduler();syncScheduler.setPoolSize(10);syncScheduler.setThreadGroupName("s…

企业网络革命:连接和访问的智慧选项

近年来&#xff0c;企业网络通信需求可谓五花八门&#xff0c;变幻莫测。它不仅为企业的生产、办公、研发、销售提供全面赋能&#xff0c;同时也让企业业务规模变大成为了可能。今天&#xff0c;我们来聊聊广域网中两个不可忽视的概念&#xff1a;连接&#xff08;Connection&a…

SSTables和LSM-Tree

SSTables 可以类比Kafka&#xff1a;将数据按键排序写入磁盘&#xff0c;并分为多个段&#xff0c;组织段的稀疏索引&#xff0c;并定期合并段文件&#xff08;kafka因为不存在重复数据&#xff0c;所以不需要合并&#xff09; LSM-Tree是基于SSTables的&#xff1a;在内存中维…

vector的clear能清除其内存吗

在C中&#xff0c;std::vector的clear函数会移除向量中的所有元素&#xff0c;使得它的大小变为0。 然而&#xff0c;clear函数并不会立即释放向量所占用的内存。向量仍然会保留其已分配的内存&#xff0c;以备后续添加元素时使用。 如果你想要立即释放内存&#xff0c;可以考虑…

高忆管理:一夜10%!特斯拉大涨,不靠车

美东时刻周一&#xff0c;美股三大指数全线收涨&#xff0c;科技权重股团体体现亮眼&#xff0c;成为推进美股走强的首要动力。电动车龙头特斯拉因受到华尔街大行看好其AI开展&#xff0c;股价大涨10%&#xff0c;市值一夜添加796亿美元&#xff08;约合人民币5802亿元&#xf…

数据库管理软件NoSQLBooster for MongoDB 8.1 Mac

NoSQLBooster for MongoDB 是一款功能强大的 MongoDB 数据库管理工具。它提供了一个直观的用户界面&#xff0c;使用户能够轻松地浏览、查询和修改 MongoDB 数据库中的数据。 NoSQLBooster for MongoDB 支持多种查询方式&#xff0c;包括基本查询、聚合管道、地理空间查询等。它…