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. 安装依赖:

    ./install.sh
    # 或手动安装:
    pip install -r requirements.txt
    
  2. 设置环境变量:创建 .env 文件,填写必需的配置(MySQL、BOS、微信等)

  3. 启动服务:

    ./start_local.sh
    # 或直接运行:
    uvicorn app:app --host 0.0.0.0 --port 7860
    

Docker 部署

docker build -t picpocket:latest .
docker run -p 7860:7860 --env-file .env picpocket:latest

Dockerfile 已配置为兼容 HuggingFace Spaces 部署(见 README.md 元数据)。

生产环境(Gunicorn + Uvicorn)

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_LOGGINGLOG_LEVEL 环境变量可配置
  • 类型提示:使用 Pydantic 模型进行请求/响应验证
  • 异步/等待:FastAPI 和 aiomysql 提供完整的异步支持
  • 错误处理:AI 模型不可用时优雅降级
  • 代码风格:遵循 PEP 8,使用 ruffflake8 进行 lint(推断)

测试

测试文件位于 test/ 目录。运行方式:

pytest test/

常用命令

任务 命令
安装依赖 ./install.shpip install -r requirements.txt
启动服务(本地) ./start_local.shuvicorn app:app --reload
编译 Python 文件 ./build.shpython -m compileall .
运行测试 pytest test/
构建 Docker 镜像 docker build -t picpocket .
运行 Docker 容器 docker run -p 7860:7860 --env-file .env picpocket