3D双目跟踪瞳孔识别瞳孔定位算法测试

文章详细描述了一种眼动追踪系统,通过自研算法结合Acer和Realsense摄像头进行瞳孔定位,并使用OpenCV进行面部和眼部检测,评估了精度、连续漏检率等指标。同时介绍了测试场景、竞品比较和数据集的应用情况。
摘要由CSDN通过智能技术生成

测试场景:

1. 当用户瞳孔移动时,需要精确定位到瞳孔位置,保证眼动跟踪正常
2. 当有其他人进入摄像头工作范围时,不会干扰之前锁定用户的瞳孔定位功能

测试对象:

1. 自研算法 + 限定硬件( Acer Realsense 摄像头)
2.  竞品: tobill Acer Realsense 摄像头

测试范围:基于不同需求测试项,测试算法精度

测试项

说明

是否需要测试

优先级

备注

瞳孔状态

静止、移动

P0

已与研发确认

双目锁定

单人

P0

干扰

遮挡、是否佩戴眼镜 

P0

光照

室内

P1

室外

P2

资源消耗

CPUGPUMemory

P2

评测指标

维度

指标

计算方式

说明

测试优先级

是否需要测试

备注

准确度

accuracy

均方根误差

RMSE=√Σ(Yi-Yi^) ²/n

衡量估计值与真实值的平均误差

P0

已与研发确认

精确度

precision

相对位移

D=-(xC−xA,yC−yA,zC−zA)-|dc-da|/n

衡量每两次的估计值与真实值的相对位移差值

P0

平均绝对误差

MAE = (Σ|xi - yi|) / N

衡量估计值和真实值之的平均绝对误差分布

P1

标准差   

σ = √[Σ(xi-μ)²/n]

衡量估计值的分散度

P2

连续漏检率

cfnr

CFNR

首帧检测时间、时间离散和集中程度、丢帧率

连续时间内的漏检帧数采样

P1

漏检率

fnr

FNR

FN / FN + TP

正例样本帧数采样

P2

误报率

fpr

FPR

FP / FP + TN

负例样本帧数采样

P2

评测指标-误报率

脚本设计方案:

使用OpenCV库进行本地视频中的面部和眼部检测,并将检测到的帧保存到磁盘

1. 加载 Haar 级联分类器文件,用于眼部和面部检测
2. 读取视频路径,视频分帧,循环从视频中读取每一帧将帧转换为灰度图像,并使用 Haar 级联分类器检测眼部
3. 保存检测到的帧和绘制标记。如果检测到 瞳孔 ,绘制一个红色的点阵。如果检测到面部,绘制一个绿色的矩形
4. 检测窗口会显示每帧的图像,用红点阵和绿矩形标记眼部和面部。按下 Esc 键后,检测窗口会关闭
5. 统计并打印 Total TP TN 的数目,数据入盘
6. 测试过程中录制视频,视频数据包括双目闭合 / 遮挡、单目闭合 / 遮挡,不可正常识别到瞳孔
7. 将录制完成的视频放到测试代码( OpenCV ),运行代码
8. 统计总帧数 Total 、检测到红色标识的帧数 FP 、未检测到红色标识的帧数 TN ,并保存 FP 到本地磁盘
9. 人工查看检测 fp ,确保代码检测无误
10. 计算误报率: FPR = FP / FP + TN
测试数据集

编号

名称

用途及特点

备注

1

UnityEyes Dataset

计算机图形学、虚拟现实和眼动追踪

三维坐标。三维数据集不可用原因:

1. 算法数据格式:左右相机图像+相机内外参+瞳孔三维坐标

2. tobii 提供的SDK接口无法直接操作摄像头输入,即使是数据集格式符合条件,也不具备可操作性

2

TEyeD

包含 2000 多万张图像,眼动数据集

二维坐标。二维数据集不符合3D精度要求

3

BioID Face Database

瞳孔检测和人脸识别的研究

4

MPIIGaze Dataset

瞳孔定位和视线追踪

5

UT Multiview Datase

多视图瞳孔数据,瞳孔追踪和检测

6

GazeCapture

不同摄像头和场景的眼睛追踪数据

开发数据集

编号

名称

用途及特点

备注

1

ColumnbiaGaze

眼动跟踪和注视点估计

-

2

GI4E

人眼瞳孔中心检测

3

MPIIFaceGaze

视线跟踪技术数据集

4

LFW

人脸识别的数据集

二维图像

5

UBIRIS v2

虹膜识别数据集

6

GazeCapture

不同摄像头和场景的眼睛追踪数据

二维坐标

论文参考

[1] Macneil R .Tracking the Closed Eye by Calibrating Electrooculography with Pupil-Corneal Reflection[J].  2020.DOI:10.14288/1.0394158.

[2] Fuhl W , Weber D , Kasneci E .Pistol: Pupil Invisible Supportive Tool to extract Pupil, Iris, Eye Opening, Eye Movements, Pupil and Iris Gaze Vector, and 2D as well as 3D Gaze[J].  2022.DOI:10.48550/arXiv.2201.06799.

