# APK assets `models/` holds the two face models, in LFS. `docker/android/assemble-apk.sh` copies them into the APK and `android_main` unpacks them to the shared models directory on first launch, which is the only way a phone can be handed a model at all — app-private storage has no user-reachable route into it, and the in-app fetch docs/faces.md §2.2 specifies is unbuilt. models/scrfd_500m_640.onnx 2.5 MB models/arcface_mbf_b1.onnx 13 MB **A clone without git-lfs gets a ~130-byte pointer file where each model should be.** `assemble-apk.sh` checks for exactly that and refuses, rather than bundling the pointer and failing inside tract on the device — the same guard `dr-segment`'s build script applies to `yolo26n-seg.onnx`. Fix it with `git lfs pull`. These are not what InsightFace ships. They came from `buffalo_sc.zip` and `buffalo_s.zip` on the InsightFace v0.7 release with their input dimensions pinned, because tract cannot parse either graph while they are dynamic: ./tools/fix-face-model-shapes.sh det_500m.onnx models/scrfd_500m_640.onnx --input input.1=1,3,640,640 ./tools/fix-face-model-shapes.sh w600k_mbf.onnx models/arcface_mbf_b1.onnx --dim None=1 The weights carry a non-commercial research-only grant. They are here because this is a private repository and a self-installed build; they come back out before anything is published, and the restriction binds whoever uses the app, not only the project. docs/faces.md §2.2a is the decision.