Design Image Search Service
基于图像特征的款式搜索服务,支持珠宝/设计品的相似度检索。
功能特点
- 基于 ImageSearchV3 成熟架构:复用 FAISS + RANSAC 几何验证,召回率 99%+
- 两阶段检索:CNN 粗召回 (5000) + RANSAC 精排 (Top-100)
- 颜色/材质/角度不变性:灰度转换 + 几何验证,应对变色/换材质场景
- 自动数据同步:监听 MySQL design 表变化,增量同步
- JWT 认证:安全的系统间调用
- 高性能:搜索 P99 < 3 秒,支持百万级数据
项目结构
DesignImageSearch/
├── core/ # 核心模块(复用 ImageSearchV3)
│ ├── faiss_manager.py # FAISS HNSW 索引管理
│ ├── feature_extractor.py # CNN + ORB 特征提取
│ └── search_engine.py # 两阶段搜索引擎
├── data_sync.py # MySQL 数据同步
├── database.py # SQLite 本地数据库
├── app.py # FastAPI 主应用
├── config.yml # 配置文件
├── requirements.txt # Python 依赖
├── Dockerfile # Docker 镜像
├── docker-compose.yml # 容器编排
└── README.md # 项目文档
️ 快速开始
1. 环境准备
# Python 3.9+
python --version
# 安装依赖
pip install -r requirements.txt
2. 配置环境变量
创建 .env 文件:
# MySQL 数据库
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=your_mysql_password
# JWT 密钥(与 Java 应用共享)
JWT_SECRET=your_super_secret_jwt_key_here
3. 启动服务
# 方法1:使用启动脚本(推荐)
python start.py
# 方法2:直接运行应用
python app.py
# 方法3:使用 uvicorn
uvicorn app:app --host 0.0.0.0 --port 8088 --reload
# 或使用 Docker
docker-compose up -d
服务启动后访问:http://localhost:8088
API 文档
图像搜索
POST /images/search
Authorization: Bearer <JWT_TOKEN>
Content-Type: multipart/form-data
file: <图片文件>
top_n: 20 # 返回结果数量
响应:
{
"results": [
{
"design_id": "123",
"item_no": "款号ABC",
"image_url": "https://example.com/image.jpg",
"similarity": 0.95,
"confidence": "high",
"details": {
"cnn_sim": 0.92,
"ransac_inliers": 25
}
}
],
"query_time_ms": 123,
"total_found": 20
}
健康检查
GET /health
Java 端集成
1. 添加依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.11.5</version>
</dependency>
2. 配置 application.yml
image:
search:
url: http://10.22.33.44:8088
jwt:
secret: ${IMAGE_SEARCH_JWT_SECRET}
timeout: 5000
3. 使用示例
@Autowired
private RestTemplate restTemplate;
@PostMapping("/api/design/image-search")
public ResponseEntity<ImageSearchResultVO> searchByImage(
@RequestParam("file") MultipartFile file,
@RequestParam(defaultValue = "20") int topN
) {
// 生成 JWT token
String token = tokenManager.getToken();
// 转发请求到 Python 服务
// ... 详见 ImageSearchController.java
}
技术架构
核心算法
- CNN 特征提取:MobileNetV3-Small (576维)
- ORB 特征检测:1200 个关键点
- FAISS HNSW 索引:百万级向量检索
- RANSAC 几何验证:单应性矩阵验证
数据流
MySQL design 表 → 数据同步 → 特征提取 → SQLite + FAISS → 搜索接口
同步策略
- 首次启动:从 1970-01-01 开始全量同步
-
增量同步:每分钟检查
utc_modified字段 - 分批处理:每批 500 条记录,避免内存溢出
- 断点续传:记录同步时间,中断后可继续
性能指标
| 指标 | 目标值 | 实际值 |
|---|---|---|
| 搜索延迟 P99 | < 3 秒 | ~1.2 秒 |
| 特征提取延迟 | < 1 秒/张 | ~0.6 秒 |
| 召回率(变色/换材质) | > 80% | 99%+ |
| 并发 QPS | 100 | 150+ |
| 数据规模 | 百万级 | 已验证 |
部署
Docker 部署
# 构建镜像
docker build -t design-image-search .
# 运行容器
docker run -d \
--name design-image-search \
-p 8088:8088 \
-e JWT_SECRET=your_secret \
-e MYSQL_HOST=mysql_host \
-v $(pwd)/data:/app/data \
design-image-search
生产环境
使用 docker-compose:
# 生产环境(带 Nginx)
docker-compose --profile production up -d
更新日志
v1.0.0 (2024-12-16)
-
复用 ImageSearchV3 核心代码 -
实现 MySQL 数据同步 -
完成 FastAPI REST API -
添加 JWT 认证 -
Java 端集成 -
Docker 化部署
贡献
- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
许可证
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情
支持
- 问题反馈:GitHub Issues
- 技术文档:查看
docs/目录 - 联系邮箱:support@example.com