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


    有问题欢迎联系作者WX Qwe1398276934

    一、简介

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

    二、效果展示

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

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

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

    三、实现细节

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

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

    1. class SignThread(QThread):
    2. changePixmap = pyqtSignal(QImage)
    3. update_database=pyqtSignal(str)
    4. def run(self):
    5. self.is_running=True
    6. cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
    7. while True:
    8. ret, frame = cap.read()
    9. if ret and self.is_running:
    10. cls,rate=predict(frame)
    11. if float(rate)>70:
    12. print(rate)
    13. conn = sqlite3.connect("data.db")
    14. cursor = conn.cursor()
    15. # cursor.execute("INSERT OR REPLACE INTO students VALUES (?, ?, ?, ?, ?, ?)",
    16. # (student_id, name, age, classname, major, sign_up))
    17. cursor.execute("UPDATE students SET sign_up=? WHERE name=?", ('是', cls))
    18. conn.commit()
    19. conn.close()
    20. self.update_database.emit("签到人:"+cls+", 准确率:"+rate)
    21. rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    22. h, w, ch = rgbImage.shape
    23. bytesPerLine = ch * w
    24. image = QImage(rgbImage.data, w, h, bytesPerLine, QImage.Format_RGB888)
    25. self.changePixmap.emit(image)
    26. else:
    27. #当按下暂停键,停止键以后,界面变为白色
    28. width = 640
    29. height = 480
    30. # 创建一个全白色的 QImage
    31. white_color = QColor(255, 255, 255) # 白色
    32. image = QImage(width, height, QImage.Format_RGB888)
    33. image.fill(white_color)
    34. self.changePixmap.emit(image)
    35. break
    36. def stop(self):
    37. self.is_running=False

    2、深度学习

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

    1. #数据增强的方式
    2. traintransform = transforms .Compose([
    3. transforms .RandomRotation (20), #随机旋转角度
    4. transforms .ColorJitter(brightness=0.1), #颜色亮度
    5. transforms .Resize([224, 224]), #设置成224×224大小的张量
    6. transforms .ToTensor(), # 将图⽚数据变为tensor格式
    7. # transforms.Normalize(mean=[0.485, 0.456, 0.406],
    8. # std=[0.229, 0.224, 0.225]),
    9. ])
    10. valtransform = transforms .Compose([
    11. transforms .Resize([224, 224]),
    12. transforms .ToTensor(), # 将图⽚数据变为tensor格式
    13. ])
    14. trainData = dsets.ImageFolder (trainpath, transform =traintransform ) # 读取训练集,标签就是train⽬录下的⽂件夹的名字,图像保存在格⼦标签下的⽂件夹⾥
    15. valData = dsets.ImageFolder (valpath, transform =valtransform ) #读取演正剧
    16. trainLoader = torch.utils.data.DataLoader(dataset=trainData, batch_size=batch_size, shuffle=True) #将数据集分批次 并打乱顺序
    17. valLoader = torch.utils.data.DataLoader(dataset=valData, batch_size=batch_size, shuffle=False) #将测试集分批次并打乱顺序
    18. train_sum=len(trainData) #计算 训练集和测试集的图片总数
    19. test_sum = len(valData)
    20. import numpy as np
    21. import torchvision.models as models
    22. model = models.resnet50(pretrained=True) #pretrained表⽰是否加载已经与训练好的参数
    23. model.fc = torch.nn.Linear(2048, num_of_classes) #将最后的fc层的输出改为标签数量(如3),512取决于原始⽹络fc层的输⼊通道
    24. model = model.to(device) # 如果有GPU,⽽且确认使⽤则保留;如果没有GPU,请删除
    25. criterion = torch.nn.CrossEntropyLoss() # 定义损失函数
    26. optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 定义优化器
    27. from torch.autograd import Variable
    28. #定义训练的函数
    29. def train(model, optimizer, criterion):
    30. model.train()
    31. total_loss = 0
    32. train_corrects = 0
    33. for i, (image, label) in enumerate (tqdm(trainLoader)):
    34. image = Variable(image.to(device)) # 同理
    35. label = Variable(label.to(device)) # 同理
    36. #print(i,image,label)
    37. optimizer.zero_grad ()
    38. target = model(image)
    39. loss = criterion(target, label)
    40. loss.backward()
    41. optimizer.step()
    42. total_loss += loss.item()
    43. max_value , max_index = torch.max(target, 1)
    44. pred_label = max_index.cpu().numpy()
    45. true_label = label.cpu().numpy()
    46. train_corrects += np.sum(pred_label == true_label)
    47. return total_loss / float(len(trainLoader)), train_corrects / train_sum
    48. testLoader=valLoader
    49. #定义测试的函数
    50. def evaluate(model, criterion):
    51. model.eval()
    52. corrects = eval_loss = 0
    53. with torch.no_grad():
    54. for image, label in tqdm(testLoader):
    55. image = Variable(image.to(device)) # 如果不使⽤GPU,删除.cuda()
    56. label = Variable(label.to(device)) # 同理
    57. pred = model(image)
    58. loss = criterion(pred, label)
    59. eval_loss += loss.item()
    60. max_value, max_index = torch.max(pred, 1)
    61. pred_label = max_index.cpu().numpy()
    62. true_label = label.cpu().numpy()
    63. corrects += np.sum(pred_label == true_label)
    64. return eval_loss / float(len(testLoader)), corrects, corrects / test_sum

    3、数据库设计

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

    1. student_id = self.studentID.text()
    2. name = self.name.text()
    3. age = self.age.text()
    4. classname = self.classname.text()
    5. major = self.major.text()
    6. sign_up='否'
    7. conn = sqlite3.connect("data.db")
    8. cursor = conn.cursor()
    9. cursor.execute("INSERT OR REPLACE INTO students VALUES (?, ?, ?, ?, ?, ?)",
    10. (student_id, name, age, classname, major,sign_up))
    11. conn.commit()
    12. conn.close()
    13. self.label_txt.setText(f"Saved: {name}")
    14. self.show_data()

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

  • 相关阅读:
    自然语言处理 Paddle NLP - 文本语义相似度计算(ERNIE-Gram)
    分享一下奶茶店怎么在小程序上做商城功能
    MyCat 管理及监控
    MySQL 及 jdbc 问题汇总
    同花顺,通达信,东方财富股票竞价,早盘板块、概念、题材竞价数据接口
    怎么按要求对PDF文件进行拆分?PDF拆分教程来了
    Oracle sqlnet.ora配置文件
    wordpress网站搭建(centos stream 9)
    AndroidStudio运行app需要运行两次生效
    利用map的特性对数组进行操作
  • 原文地址:https://blog.csdn.net/qq_46644680/article/details/132829312