diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 5c40b9b..0000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -app/src/main/assets/face_models/*.csta filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore index 3bdf240..fb90cdf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .DS_Store +._codex_tmp/ .idea/ .gradle/ *.iml @@ -9,3 +10,4 @@ sdk-demo/ *.apk *.ap_ keystore/ +app/src/main/assets/face_models/face_recognizer.csta diff --git a/README.md b/README.md index 1b67a28..2bcb0bf 100644 --- a/README.md +++ b/README.md @@ -37,15 +37,24 @@ build.sh 无 Gradle 手动构建脚本 - `platforms/android-28/android.jar` - `build-tools/34.0.0` - JDK 8 或兼容 `javac --release 8` 的 JDK -- Git LFS(仓库中的 SeetaFace6 `.csta` 模型通过 LFS 管理) - Android SDK platform-tools,用于 `adb install` +内网仓库限制单文件最大 50MB,因此约 98MB 的 +`face_recognizer.csta` 保存为 `model-parts/` 下的四个分片。 +`build.sh` 会在编译前自动校验 SHA-256 并恢复完整模型,无需手动合并。 + ## 构建 APK ```bash bash build.sh ``` +如果只需要恢复或校验人脸模型,可单独执行: + +```bash +bash scripts/restore-face-models.sh +``` + 构建产物: ```text diff --git a/app/src/main/assets/face_models/face_detector.csta b/app/src/main/assets/face_models/face_detector.csta index 4072b8c..5f73a43 100644 Binary files a/app/src/main/assets/face_models/face_detector.csta and b/app/src/main/assets/face_models/face_detector.csta differ diff --git a/app/src/main/assets/face_models/face_landmarker_pts5.csta b/app/src/main/assets/face_models/face_landmarker_pts5.csta index 9ae3f3d..6bc1b40 100644 Binary files a/app/src/main/assets/face_models/face_landmarker_pts5.csta and b/app/src/main/assets/face_models/face_landmarker_pts5.csta differ diff --git a/app/src/main/assets/face_models/face_recognizer.csta b/app/src/main/assets/face_models/face_recognizer.csta deleted file mode 100644 index 649f39a..0000000 --- a/app/src/main/assets/face_models/face_recognizer.csta +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cefce29d2ceb6fd95153d67c11f24ce08746e1877478bacaa5ae5d333a0a670 -size 102551956 diff --git a/build.sh b/build.sh index 3c14883..02c04be 100755 --- a/build.sh +++ b/build.sh @@ -42,6 +42,9 @@ echo "Platform: android-28" echo "Project: $PROJECT" echo "" +# ---- 恢复超过 Git 单文件限制的人脸模型 ---- +"$PROJECT/scripts/restore-face-models.sh" + # ---- Debug 签名证书 ---- if [ ! -f "$KEYSTORE" ]; then echo "未找到 debug keystore,正在生成: $KEYSTORE" diff --git a/model-parts/face_recognizer.csta.part-aa b/model-parts/face_recognizer.csta.part-aa new file mode 100644 index 0000000..e26e514 Binary files /dev/null and b/model-parts/face_recognizer.csta.part-aa differ diff --git a/model-parts/face_recognizer.csta.part-ab b/model-parts/face_recognizer.csta.part-ab new file mode 100644 index 0000000..82ff0e3 Binary files /dev/null and b/model-parts/face_recognizer.csta.part-ab differ diff --git a/model-parts/face_recognizer.csta.part-ac b/model-parts/face_recognizer.csta.part-ac new file mode 100644 index 0000000..0df1157 Binary files /dev/null and b/model-parts/face_recognizer.csta.part-ac differ diff --git a/model-parts/face_recognizer.csta.part-ad b/model-parts/face_recognizer.csta.part-ad new file mode 100644 index 0000000..7b8ee9a Binary files /dev/null and b/model-parts/face_recognizer.csta.part-ad differ diff --git a/scripts/restore-face-models.sh b/scripts/restore-face-models.sh new file mode 100755 index 0000000..5e66512 --- /dev/null +++ b/scripts/restore-face-models.sh @@ -0,0 +1,51 @@ +#!/bin/sh +# 将 Git 中的小于 50MB 分片恢复为 SeetaFace6 识别模型。 +set -eu + +PROJECT_DIR=$(CDPATH= cd -- "$(dirname "$0")/.." && pwd) +MODEL_FILE="$PROJECT_DIR/app/src/main/assets/face_models/face_recognizer.csta" +PART_DIR="$PROJECT_DIR/model-parts" +PART_PATTERN="$PART_DIR/face_recognizer.csta.part-" +EXPECTED_SHA256="3cefce29d2ceb6fd95153d67c11f24ce08746e1877478bacaa5ae5d333a0a670" + +sha256_file() { + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$1" | awk '{print $1}' + elif command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$1" | awk '{print $1}' + else + echo "错误:系统缺少 sha256sum 或 shasum,无法校验模型。" >&2 + return 1 + fi +} + +if [ -f "$MODEL_FILE" ]; then + CURRENT_SHA256=$(sha256_file "$MODEL_FILE") + if [ "$CURRENT_SHA256" = "$EXPECTED_SHA256" ]; then + echo "人脸识别模型已存在且校验通过。" + exit 0 + fi + echo "检测到损坏或版本不匹配的人脸识别模型,将从分片重新恢复。" +fi + +if ! ls "${PART_PATTERN}"* >/dev/null 2>&1; then + echo "错误:未找到人脸识别模型分片:${PART_PATTERN}*" >&2 + exit 1 +fi + +mkdir -p "$(dirname "$MODEL_FILE")" +TEMP_FILE=$(mktemp "${MODEL_FILE}.tmp.XXXXXX") +trap 'rm -f "$TEMP_FILE"' EXIT HUP INT TERM + +cat "${PART_PATTERN}"* > "$TEMP_FILE" +ACTUAL_SHA256=$(sha256_file "$TEMP_FILE") +if [ "$ACTUAL_SHA256" != "$EXPECTED_SHA256" ]; then + echo "错误:模型分片合并后的 SHA-256 校验失败。" >&2 + echo "期望:$EXPECTED_SHA256" >&2 + echo "实际:$ACTUAL_SHA256" >&2 + exit 1 +fi + +mv "$TEMP_FILE" "$MODEL_FILE" +trap - EXIT HUP INT TERM +echo "人脸识别模型恢复完成:$MODEL_FILE"