# LiteRT / MobileFaceNet 人脸特征模型

## 文件

```
myFaceSDK/src/main/assets/myface/face_embedder.tflite
```

当前仓库已放入 MobileFaceNet（约 5MB，输出 192 维）。

## 叠加层 GIF（相机 preview overlay）

放在 assets 根目录（与门禁一致）：

```
face_vef.gif   # previewShape=circle
face.gif       # previewShape=square
face_rect.gif  # previewShape=rect
```

`overlayGifPath: "auto"` 时按形状自动选择；也可传具体文件名。

## 预处理约定（与模型配套，勿改错）

- 输入：`1x112x112x3` float32 RGB NHWC
- 归一化：`(pixel - 128) / 128`（约 [-1, 1]），**不是** `/255`
- 输出：`1x192` float32；代码侧 L2 归一化后余弦比对
- 运行时：`com.google.ai.edge.litert:litert:1.2.0`
- `app/build.gradle` 已设 `aaptOptions { noCompress 'tflite' }`

## 换模型后必做

旧库若是 LocalFaceEmbedder（128 维网格特征），与 192 维模型**不能混用**。

请在「自研人脸调试」页：**清空库 → 重新同步/录入 → 再实时识别**。

## Logcat 确认

过滤 `LitertFaceEmbedder`：

- 成功：`LiteRT ok in=112x112x3 outDim=192 norm=(p-128)/128`
- 失败：`no_model fallback local` / `shape_mismatch`
