# Picpocket(FaceScore 服务) ## 项目概述 Picpocket(又称 FaceScore)是一个基于 **Python、FastAPI 和多种深度学习模型**构建的 **AI 人脸识别与图像处理 REST API 服务**。它提供全面的人脸分析、图像增强和明星匹配等功能。 ### 核心功能 - **人脸分析**:颜值评分、年龄估算、性别识别、情绪识别(使用 DeepFace、YOLO、MediaPipe) - **图像增强**:照片修复(GFPGAN)、超分辨率(Real-ESRGAN)、图像上色(DDColor)、动漫风格化 - **背景移除**:rembg 和 RVM(鲁棒视频抠图)用于证件照处理 - **明星匹配**:与中国明星数据集进行人脸相似度比对 - **CLIP 搜索**:基于 cn_clip 的图文搜索和图图搜索 - **微信小程序集成**:访问令牌管理和 API 端点 - **定时清理**:通过 APScheduler 自动清理临时图片 - **多源存储**:支持本地文件系统和 BOS(百度对象存储 / Cloudflare R2) ### 主要技术栈 | 类别 | 技术 | |------|------| | **框架** | FastAPI、Uvicorn、Gunicorn | | **ML/DL** | PyTorch、TensorFlow/tf-keras、DeepFace、YOLO、MediaPipe、GFPGAN、Real-ESRGAN、DDColor、cn_clip | | **数据库** | MySQL(aiomysql 异步连接池) | | **存储** | BOS/S3(boto3)、本地文件系统 | | **调度** | APScheduler | | **容器化** | Docker(兼容 HuggingFace Spaces) | ## 项目结构 ``` picpocket/ ├── app.py # FastAPI 应用入口,生命周期管理 ├── api_routes.py # 所有 API 端点(5000+ 行),主要业务逻辑 ├── config.py # 配置、环境变量、兼容性补丁 ├── models.py # Pydantic 请求/响应模型 ├── database.py # MySQL 异步连接池和 CRUD 操作 ├── utils.py # 工具函数(图像处理、BOS 上传等) ├── face_analyzer.py # EnhancedFaceAnalyzer - 核心人脸分析编排 ├── facial_analyzer.py # FacialFeatureAnalyzer - 详细面部特征评分 ├── clip_utils.py # CLIP 编码用于文本/图像搜索 ├── vector_store.py # FAISS 向量存储用于 CLIP 嵌入 ├── gfpgan_restorer.py # GFPGAN 照片修复封装 ├── ddcolor_colorizer.py # DDColor 图像上色封装 ├── realesrgan_upscaler.py # Real-ESRGAN 超分辨率封装 ├── rembg_processor.py # rembg 背景移除封装 ├── rvm_processor.py # RVM(鲁棒视频抠图)封装 ├── anime_stylizer.py # 动漫风格迁移封装 ├── cleanup_scheduler.py # APScheduler 图像清理定时任务 ├── star_scraper.py # 明星数据网络爬虫 ├── region_code_utils.py # 地区/国家代码工具 ├── wx_access_token.py # 微信访问令牌管理 ├── requirements.txt # Python 依赖 ├── Dockerfile # Docker 镜像定义(兼容 HF Spaces) ├── build.sh # 构建脚本(编译 Python、移动产物) ├── install.sh # 本地开发安装脚本(使用清华镜像源) ├── start_local.sh # 本地启动脚本(Gunicorn) ├── sql/ # 数据库 schema 文件 ├── test/ # 测试文件 └── facelist-web/ # 前端 Web UI(可选,挂载于 /facelist) ``` ## 构建与运行 ### 本地开发 1. **安装依赖:** ```bash ./install.sh # 或手动安装: pip install -r requirements.txt ``` 2. **设置环境变量**:创建 `.env` 文件,填写必需的配置(MySQL、BOS、微信等) 3. **启动服务:** ```bash ./start_local.sh # 或直接运行: uvicorn app:app --host 0.0.0.0 --port 7860 ``` ### Docker 部署 ```bash docker build -t picpocket:latest . docker run -p 7860:7860 --env-file .env picpocket:latest ``` Dockerfile 已配置为兼容 **HuggingFace Spaces** 部署(见 README.md 元数据)。 ### 生产环境(Gunicorn + Uvicorn) ```bash gunicorn app:app \ -k uvicorn.workers.UvicornWorker \ -w 1 \ -b 0.0.0.0:7860 \ --timeout 120 ``` ### API 文档 服务启动后,可通过以下地址访问交互式 API 文档: - Swagger UI:`http://localhost:7860/cp_docs` - ReDoc:`http://localhost:7860/cp_redoc` ### 关键环境变量 | 变量 | 说明 | 默认值 | |------|------|--------| | `IMAGES_DIR` | 图片存储目录 | `/opt/data/images` | | `MODELS_PATH` | AI 模型目录 | `/opt/data/models` | | `MYSQL_HOST`, `MYSQL_PORT`, `MYSQL_DB`, `MYSQL_USER`, `MYSQL_PASSWORD` | MySQL 连接配置 | - | | `BOS_ACCESS_KEY`, `BOS_SECRET_KEY`, `BOS_ENDPOINT`, `BOS_BUCKET_NAME` | BOS/S3 存储配置 | - | | `WECHAT_APPID`, `WECHAT_SECRET` | 微信小程序凭证 | - | | `ENABLE_GFPGAN`, `ENABLE_DDCOLOR`, `ENABLE_REALESRGAN` 等 | 功能开关 | `true` | | `AUTO_INIT_*` | 懒加载 vs 预加载控制 | `false` | | `HUGGINGFACE_SYNC_ENABLED` | 启动时自动从 HF 同步模型 | `true` | ## 架构说明 ### 初始化策略 服务默认使用**懒加载**初始化 AI 模型(`AUTO_INIT_*` = `false`)。模型在首次使用时才加载,以减少启动时间和内存占用。生产环境可通过环境变量覆盖此行为。 ### 兼容性补丁 `config.py` 中包含大量兼容性补丁,用于解决: - **torchvision.functional_tensor**:缺失模块的变通方案 - **PyTorch ONNX/PyTree**:GFPGAN 和 ModelScope 兼容性 - **PyArrow**:扩展类型兼容性 - **TensorFlow/Keras**:DeepFace 中的 SymbolicTensor 处理 - **OpenMP/MKL**:CPU 线程优化 ### 数据库 Schema 服务使用 MySQL 配合异步连接池(`aiomysql`)。Schema 定义在 `sql/` 目录中,主要表包括: - 图片记录(路径、评分、分类) - 设备追踪(设备 ID、地区、应用版本) - 明星/名人数据(来自网络爬虫) ### 线程安全 CPU 密集型的人脸分析操作通过 `ThreadPoolExecutor` 卸载,避免阻塞异步事件循环。DeepFace 调用受 `asyncio.Lock` 保护,防止并发模型状态损坏。 ## 开发规范 - **日志**:通过 `ENABLE_LOGGING` 和 `LOG_LEVEL` 环境变量可配置 - **类型提示**:使用 Pydantic 模型进行请求/响应验证 - **异步/等待**:FastAPI 和 aiomysql 提供完整的异步支持 - **错误处理**:AI 模型不可用时优雅降级 - **代码风格**:遵循 PEP 8,使用 `ruff` 或 `flake8` 进行 lint(推断) ## 测试 测试文件位于 `test/` 目录。运行方式: ```bash pytest test/ ``` ## 常用命令 | 任务 | 命令 | |------|------| | 安装依赖 | `./install.sh` 或 `pip install -r requirements.txt` | | 启动服务(本地) | `./start_local.sh` 或 `uvicorn app:app --reload` | | 编译 Python 文件 | `./build.sh` 或 `python -m compileall .` | | 运行测试 | `pytest test/` | | 构建 Docker 镜像 | `docker build -t picpocket .` | | 运行 Docker 容器 | `docker run -p 7860:7860 --env-file .env picpocket` |