在数字时代,隐私保护已成为用户关注的焦点,尤其是在公共场所使用笔记本电脑时,肩窥(shoulder surfing)问题日益突出。EyesOff 项目通过构建一个轻量级 CNN 模型,实现实时眼屏接触检测,帮助用户及时察觉他人窥视屏幕,从而保护敏感信息。该模型的核心在于使用自定义数据集和从注视模型的迁移学习,确保在边缘设备上低延迟运行,同时维护数据隐私。本文将聚焦于该 CNN 模型的构建过程,探讨其技术实现、训练策略以及工程化部署要点,提供可落地的参数和清单,帮助开发者复现类似系统。
模型构建的核心观点:轻量级与实时性的平衡
EyesOff 的 CNN 模型设计强调轻量级架构,以适应 macOS 等边缘设备的资源限制,同时保证实时检测的准确率。传统大型模型如 Transformer 在隐私应用中往往需云端部署,引入数据泄露风险和延迟问题。相反,轻量级 CNN 通过迁移学习从预训练注视模型(如基于 EfficientNetB0)中继承特征提取能力,仅微调分类头,即可实现 71% 的中距离检测准确率。这种方法不仅降低了计算开销(模型参数约 5.3 百万),还确保所有处理本地化,避免云端传输。
证据显示,这种平衡在实际测试中有效:模型在近距离场景下准确率达 79%,中距离 71%,证明了其在肩窥场景下的实用性。相比 BlazeFace 等通用模型,EyesOff 的自定义 CNN 更注重眼部和头部姿态的细粒度分析,减少了误报。
证据支持:自定义数据集与两阶段训练
由于缺乏现成眼屏接触数据集,EyesOff 的开发者手动构建了 VCD(Video Conferencing Dataset)为基础的自定义数据集,包含 20k+ 图像。通过从 YouTube CC-BY 许可视频中提取帧,并使用 YuNet 进行人脸裁剪,开发者标注了“注视屏幕”(looking)和“非注视”(not looking)标签。数据集分布显示,注视类约占 60%,通过 POS 采样权重(计算公式:POS_weight = num_not_looking / num_looking)缓解类别不平衡。
训练采用两阶段策略。第一阶段:使用合成注视向量(从 OpenVINO 的 gaze_estimation_adas_0002 模型生成)进行回归预训练,冻结 EfficientNetB0 前 4 块(约 5% 参数),学习率 5e-5,权重衰减 1e-4,20 个 epoch 后 MAE 达 4.35°,优于基准 6°。第二阶段:冻结后 30% 参数,进行二分类微调,使用 BCEWithLogitsLoss,学习率 1e-5,20 个 epoch。测试集(close/mid/close_subtle)显示,预训练模型 F1 分数提升 10%以上。
引用开发者博客:“I trained a model for my app EyesOff, which detects when people are looking at your screen to protect you from shoulder surfing. With no existing dataset for this task, I hand-labelled 20k+ images for training and created synthetic gaze labels for pre-training. The final model achieves ~71% accuracy across close and mid-range distances.”[1]
这种证据证明,两阶段训练有效捕捉眼部方向与屏幕接触的关联,避免模型仅依赖面部外观。
可落地参数与工程化清单
要复现 EyesOff 式模型,开发者需关注数据集准备、训练超参数和部署优化。以下提供具体参数和清单,确保系统在低功耗设备上运行。
1. 数据集准备清单
- 来源选择:优先 VCD 数据集(160 个视频,视频会议场景),提取间隔帧(每 30 帧一帧,避免冗余)。补充 YouTube 高清视频(CC-BY 许可),目标 20k+ 图像。
- 预处理参数:
- 人脸检测:使用 YuNet(输入 340x340,检测阈值 0.5),裁剪眼部和头部(MediaPipe landmarks 输出 478 点)。
- 标注框架:二分类(looking: 直接/略偏向摄像头;not looking: 侧视/低头)。使用简单工具(如 Claude 构建的按键标注器),跳过模糊样本(约 10k 跳过,后续复审)。
- 增强:随机翻转、亮度调整(0.8-1.2),确保多样性。train-test 分割:按人脸 ID 分(避免同一人跨集)。
- 规模建议:初始 5k 图像测试,扩展至 15k+ 以提升中距离准确率。
2. 训练超参数
- 架构:EfficientNetB0 骨干(预训练 ImageNet),分类头:全局平均池化 + 2 类 softmax。
- 阶段 1(Gaze Regression):
- 损失:SmoothL1Loss。
- 优化器:AdamW,lr=5e-5,wd=1e-4。
- 批次:32,epoch=20,MAE 阈值 <6°。
- 数据:合成注视(pitch/yaw),从 selfie 和 driver 数据集生成。
- 阶段 2(Classification):
- 损失:BCEWithLogitsLoss + POS_weight(~0.67)。
- 优化器:AdamW,lr=1e-5,wd=1e-4。
- 批次:64,epoch=20。
- 评估:F1 分数 >70%,中距离优先。
- 硬件:CPU 训练(Intel i7),约 2-4 小时/阶段。使用 PyTorch,ONNX 导出优化。
3. 部署与监控清单
- 边缘集成:macOS app 使用 PyInstaller 打包(.app + .dmg),代码签名(Developer ID),公证(xcrun notarytool)。集成 OpenCV 运行 YuNet + CNN,帧率 15-30 FPS。
- 阈值参数:
- 脸部阈值:>1 张脸触发警报(可调 1-3)。
- 注视概率:>0.6 为 looking,超时 2s 无注视则警报。
- 距离估计:基于脸部像素占比(<10% 为远距离,调整置信阈值 0.4)。
- 监控要点:
- 性能:CPU <20%,电池影响 <5%/小时。使用 Instruments 工具监控。
- 回滚策略:若准确率 <65%,回退至 MediaPipe 启发式(头部姿态阈值 yaw<15°)。
- 隐私审计:所有数据本地,日志无图像存储。开源 YuNet 确保透明。
- 优化清单:
- 量化模型(INT8),减少 50% 推理时间。
- 多线程:YuNet 检测 + CNN 分类并行。
- UI 集成:PyQt 警报窗口,阈值滑块调整。
- 测试:模拟肩窥场景(1-2m 距离),A/B 测试准确率。
通过以上参数,开发者可快速构建类似系统。EyesOff 的成功在于将 AI 隐私应用落地,未来可扩展至 Windows/Linux,支持多模型融合提升鲁棒性。
资料来源