# GazeTR **Repository Path**: feng-yu999/gaze-tr ## Basic Information - **Project Name**: GazeTR - **Description**: 注视时间分布demo - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-02-28 - **Last Updated**: 2024-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 项目介绍 ###### 学生课堂注意力检测,前期实现抬头低头、睁眼闭眼识别,gaze预测。 ## 项目结构 - arcface > 虹软3.0接口 - lib >动态链接库 - model >视线估计所需的模型 - weights >所需的模型参数 - demo.py >主程序入口 - eye.py >眼睛开合类 - gaze_tracking.py >gaze预测类 - headpose.py >头部姿态类 - README.md ## 详细介绍 #### 1.demo.py ——主程序入口 ###### 主程序中激活虹软接口,获取激活文件信息,人脸识别引擎,初始化接口,加载关键点检测器,调用本地摄像头. ```pyhton #激活接口,首次需联网激活 res = ASFOnlineActivation(APPID, SDKKey) if (MOK != res and MERR_ASF_ALREADY_ACTIVATED != res): print("ASFActivation fail: {}".format(res)) else: print("ASFActivation sucess: {}".format(res)) # 获取激活文件信息 res,activeFileInfo = ASFGetActiveFileInfo() if (res != MOK): print("ASFGetActiveFileInfo fail: {}".format(res)) else: print(activeFileInfo) # 获取人脸识别引擎 face_engine = ArcFace() # 需要引擎开启的功能 mask = ASF_FACE_DETECT |ASF_FACE3DANGLE # 初始化接口 res = face_engine.ASFInitEngine(ASF_DETECT_MODE_VIDEO,ASF_OP_0_ONLY,30,10,mask) if (res != MOK): print("ASFInitEngine fail: {}".format(res) ) else: print("ASFInitEngine sucess: {}".format(res)) # 获取当前文件的绝对路径保存在cwd cwd = os.path.abspath(os.path.dirname(__file__)) model_path = os.path.abspath(os.path.join(cwd, "trained_models/shape_predictor_68_face_landmarks.dat")) # 加载人脸关键点检测器 _predictor = dlib.shape_predictor(model_path) # 调用本地摄像头 videoCapture = cv2.VideoCapture(0) success,img = videoCapture.read() ``` ###### 对视频流中的每张图片,执行以下操作: ###### 图片处理,调用虹软人脸检测,调用dlib人脸关键点识别. ```python # 图片预处理 sp = img.shape img = cv2.resize(img, (sp[1]//4*4, sp[0]//4*4)) # 人脸检测 res,detectedFaces = face_engine.ASFDetectFaces(img) if res==MOK: for i in range(detectedFaces.faceNum): """ 按每张人脸给detectedFace赋值 """ # 构建dlib人脸检测框,得到landmarks """ 构建人脸框 """ landmarks = _predictor(img, rect) ``` ###### 获取到的detectedFaces和landmarks传入gaze预测类,头部姿态类和眼睛开合类中.分别获取到gaze二维预测值,3D头部姿态信息和眼睛开合信息. ```python # 调用gaze预测类中的方法,得到gaze二维预测值 gazetxt = gaze.analyze(img,detectedFace,landmarks) # 调用头部姿态类方法,得到头部姿态三角度 angleInfo = headpose.headpose_estimation(img,face_engine,detectedFace) # 调用眼睛开合类的方法,得到睁闭眼标识符 eye_flag = eye_class.eye_estimation(landmarks) ``` ###### 调用判断函数,得到抬头低头,眼睛开合信息 ```python # 注意力判断 def attention_judge(angleInfo,eye_flag): ``` #### 2.gaze_tracking.py ——gaze预测类 ###### 加载模型和模型参数 ```python # os.path.dirname功能:去掉文件名,返回目录 # 获取当前文件的绝对路径保存在cwd cwd = os.path.abspath(os.path.dirname(__file__)) # 模型参数路径 loadpath = os.path.abspath(os.path.join(cwd, "weights/Iter_80_trans6.pt")) self.device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu") # 创建model对象 self.net = model.Model() # 加载了第80代的训练参数 statedict = torch.load(loadpath,map_location=torch.device('cpu')) self.net.to(self.device) self.net.load_state_dict(statedict) self.net.eval() ``` ###### 对传入图片进行处理后,开始预测 ###### 返回值:gaze预测值yaw和pitch ```python def analyze(self,frame,detectedFace,landmarks): """ 图片处理 """ with torch.no_grad(): """ 调用网络gaze预测 """ return gaze ``` ###### 包括画3D注视方向线的函数 ```python def draw_gaze(self,image_in, eye_pos, pitchyaw, length=200.0, thickness=2, color=(0, 255, 0)): ``` ### 3.head_pose.py 头部姿态预测类 ###### 使用虹软的头部姿态预测接口 ###### 参数:图片,虹软人脸引擎,每张人脸的人脸检测信息detectedFaces ###### 返回:头部姿态3角度,yaw、pitch、roll ```python def headpose_estimation(self,img,face_engine,detectedFaces): """ 调用虹软头部姿态接口 """ return angleInfo ``` ###### 以及画3D头部姿态表示线的函数 ```python def draw_axis(self, img, yaw, pitch, roll, tdx=None, tdy=None, size = 100): ``` ### 4.eye.py 眼睛开合类 ###### 计算左右眼的眼睛宽高比均值,阈值设为5,判断眼睛开合 ```python def _blinking_ratio(self, landmarks, points): """ 计算眼睛宽高比 """ return ratio ``` ### 5.model 模型 ###### 采用的基于transformer的gaze预测方法,gaze预测误差在4度左右。