计算机竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录

  • 1 前言
  • 2 相关技术
    • 2.1CNN简介
    • 2.2 人脸识别算法
    • 2.3专注检测原理
    • 2.4 OpenCV
  • 3 功能介绍
    • 3.1人脸录入功能
    • 3.2 人脸识别
    • 3.3 人脸专注度检测
    • 3.4 识别记录
  • 4 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于深度学习的人脸专注度检测计算算法

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

2 相关技术

2.1CNN简介

卷积神经网络(CNN),是由多层卷积结构组成的一种神经网络。卷积结构可以减少网络的内存占用、参数和模型的过拟合。卷积神经网络是一种典型的深度学习算法。广泛应用于视觉处理和人工智能领域,特别是在图像识别和人脸识别领域。与完全连接的神经网络相比,CNN输入是通过交换参数和局部感知来提取图像特征的图像。卷积神经网络是由输入层、卷积层、池化层、全连接层和输出层五层结构组成。其具体模型如下图所示。
在这里插入图片描述

(1)输入层(Input
layer):输入层就是神经网络的输入端口,就是把输入传入的入口。通常传入的图像的R,G,B三个通道的数据。数据的输入一般是多维的矩阵向量,其中矩阵中的数值代表的是图像对应位置的像素点的值。

(2)卷积层(Convolution layer):卷积层在CNN中主要具有学习功能,它主要提取输入的数据的特征值。

(3)池化层(Pooling
layer):池化层通过对卷积层的特征值进行压缩来获得自己的特征值,减小特征值的矩阵的维度,减小网络计算量,加速收敛速度可以有效避免过拟合问题。

(4)全连接层(Full connected
layer):全连接层主要实现是把经过卷积层和池化层处理的数据进行集合在一起,形成一个或者多个的全连接层,该层在CNN的功能主要是实现高阶推理计算。

(5)输出层(Output layer):输出层在全连接层之后,是整个神经网络的输出端口即把处理分析后的数据进行输出。

2.2 人脸识别算法

利用dlib实现人脸68个关键点检测并标注,关键代码

import cv2# 加载人脸识别模型face_rec_model_path = 'dlib_face_recognition_resnet_model_v1.dat'facerec = dlib.face_recognition_model_v1(face_rec_model_path)# 加载特征点识别模型predictor_path = "shape_predictor_5_face_landmarks.dat"predictor = dlib.shape_predictor(predictor_path)# 读取图片img_path = "step1/image/face.jpg"img = cv2.imread(img_path)# 转换为灰阶图片gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 正向人脸检测器将图像detector = dlib.get_frontal_face_detector()# 使用人脸识别模型来检测图像中的人脸faces = detector(gray, 1)# 使用特征点识别模型来检测人脸中的特征for i, face in enumerate(faces):# 获取人脸特征点shape = predictor(img, face)

2.3专注检测原理

总体流程

主要通过电脑摄像头去实时的抓拍学生当前的状态和行为,不间断的采集学生上课时的面部表情和眼睛注视的方向,利用CNN提取相应的特征数据并进行分析处理,若对应输出的判断值大于设置的阈值时,则认为学生在走神没有认真学习。并且对拍摄时间进行计时,在界面上实时输出该学生在课堂上的有效学习时间和学生在课堂上专注时间的比例并进行存入表格中。

在这里插入图片描述

眼睛检测算法

基于dlib人脸识别68特征点检测、分别获取左右眼面部标志的索引,通过opencv对视频流进行灰度化处理,检测出人眼的位置信息。人脸特征点检测用到了dlib,dlib有两个关键函数:dlib.get_frontal_face_detector()和dlib.shape_predictor(predictor_path)。

前者是内置的人脸检测算法,使用HOG pyramid,检测人脸区域的界限(bounds)。
后者是用来检测一个区域内的特征点,并输出这些特征点的坐标,它需要一个预先训练好的模型(通过文件路径的方法传入),才能正常工作。
使用开源模型shape_predictor_68_face_landmarks.dat,可以得到68个特征点位置的坐标,连起来后,可以有如图所示的效果(红色是HOG
pyramid检测的结果,绿色是shape_predictor的结果,仅把同一个器官的特征点连线)。

在这里插入图片描述

通过计算眼睛的宽高比来确定专注状态

基本原理:计算 眼睛长宽比 Eye Aspect Ratio,EAR.当人眼睁开时,EAR在某个值上下波动,当人眼闭合时
在这里插入图片描述