[3] Ou W L , Kuo T L , Chang C C ,et al.Deep-Learning-Based Pupil Center Detection and Tracking Technology for Visible-Light Wearable Gaze Tracking Devices[J].Applied Sciences, 2021.DOI:10.3390/app11020851.

[4] Fei X , Zhang Y , Kong D ,et al.Quantitative Model Study of the Psychological Recovery Benefit of Landscape Environment Based on Eye Movement Tracking Technology[J].  2023.

[5]Diane C. Mézière, Yu L , Reichle E D ,et al.Using Eye‐Tracking Measures to Predict Reading Comprehension[J].Reading Research Quarterly, 2023, 58(3):425-449.

[6] Cheng S , Ping Q , Wang J ,et al.EasyGaze:Hybrid eye tracking approach for handheld mobile devices[J].虚拟现实与智能硬件(中英文), 2022(002):004.

人眼数据集通常用于眼部相关的计算机视觉、眼动追踪、瞳孔检测、情感识别以及生物特征识别等领域的研究和开发。以下是一些常见的人眼数据集:

  1. BioID Face Database: 这个数据库包含1,521张近距离的人脸图像,其中包括瞳孔位置的标记。它通常用于瞳孔检测和人脸识别的研究。

  2. Columbia Gaze Data Set: 这个数据集包含56名参与者的近距离肖像图像,每名参与者提供了9张图像,其中包括注视点的标记。这个数据集通常用于研究注视点估计。

  3. MPIIGaze Dataset: 这个数据集包括多个参与者的眼部图像,每个参与者在室内和室外环境下进行拍摄。它用于研究眼动追踪和注视点估计。

  4. UnityEyes Dataset: 这个数据集包括以3D模型生成的虚拟眼部图像。它通常用于眼动追踪和瞳孔检测的研究。

  5. GazeCapture Dataset: 该数据集包含来自移动设备的用户眼睛图像,被广泛用于研究用户的视线和注视点。

  6. UT Multiview Dataset: 这个数据集包含多视图图像,用于眼部特征提取和眼部运动研究。

这些数据集在不同研究领域和应用中都有其特定的用途。在研究中,根据需要选择一个适合的数据集,并确保遵守数据使用的相关规定和协议。这些数据集通常由学术界或研究机构提供,可以在它们的官方网站或研究论文中找到更多信息。

下载xml依赖-面部 眼部

https://github.com/opencv/opencv/blob/4.x/data/haarcascades/haarcascade_eye.xml

import cv2
import os

# 加载Haar级联分类器文件
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 打开本地视频文件
video_path = '1.mp4'
cap = cv2.VideoCapture(video_path)

# 检查视频是否成功打开
if not cap.isOpened():
    print("无法打开视频文件")
    exit()

# 创建目录用于保存分帧图片
output_dir = 'frames'
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

frame_count = 0
eye_detected_count = 0
face_detected_count = 0
frame_filename_list = []
frame_filename_no_eyes = []

while True:
    ret, frame = cap.read()
    if not ret:
        break

    frame_count += 1
    frame_filename = 0
    # 在每一帧上检测眼部
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    eyes = eye_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    if len(eyes) > 0:
        eye_detected_count += 1
        for (ex, ey, ew, eh) in eyes:
            # 在眼部位置显示红色点阵
            cv2.circle(frame, (ex + ew // 2, ey + eh // 2), 10, (0, 0, 255), -1)
    else:
        # 未检测到眼部的分帧图片
        frame_filename = os.path.join(output_dir, f'frame_{frame_count:04d}_no_eyes.jpg')
        cv2.imwrite(frame_filename, frame)
        frame_filename_no_eyes.append(frame_filename)

    # 在每一帧上检测面部
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

    if len(faces) > 0:
        face_detected_count += 1
        for (fx, fy, fw, fh) in faces:
            # 在面部位置显示绿色矩形
            cv2.rectangle(frame, (fx, fy), (fx + fw, fy + fh), (0, 255, 0), 2)

    cv2.imshow('Face and Eye Detection', frame)

    # 按Esc键退出检测窗口
    if cv2.waitKey(1) == 27:
        break

    # 保存分帧图片
    frame_filename = os.path.join(output_dir, f'frame_{frame_count:04d}.jpg')
    cv2.imwrite(frame_filename, frame)

# 释放视频捕获对象
cap.release()
cv2.destroyAllWindows()

# 打印统计信息
print(f"总帧数: {frame_count}")
print(f"检测到眼部的帧数: {eye_detected_count}")
print(f"检测到面部的帧数: {face_detected_count}")
print(f"未检测到眼部的图片数: {len(frame_filename_no_eyes)}")
print("未检测到眼部的图片名称:")
for filename in frame_filename_no_eyes:
    print(filename)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方狱兔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值