Face_reg_app/FaceFeatureExtractorAPI/USER_GUIDE.md

12 KiB

人脸识别管理系统使用指南

🎯 系统简介

这是一个完整的人脸识别管理系统,支持:

  • Web后台注册: 通过Web管理后台注册用户
  • 后端存储: SQLite数据库集中存储用户特征
  • Android识别: Android设备直接调用后端识别API
  • 统一管理: 所有设备共享同一个用户库

📦 系统架构

┌─────────────────────────┐
│   Web管理后台           │
│   http://IP:8000/admin  │
│   - 注册用户            │
│   - 查看用户列表        │
│   - 删除用户            │
│   - 查看统计            │
└───────────┬─────────────┘
            │
            ↓
┌─────────────────────────┐
│   FastAPI后端服务       │
│   - 用户管理API         │
│   - 人脸识别API         │
│   - SQLite数据库        │
│   - 特征提取引擎        │
└───────────┬─────────────┘
            │
            ↓
    ┌───────┴────────┐
    ↓                ↓
┌─────────┐    ┌─────────┐
│Android1 │    │Android2 │
│ 识别    │    │ 识别    │
└─────────┘    └─────────┘

🚀 快速开始

步骤1: 安装后端依赖

cd E:\face\FaceFeatureExtractorAPI
pip install -r requirements.txt

步骤2: 启动后端服务

python app.py

预期输出:

🚀 启动服务: http://0.0.0.0:8000
📚 API文档: http://0.0.0.0:8000/docs
🎛️ 管理后台: http://0.0.0.0:8000/admin
INFO:     Uvicorn running on http://0.0.0.0:8000
✅ 数据库初始化完成

步骤3: 打开Web管理后台

在浏览器中访问: http://192.168.0.148:8000/admin

你会看到一个美观的管理界面:

  • 统计面板(用户数、识别次数等)
  • 用户注册表单
  • 用户列表

步骤4: 注册用户

在Web管理后台:

  1. 输入姓名(必填)
  2. 输入年龄(可选)
  3. 上传人脸照片
  4. 点击"注册用户"

提示:

  • 照片必须包含清晰的人脸
  • 支持jpg/png格式
  • 建议正面照,光线充足

步骤5: Android端识别

Android应用无需修改,保持原有功能:

  • 活体检测在本地完成
  • 识别时调用后端 /api/recognize 接口
  • 后端在数据库中查找匹配用户
  • 返回识别结果

🔧 API接口文档

1. 用户注册

POST /api/users/register

请求(multipart/form-data):

name: 张三 (必填)
age: 25 (可选)
image: [人脸照片文件] (必填)

响应:

{
  "success": true,
  "message": "用户 '张三' 注册成功",
  "user_id": 1,
  "user": {
    "id": 1,
    "name": "张三",
    "age": 25,
    "feature_dim": 1024,
    "photo_filename": "张三_20251020_143022.jpg",
    "created_at": "2025-10-20T14:30:22",
    "is_active": true
  }
}

2. 获取用户列表

GET /api/users/list?skip=0&limit=100&active_only=true

响应:

{
  "success": true,
  "message": "查询成功",
  "total": 10,
  "users": [
    {
      "id": 1,
      "name": "张三",
      "age": 25,
      "feature_dim": 1024,
      "photo_filename": "张三_20251020_143022.jpg",
      "created_at": "2025-10-20T14:30:22",
      "is_active": true
    }
  ]
}

3. 人脸识别 (核心接口)

POST /api/recognize

请求(multipart/form-data):

image: [待识别的人脸照片] (必填)
device_id: android_001 (可选)
threshold: 0.7 (可选,默认0.7)

响应(识别成功):

{
  "success": true,
  "message": "识别成功: 张三",
  "recognized": true,
  "user_id": 1,
  "user_name": "张三",
  "similarity": 0.8543,
  "threshold": 0.7,
  "processing_time": 0.52
}

响应(未识别):