关键代码

 # -*- coding: utf-8 -*-# import the necessary packagesfrom scipy.spatial import distance as distfrom imutils.video import FileVideoStreamfrom imutils.video import VideoStreamfrom imutils import face_utilsimport numpy as np # 数据处理的库 numpyimport argparseimport imutilsimport timeimport dlibimport cv2def eye_aspect_ratio(eye):# 垂直眼标志(X,Y)坐标A = dist.euclidean(eye[1], eye[5])# 计算两个集合之间的欧式距离B = dist.euclidean(eye[2], eye[4])# 计算水平之间的欧几里得距离# 水平眼标志(X,Y)坐标C = dist.euclidean(eye[0], eye[3])# 眼睛长宽比的计算ear = (A + B) / (2.0 * C)# 返回眼睛的长宽比return ear# 定义两个常数# 眼睛长宽比# 闪烁阈值EYE_AR_THRESH = 0.2EYE_AR_CONSEC_FRAMES = 3# 初始化帧计数器和眨眼总数COUNTER = 0TOTAL = 0# 初始化DLIB的人脸检测器(HOG),然后创建面部标志物预测print("[INFO] loading facial landmark predictor...")# 第一步:使用dlib.get_frontal_face_detector() 获得脸部位置检测器detector = dlib.get_frontal_face_detector()# 第二步:使用dlib.shape_predictor获得脸部特征位置检测器predictor = dlib.shape_predictor('D:/myworkspace/JupyterNotebook/fatigue_detecting/model/shape_predictor_68_face_landmarks.dat')# 第三步:分别获取左右眼面部标志的索引(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"](rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"]# 第四步:打开cv2 本地摄像头cap = cv2.VideoCapture(0)# 从视频流循环帧while True:# 第五步:进行循环,读取图片,并对图片做维度扩大,并进灰度化ret, frame = cap.read()frame = imutils.resize(frame, width=720)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 第六步:使用detector(gray, 0) 进行脸部位置检测rects = detector(gray, 0)# 第七步:循环脸部位置信息,使用predictor(gray, rect)获得脸部特征位置的信息for rect in rects:shape = predictor(gray, rect)# 第八步:将脸部特征信息转换为数组array的格式shape = face_utils.shape_to_np(shape)# 第九步:提取左眼和右眼坐标leftEye = shape[lStart:lEnd]rightEye = shape[rStart:rEnd]# 第十步:构造函数计算左右眼的EAR值,使用平均值作为最终的EARleftEAR = eye_aspect_ratio(leftEye)rightEAR = eye_aspect_ratio(rightEye)ear = (leftEAR + rightEAR) / 2.0# 第十一步:使用cv2.convexHull获得凸包位置,使用drawContours画出轮廓位置进行画图操作leftEyeHull = cv2.convexHull(leftEye)rightEyeHull = cv2.convexHull(rightEye)cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)# 第十二步:进行画图操作,用矩形框标注人脸left = rect.left()top = rect.top()right = rect.right()bottom = rect.bottom()cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 3)    '''分别计算左眼和右眼的评分求平均作为最终的评分,如果小于阈值,则加1,如果连续3次都小于阈值,则表示进行了一次眨眼活动'''# 第十三步:循环,满足条件的,眨眼次数+1if ear < EYE_AR_THRESH:# 眼睛长宽比:0.2COUNTER += 1else:# 如果连续3次都小于阈值,则表示进行了一次眨眼活动if COUNTER >= EYE_AR_CONSEC_FRAMES:# 阈值:3TOTAL += 1# 重置眼帧计数器COUNTER = 0# 第十四步:进行画图操作,68个特征点标识for (x, y) in shape:cv2.circle(frame, (x, y), 1, (0, 0, 255), -1)# 第十五步:进行画图操作,同时使用cv2.putText将眨眼次数进行显示cv2.putText(frame, "Faces: {}".format(len(rects)), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "Blinks: {}".format(TOTAL), (150, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(frame, "COUNTER: {}".format(COUNTER), (300, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(frame, "EAR: {:.2f}".format(ear), (450, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)print('眼睛实时长宽比:{:.2f} '.format(ear))if TOTAL >= 50:cv2.putText(frame, "SLEEP!!!", (200, 200),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)cv2.putText(frame, "Press 'q': Quit", (20, 500),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (84, 255, 159), 2)# 窗口显示 show with opencvcv2.imshow("Frame", frame)# if the `q` key was pressed, break from the loopif cv2.waitKey(1) & 0xFF == ord('q'):break# 释放摄像头 release cameracap.release()# do a bit of cleanupcv2.destroyAllWindows()

