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

news2024/12/23 20:23:39

文章目录

  • 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 packages
    from scipy.spatial import distance as dist
    from imutils.video import FileVideoStream
    from imutils.video import VideoStream
    from imutils import face_utils
    import numpy as np # 数据处理的库 numpy
    import argparse
    import imutils
    import time
    import dlib
    import cv2


    def 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.2
    EYE_AR_CONSEC_FRAMES = 3
    # 初始化帧计数器和眨眼总数
    COUNTER = 0
    TOTAL = 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值,使用平均值作为最终的EAR
            leftEAR = 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次都小于阈值,则表示进行了一次眨眼活动
            '''
            # 第十三步:循环,满足条件的,眨眼次数+1
            if ear < EYE_AR_THRESH:# 眼睛长宽比:0.2
                COUNTER += 1
               
            else:
                # 如果连续3次都小于阈值,则表示进行了一次眨眼活动
                if COUNTER >= EYE_AR_CONSEC_FRAMES:# 阈值:3
                    TOTAL += 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 opencv
        cv2.imshow("Frame", frame)
        
        # if the `q` key was pressed, break from the loop
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
            
    # 释放摄像头 release camera
    cap.release()
    # do a bit of cleanup
    cv2.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.coloradmin.cn/o/1021207.html

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

相关文章

Kotlin Coroutines包下的select函数简介

在工作中&#xff0c;发现了kotlin Coroutines包下有大量功能非常强大的API&#xff0c;这篇文章中&#xff0c;我们主要来聊一聊select函数 1. 什么是select函数 想象一下这个场景&#xff0c;在程序应用中&#xff0c;为了实现一个业务逻辑&#xff0c;你可能有好几种方式来…

石河子大学《乡村振兴战略下传统村落文化旅游设计》许少辉博士新著——2023学生开学季辉少许

石河子大学《乡村振兴战略下传统村落文化旅游设计》许少辉博士新著——2023学生开学季辉少许

LLM预训练之RLHF(一):RLHF及其变种

在ChatGPT引领的大型语言模型时代&#xff0c;国内外的大模型呈现爆发式发展&#xff0c;尤其是以年初的LLaMA模型为首的开源大模型和最近百川智能的baichuan模型&#xff0c;但无一例外&#xff0c;都使用了「基于人类反馈的强化学习」&#xff08;RLHF&#xff09;来提升语言…

football 篮球数据集-目标检测548张

“篮球&#xff08;basketball&#xff09;&#xff0c;是以手为中心的身体对抗性体育运动&#xff0c;是奥运会核心比赛项目。1891年12月21日&#xff0c;由美国马萨诸塞州斯普林菲尔德基督教青年会训练学校体育教师詹姆士奈史密斯发明。1896年&#xff0c;篮球运动传入中国天…

扩散原理详解与实战

学习一下扩散模型的数学原理。 前向扩散 q ( x t ∣ x 0 ) N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q\left(\mathbf{x}_t \mid \mathbf{x}_0\right)\mathcal{N}\left(\mathbf{x}_t ; \sqrt{\bar{\alpha}_t} \mathbf{x}_0,\left(1-\bar{\alpha}_t\right) \mathbf{I}\rig…

【Graph Net学习】GNN/GCN代码实战

一、简介 GNN&#xff08;Graph Neural Network&#xff09;和GCN&#xff08;Graph Convolutional Network&#xff09;都是基于图结构的神经网络模型。本文目标就是打代码基础&#xff0c;未用PyG&#xff0c;来扒一扒Graph Net两个基础算法的原理。直接上代码。 二、代码 …

Vue3记录

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/releas…

使用Python构建网络爬虫:从网页中提取数据

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 网络爬虫是一种强大的工…

libevent学习——Reactor模式

Reactor模式 Reator的事件处理机制 Reactor翻译为“反应堆”&#xff0c;是一种事件驱动机制。该机制和普通函数调用的不同在于&#xff1a;应用程序不是主动调用某个API完成处理&#xff0c;相反&#xff0c;Reactor逆置了事件处理流程&#xff0c;应用程序需要提供相应的接…

前后端分离毕设项目之基于springboot+vue的笔记记录分享网站设计与实现(内含源码+文档+部署教程)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

练习敲代码速度

2023年9月18日&#xff0c;周一晚上 今晚不想学习&#xff0c;但又不想玩游戏&#xff0c;于是找了一些练习敲代码的网站来玩玩&#xff0c;顺便练习一下敲代码的速度 目录 参考资料个人推荐第一个 第二个第三个 参考资料 电脑打字慢&#xff0c;有哪些比较好的练打字软件&a…

xxl-job的原理(1)

xxl-job的架构 系统组成 调度中心&#xff1a;进行任务统一调度&#xff0c;可以新增和管理执行器和任务&#xff1b;执行器&#xff1a;任务执行依赖的组件&#xff0c;一个执行器可以关联多个任务&#xff0c;添加的执行器可以自动注册到调度中心上&#xff1b;任务&#x…

全国职业技能大赛云计算--高职组赛题卷②(私有云)

全国职业技能大赛云计算--高职组赛题卷②&#xff08;私有云&#xff09; 第一场次题目&#xff1a;OpenStack平台部署与运维任务1 基础运维任务&#xff08;5分&#xff09;任务2 OpenStack搭建任务&#xff08;15分&#xff09;任务3 OpenStack云平台运维&#xff08;15分&am…

mysq 主从同步错误之 Error_code 1032 handler error HA_ERR_KEY_NOT_FOUND

错误说明&#xff1a; MySQL主从同步的1032错误&#xff0c;一般是指要更改的数据不存在&#xff0c;SQL_THREAD提取的日志无法应用故报错&#xff0c;造成同步失败 &#xff08;Update、Delete、Insert一条已经delete的数据&#xff09;。 1032的错误本身对数据一致性没什么影…

VScode断点调试vue

VScode断点调试vue 1、修改launch.js文件&#xff08;没有这个文件就新建&#xff09;。 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlin…

ChatGLM 通俗理解大模型的各大微调方法:从LoRA、QLoRA到P-Tuning V1/V2

前言 PEFT 方法仅微调少量(额外)模型参数,同时冻结预训练 LLM 的大部分参数 第一部分 高效参数微调的发展史 1.1 Google之Adapter Tuning:嵌入在transformer里 原有参数不变 只微调新增的Adapter 谷歌的研究人员首次在论文《Parameter-Efficient Transfer Learning for N…

CSS选择器练习小游戏

请结合CSS选择器练习小游戏进行阅读&#xff08;网页的动态效果是没有办法通过静态图片展示的&#xff09; 网址&#xff1a;请点击 有些题有多种答案&#xff0c;本文就不一一列出了 第一题 答案&#xff1a;plate第二题 答案&#xff1a;bento第三题 答案&#xff1a;#fa…

前后端分离管理系统day01---Springboot+MybatisPlus

目录 目录 软件 基础知识 一创建后端项目 注意&#xff1a; 删除多余项 创建测试类 二 加入mybatis-plus依赖支持 1.加入依赖码 2.创建数据库实例/创建用户表/插入默认数据 创建数据库实例 创建表 插入数据 3.配置yml文件 注意&#xff1a;wms01必须是数据库的名字&…

JVM——8.内存分配方式

这篇文章我们来讲一下jvm的内存分配方式 目录 1.概述 1.1jvm运行时数据区 1.2堆空间的分代 1.3对象分配的整体流程 2.具体的内存分配方式 2.1指针碰撞法 2.2空闲列表法 2.3Java虚拟机选择策略 3.小结 1.概述 我们前面在GC那篇文章中写了JVM的内存分配策略&#xff0…

计算机竞赛 深度学习 opencv python 实现中国交通标志识别

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…