文章目录
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 # 数据处理的库 n