2.4 OpenCV

OpenCV是计算机视觉中一个经典的数据库。支持多语言、跨平台、功能强大。其提供了一个Python接口,用户可以在保证可读性和操作效率的前提下,用Python调用C/C++实现所需的功能。OpenCV是一个基于BSD许可证的跨平台计算机视觉库,可以在Linux、windows和Mac
OS操作系统上运行。它由一系列C函数和少量C++类组成。同时,它还提供了与Python、ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉中的许多通用算法。

本项目中OpenCV主要是在图片的采集的图片的预处理方面使用,通过操作界面中的按钮选项选择是否打开摄像头,使用OpenCV来调用电脑摄像头来检测录像过程中的聚焦和人脸镜头的矫正等状态,然后在摄像头的录像的视频流中抓取对应的人脸照片,然后调用内部的函数对照片的尺寸和光线等进行矫正处理后,传给神经网络进行特征值提取。

3 功能介绍

3.1人脸录入功能

数据库数据录入

将采集到的人脸信息和姓名、学号录入到数据库中,数据库表如下图所示:

在这里插入图片描述

在这里插入图片描述

过程演示

在这里插入图片描述

3.2 人脸识别

在这里插入图片描述

3.3 人脸专注度检测

拍摄时间进行计时,在界面上实时输出该学生在课堂上的有效学习时间和学生在课堂上专注时间的比例
在这里插入图片描述

3.4 识别记录

在这里插入图片描述

4 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果Mac系统如何优化流畅的运行?提高运行速度

Mac系统的稳定性和流畅性一直备受大家称赞&#xff0c;这也是大多数人选择Mac的原因&#xff0c;尽管如此&#xff0c;我们仍不时地对Mac进行优化、调整&#xff0c;以使其比以前更快、更流畅地运行。以下是小编分享给各位的Mac优化方法&#xff0c;记得保存哦~ 一、释放被过度…

Java 中数据结构HashSet的用法

Java HashSet HashSet 基于 HashMap 来实现的&#xff0c;是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的&#xff0c;即不会记录插入的顺序。 HashSet 不是线程安全的&#xff0c; 如果多个线程尝试同时修改 HashSet&#xff0c;则最终结果是…

React原理 - React Reconciliation-上

目录 扩展学习资料 React Reconciliation Stack Reconciler【15版本、栈协调】 Stack Reconciler-事务性 事务性带来的弊端&#xff1a; 扩展学习资料 名称 链接 备注 官方文档 Reconciliation – React 英文 stack reconciler Implementation Notes – React 英文…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

环保环卫行业案例 | 燕千云助力高能环境搭建数智化IT服务管理体系及平台

当前环境卫生问题在全球已引起前所未有的关注&#xff0c;而促进健康又成为环境与发展所关注的核心问题。随着数字化时代的到来&#xff0c;环保环卫行业呈现出多个发展趋势&#xff0c;随着业务系统规模的不断扩大&#xff0c;信息系统的运维问题也日益突出&#xff0c;需要得…

『Swift社区赠书第 1 期』- 『循序渐进 Vue.js 3.x 前端开发实战』

文章目录 关于作者内容介绍评论区抽三位小伙伴送书活动时间&#xff1a;截止到 2023-08-24 20:00:00 获奖名单 ps. 文末送书&#xff0c;送书为 Swift社区 额外福利 《循序渐进 Vue.js 3.x 前端开发实战》本书包含 42 集视频教学&#xff0c;完整源代码 PPT 课件。 Vue.js 3…

睿思BI实现杜邦分析

杜邦分析法&#xff08;DuPont analysis&#xff09;是一种分析企业财务状况的方法&#xff0c;得名于美国杜邦公司。该方法可以应用于销售业绩分析。 睿思BI实现杜邦分析效果如下&#xff1a; 效果演示地址&#xff1a;https://www.ruisitech.com/rsbi-ultimate/#/dashboard/…

Zookeeper 入门

第 1 章 Zookeeper 入门 1.1概述 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;Zookeeper就将…

Kubernetes技术--k8s核心技术Service服务

