picpocket / QWEN.md
chawin.chen
fix start
fb9218b
# 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` |