系列编排日期为 2026 年 8 月;正文依据 2026-10-12 核对的实现整理。历史实测保留真实日期,教学数字不代表实测;本次未重新执行板端推理。
返回系列目录 · 本篇为 14 章+4 份附录中的一篇。
为什么不能直接选择一个“遮挡模型”
项目的探索从人脸检测、坐标回归和局部响应开始,之后加入可见脸部分割、头部检测与物体复核。应当保留每次试验真正回答的问题,而不是只留下“通过/失败”两个结论。
| 探索路线 | 当时试图解决的问题 | 记录支持的限制 |
|---|---|---|
| InsightFace 106 点 | 定位五官,再观察遮挡 | 裁剪方式先有偏差;改正后坐标仍不能直接提供可见性 |
| PFLD 106 点 | 用轻量坐标回归替代复杂模型 | 所测试模型没有逐点可见性输出,被遮区域仍会预测点位 |
| MiniFASNet | 尝试借用活体分类输出 | 本地摄像头试验无法有效区分遮挡与正常,任务标签不匹配 |
| YuNet 单模型 | 建立稳定的人脸检测与预览入口 | 检测分数不是遮挡概率,检测成功不保证鼻嘴可见 |
| YuNet+PIPNet | 利用局部响应观察遮挡影响 | 暗光、小脸、姿态和纹理也会改变响应,不能单独证明遮挡 |
| 头部+YuNet+LUVLi | 引入位置不确定性与可见性相关输出 | 本地转换试验存在侧脸及不确定性数值偏差 |
| 头部+YuNet+PIPNet+U-Net | 将位置、响应和可见像素结合 | ROI 漂移和非遮挡低覆盖仍是关键问题 |
| 上述四模型+World | 给低覆盖或疑似遮挡补充物体证据 | 词表、漏检、量化分数漂移和二维重叠限制仍存在 |
这些记录不能推出“所有坐标模型都没用”或“市场上不存在可用模型”。它们说明的是:本地试过的模型输出,不能未经验证地替代所需的口鼻遮挡标签。
关键点为什么会在遮挡物上继续出现
坐标回归模型学习了五官相对结构。嘴被手遮住后,模型仍可能根据眼睛、轮廓及训练先验预测一组看起来合理的嘴部坐标。预测存在只是网络完成了前向计算,不意味着网络看到了嘴。
PIPNet 增加了可观察的响应图和邻居回归输出,但项目提取的 peak、gap 与分散度仍是工程证据。它们没有通过本项目的逐点可见性标注集校准为概率。
LUVLi 试验留下的经验
LUVLi 的研究目标包含关键点位置、不确定性及可见性估计,原始项目和论文可见 LUVLi 官方仓库。本项目考察的是已有权重在 Hi3516 转换后的输出一致性,不是重新训练该方法。
2026-09-17 的 REPAIR_NOTRAIN.md 记录:原始 IFMR 版本相对 PC ONNX 的正常脸平均点差约 1.089 px、侧脸约 13.932 px;等价池化且关闭层融合的版本约为 0.461 px、12.052 px,推理耗时由约 642 ms 增到约 912 ms。距离均在 256×256 裁剪坐标系中计算,参考是浮点网络,不是真实关键点标注。
用固定权重卷积与 ReLU 表达 MaxPool 的试验改善了部分数字,却没有消除侧脸偏差。另一个线性量化版本同时改变校准集和量化算法,效果更差也不能单独归因于“增加校准样本”。没有完成转换的混合精度候选,更不能写成已经测过准确率。
这段经历说明:转换器接受一个网络,与该网络关键输出保持可用数值,是两个需要分别验证的目标。
当前规则发生了什么变化
较早规则对姿态、整脸轮廓和局部点分散度具有较强依赖。当前 unet_first_then_response 优先计算鼻嘴 ROI,只要两者有效且覆盖均达标,就直接放行。
| 项目 | 当前含义 |
|---|---|
legacy_state |
同一帧输入经过旧规则得到的对照值,没有旧规则独立时序确认 |
state |
当前规则的结果,之后可能被时序层升级为侧向持续状态 |
unstable_landmarks |
局部分散度超过参考值,仍保留真实覆盖率 |
response_checked |
当前区域有效且覆盖不足,响应参与该区域判定 |
World 的 final_state |
保留原始状态,不是物体模型重新分类后的遮挡结论 |
新规则不是无条件更准确。它解决一类误报,也暴露出“关键点漂到其他皮肤区域仍获高覆盖”的风险。因此旧规则对照字段值得保留,用于找出状态变化发生在哪一步。
阅读历史文档时需要纠正的表述
早期测试记录将 PIPNet 输入写成 BGR,将响应峰值直接称为置信度,还把 8×8 响应图解释为量化造成的低分辨率。当前执行代码明确使用 RGB 与 ImageNet 归一化;8×8 来自本地模型的 256 输入和 stride 32,不能由此推断量化改变了空间尺寸。
FaceOcc 单模型资源文档曾建议常驻以减少加载开销,而后续完整链路为控制板端内存峰值采用串行加载卸载。两者对应不同实验范围,部署章节以当前 infer() 与 BoardNpu 实现为准。
历史文档称平台模型会进入安装目录;当前 PackApps.sh 又明确排除 Module。安装产物与 NAND 应用镜像并不相同,实际部署需准备 SD 卡模型目录。
如何固定文章对应版本
本次不虚构 Git 提交号,附录 C 用相对路径、字节数、SHA-256 保存关键源码、配置和模型基线。后续代码变化时,首先比较这些指纹,再核对阈值、输出结构和模型文件。只有文章日期而没有实现基线,几个月后很难重现一次判定。
历史入口:yunet_occlusion/遮挡检测模型测试记录.md、head_yunet_luvli/hi3516/REPAIR_NOTRAIN.md、head_pipnet_unet/README.md、GenerateTestTools/npu/CASCADE.md。其中未标明具体测试日期的早期观察,本系列不补造日期。