{
  "success": true,
  "message": "未识别到注册用户 (最高相似度: 0.62)",
  "recognized": false,
  "similarity": 0.62,
  "threshold": 0.7,
  "processing_time": 0.48
}

4. 同步用户数据

GET /api/users/sync

返回所有用户的完整数据(包含特征向量),供Android端下载到本地

响应:

{
  "success": true,
  "message": "同步成功",
  "total": 10,
  "users": [
    {
      "id": 1,
      "name": "张三",
      "age": 25,
      "feature_dim": 1024,
      "feature": [0.123, 0.456, ..., 0.789],  // 1024维特征向量
      "photo_filename": "张三_20251020_143022.jpg",
      "created_at": "2025-10-20T14:30:22",
      "is_active": true
    }
  ]
}

5. 删除用户

DELETE /api/users/{user_id}

响应:

{
  "success": true,
  "message": "用户 '张三' 已删除"
}

注意:这是软删除,用户数据仍保留在数据库中,但is_active设置为false


6. 统计信息

GET /api/stats

响应:

{
  "success": true,
  "stats": {
    "total_users": 10,
    "total_recognitions": 100,
    "successful_recognitions": 85,
    "recognition_rate": 85.0
  }
}

📱 Android端修改(可选)

目前Android端已经兼容后端识别,无需修改。如果需要从Android端注册用户到后端,可以添加以下功能:

选项1: 保持当前模式(推荐)

  • Web后台注册 → 后端数据库
  • Android识别 → 调用后端 /api/recognize

选项2: Android也支持注册到后端

修改RegisterActivity.java,在注册成功后调用后端注册API:

// 在extractAndRegister方法的onSuccess中添加
NetworkManager.getInstance().registerUserToBackend(
    bitmap,
    name,
    1,  // age
    new NetworkManager.ApiCallback<>() {
        @Override
        public void onSuccess(RegisterResponse result) {
            Toast.makeText(RegisterActivity.this,
                "用户已同步到后端", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onFailure(String error) {
            Log.w(TAG, "后端同步失败: " + error);
        }
    }
);

🗂️ 数据库结构

users表

CREATE TABLE users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(100) NOT NULL UNIQUE,  -- 姓名
    age INTEGER,                         -- 年龄
    feature_vector BLOB NOT NULL,        -- 1024维特征(二进制)
    feature_dim INTEGER DEFAULT 1024,    -- 特征维度
    photo_filename VARCHAR(255),         -- 照片文件名
    created_at TIMESTAMP,                -- 创建时间
    updated_at TIMESTAMP,                -- 更新时间
    is_active BOOLEAN DEFAULT TRUE       -- 是否激活
);

recognition_logs表

CREATE TABLE recognition_logs (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    user_id INTEGER,                  -- 识别到的用户ID
    user_name VARCHAR(100),           -- 识别到的用户姓名
    device_id VARCHAR(100),           -- 设备ID
    similarity FLOAT,                 -- 相似度
    threshold FLOAT DEFAULT 0.7,      -- 阈值
    is_recognized BOOLEAN DEFAULT FALSE,  -- 是否识别成功
    recognized_at TIMESTAMP,          -- 识别时间
    photo_filename VARCHAR(255)       -- 识别时的照片
);

📂 目录结构

FaceFeatureExtractorAPI/
├── app.py                          # 主应用(V2.0)
├── database.py                     # 数据库模型
├── face_feature_extractor.py      # 特征提取器
├── admin.html                      # Web管理后台
├── requirements.txt                # Python依赖
├── face_recognition.db             # SQLite数据库(自动生成)
└── uploads/                        # 上传文件目录(自动生成)
    ├── photos/                     # 用户照片
    └── logs/                       # 识别记录照片

🧪 测试流程

1. 测试后端健康检查

curl http://192.168.0.148:8000/health

预期:

{
  "status": "healthy",
  "extractor_loaded": true,
  "database_connected": true,
  "total_users": 0
}

2. 测试Web注册

  1. 打开 http://192.168.0.148:8000/admin
  2. 填写姓名"测试用户"
  3. 上传一张人脸照片
  4. 点击"注册用户"
  5. 查看用户列表是否显示新用户

3. 测试API注册(使用Postman或curl)

curl -X POST http://192.168.0.148:8000/api/users/register \
  -F "name=测试用户" \
  -F "age=25" \
  -F "image=@/path/to/face.jpg"

4. 测试识别API

curl -X POST http://192.168.0.148:8000/api/recognize \
  -F "image=@/path/to/face.jpg" \
  -F "device_id=test_device" \
  -F "threshold=0.7"

5. 测试Android端

  1. 确保Android设备和电脑在同一WiFi
  2. 打开Android应用
  3. 点击"人脸识别"
  4. 对准摄像头
  5. 活体检测通过后自动识别
  6. 查看是否显示注册的用户姓名

⚙️ 配置选项

修改识别阈值

app.py 中搜索 threshold,修改默认值:

threshold: float = Form(0.7, description="识别阈值"),

或者在调用 /api/recognize 时传递自定义阈值:

threshold=0.75

修改数据库路径

database.py 中修改:

DATABASE_URL = "sqlite:///./face_recognition.db"

修改照片存储路径

app.py 中修改:

UPLOAD_DIR = Path("uploads")
PHOTOS_DIR = UPLOAD_DIR / "photos"

🔒 生产环境建议

  1. 使用HTTPS: 配置SSL证书,保护数据传输
  2. 使用PostgreSQL: 替换SQLite,提高并发性能
  3. 添加身份验证: API添加Token验证
  4. 数据备份: 定期备份数据库和照片
  5. 日志监控: 记录所有API请求和识别记录
  6. 限流保护: 防止恶意请求

🐛 故障排除

问题1: 数据库初始化失败

现象: 启动时报错 ImportError: cannot import name 'User' from 'database'

解决:

# 确保database.py存在且无语法错误
python -c "from database import User, init_database; init_database()"

问题2: 识别总是失败

检查:

  1. 后端是否有注册用户: 访问 /api/users/list
  2. 识别阈值是否过高: 尝试降低到 0.6
  3. 照片质量是否合格: 确保光线充足,人脸清晰

问题3: Android无法连接后端

检查:

  1. 电脑防火墙是否开放8000端口
  2. Android和电脑是否在同一WiFi
  3. IP地址是否正确配置
  4. Web API是否正在运行

📊 性能优化

数据库优化

-- 为常用查询添加索引
CREATE INDEX idx_users_name ON users(name);
CREATE INDEX idx_users_active ON users(is_active);
CREATE INDEX idx_logs_recognized_at ON recognition_logs(recognized_at);

特征向量缓存

# 在app.py中添加缓存(可选)
from functools import lru_cache

@lru_cache(maxsize=100)
def get_user_features_cached(user_id):
    # 缓存用户特征向量
    pass

📝 更新日志

V2.0.0 (2025-10-20)

  • 添加SQLite数据库支持
  • 实现用户注册API
  • 实现后端识别API
  • 创建Web管理后台
  • 添加识别日志记录
  • 支持统计功能
  • 支持用户同步

V1.0.0

  • 基础特征提取API
  • 特征对比API
  • 无状态服务

🆘 获取帮助

如果遇到问题:

  1. 查看后端日志: 终端输出
  2. 查看API文档: http://192.168.0.148:8000/docs
  3. 检查数据库: 使用SQLite浏览器打开 face_recognition.db
  4. 查看识别记录: 查询 recognition_logs

🎉 快速测试命令

# 1. 安装依赖
cd E:\face\FaceFeatureExtractorAPI
pip install -r requirements.txt

# 2. 启动服务
python app.py

# 3. 在浏览器打开管理后台
start http://192.168.0.148:8000/admin

# 4. 测试健康检查
curl http://192.168.0.148:8000/health

# 5. 查看用户列表
curl http://192.168.0.148:8000/api/users/list

# 6. 查看统计
curl http://192.168.0.148:8000/api/stats

现在可以开始使用了! 🚀