1.service概述 Service 是 Kubernetes 最核心概念,通过创建 Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并且将请求负载分发到后端的各个容器应用上。 2.service存在的意义 -1:防止pod失联(服务发现) 我们先说一下什么叫pod失联。 -2:

肖sir __linux__面试题和考核05

面试题 1、查看linux中第11行到第20行的数据&#xff08;比如文档a 有30行&#xff09; 方法1&#xff1a;tail -n 11 mm |head -n10 n 表示从第10行开始&#xff0c;取前10行 方法2&#xff1a;head -n -10 mm| tail -n 10 表示从末尾第10行开始&#xff0c;最后10行 方法3&am…

金融风控数据分析-信用评分卡建模(附数据集下载地址)

本文引用自&#xff1a; 金融风控&#xff1a;信用评分卡建模流程 - 知乎 (zhihu.com) 在原文的基础上加上了一部分自己的理解&#xff0c;转载在CSDN上作为保留记录。 本文涉及到的数据集可直接从天池上面下载&#xff1a; Give Me Some Credit给我一些荣誉_数据集-阿里云…

OceanBase安全审计之传输加密

上一期我们讲了关于 OceanBase 安全审计的《身份鉴别》和《用户管理与访问控制》 两个部分&#xff0c;OceanBase 的安全机制介绍其支持传输加密&#xff0c;今天我们主要来实践一下如何配置传输加密以及验证是否真的加密。 作者&#xff1a;金长龙 爱可生测试工程师&#xff0…

K8s:一文认知 CRI,OCI,容器运行时,Pod 之间的关系

写在前面 博文内容整体结构为结合 华为云云原生课程 整理而来,部分内容做了补充课程是免费的&#xff0c;有华为云账户就可以看&#xff0c;适合理论认知&#xff0c;感觉很不错。有需要的小伙伴可以看看&#xff0c;链接在文末理解不足小伙伴帮忙指正 对每个人而言&#xff0c…

【单片机】有人 WH-LTE-7S1 4G cat1 模块连接服务器,教程,记录。GPRS模块连接服务器教程。socket编程。

文章目录 4G cat1 模块封装引脚名称功能拓扑图串口模块调试WH-LTE-7S1公网服务器建立python程序服务服务器程序WH-LTE-7S1 模块连接服务器与多个模块建立TCP长连接的服务器程序 本文主要介绍了一个4G Cat1模块&#xff0c;该模块具有多种功能和特性。文章接下来展示了4G Cat1模…

MySQL connect(使用C、C++链接)

目录 一.Connector/C使用 二.mysql接口 1.初始化mysql_init() 2.链接数据库mysql_real_connect 3.下发mysql命令mysql_query 4.获取执行结果mysql_store_result 5.关闭mysql链接mysql_close 6.事务等操作 7.使用上面接口的总代码 三.实现一个简易mysql客户端 我们无…

「MySQL-04」Linux环境下使用C/C++连接并操纵MySQL

目录 一、准备mysql库&#xff1a;Connector/C 1. 查看是否有mysql相关的库和头文件 2. 安装devel(开发库) 3.到官网下载开发包&#xff0c;并上传到Linux 3.0 须知 3.1 到官网下载开发包 3.2 上传安装包至Linux 二、mysql库&#xff1a;Connector/C 的使用 1. 创建并初始化mys…

CIM和websockt-实现实时消息通信:双人聊天和消息列表展示

欢迎大佬的来访&#xff0c;给大佬奉茶 一、文章背景 有一个业务需求是&#xff1a;实现一个聊天室&#xff0c;我和对方可以聊天&#xff1b;以及有一个消息列表展示我和对方&#xff08;多个人&#xff09;的聊天信息和及时接收到对方发来的消息并展示在列表上。 项目框架概…

CSS中如何实现文字渐变色效果(Text Gradient Color)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字渐变色效果&#xff08;Text Gradient Color&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这…

直接插入排序与希尔排序

目录 一&#xff0c;排序的概念 二&#xff0c;插入排序 2.1直接插入排序 2.2 希尔排序 一&#xff0c;排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些或某些关键字的大小&#xff0c;递增或递减的排列 稳定性&#xff…

164到网络安全面试大全(附答案)

最近有不少小伙伴跑来咨询&#xff1a; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&#xff1f;工作不到 2 年&#xff0c;想跳槽看下机会&#xff0c;有没有相关的面试题呢&#xff1f; 为了更好地帮助大家高薪就业&#xff0c;今天就给大家分享两份网络安全工…