83 lines
4.8 KiB
Markdown
83 lines
4.8 KiB
Markdown
---
|
||
name: 修复分类模型手表识别错误
|
||
overview: 优化 Fashion-CLIP 分类服务的零样本提示词(大类「配饰」覆盖手表、强化「手表」子类别特征、纠正与「鞋/手链」的混淆),重启分类服务并用手表测试图验证识别结果。
|
||
todos:
|
||
- id: tune-prompts
|
||
content: 优化 main.py 大类「配饰/鞋」与配饰组「手表/手链」提示词
|
||
status: completed
|
||
- id: restart-service
|
||
content: 重启分类服务进程并轮询健康检查直至恢复
|
||
status: completed
|
||
dependencies:
|
||
- tune-prompts
|
||
- id: verify-regression
|
||
content: 用测试图验证手表识别并回归验证正常衣物分类不受影响
|
||
status: completed
|
||
dependencies:
|
||
- restart-service
|
||
- id: iterate-archive
|
||
content: 按验证结果迭代微调提示词并归档测试图到 resources
|
||
status: completed
|
||
dependencies:
|
||
- verify-regression
|
||
---
|
||
|
||
## 产品概述
|
||
|
||
修复衣柜小程序的衣物分类模型无法识别「手表」的问题。实测复现:上传手表图片后,分类服务将手表误识别为「鞋」大类(置信度 0.9471),正确大类「配饰」仅 0.0013,导致子类别轮不到「手表」。
|
||
|
||
## 核心功能
|
||
|
||
- 手表图片分类结果正确:大类输出「配饰」、子类别输出「手表」
|
||
- 正常衣物图片分类结果不受影响(回归基线:上装/衬衫)
|
||
- 分类服务重启后健康检查恢复,上传→抠图→分类链路保持正常
|
||
|
||
## 技术栈
|
||
|
||
- 分类服务:Python FastAPI + transformers + patrickjohncyh/fashion-clip(零样本 CLIP 分类,端口 8000)
|
||
- 修改范围:仅 `thirdparty/classification_server/main.py` 的提示词字典,不改推理逻辑、响应结构、后端 Go 代码
|
||
|
||
## 实现方案
|
||
|
||
采用零样本 CLIP 提示词工程修复,三处针对性调整:
|
||
|
||
1. **大类「配饰」提示词**(`CATEGORY_PROMPTS`,第 47 行):加入 watch/wristwatch 描述,强化「小而独立的腕部配饰、非衣物主体」语义,补齐手表完全未覆盖的问题。
|
||
2. **大类「鞋」提示词**(第 46 行):补充强视觉特征(成双出现 pair、鞋底 sole、包裹脚的立体鞋型),压低手表白底商品图与「鞋」的相似度;微调幅度保守,避免影响正常鞋类识别。
|
||
3. **「配饰」组内子类别提示词**(`SUBCATEGORY_GROUPS["配饰"]`,第 115、122 行):
|
||
|
||
- 「手表」强化表盘特征:round watch face、circular dial with numerals and hands、crown、metal or leather strap;
|
||
- 「手链」显式排除表盘:no watch face、no dial、purely decorative,消除两者互选错误。
|
||
|
||
关键决策:
|
||
|
||
- 只改提示词字符串,每组 label 数量不变,单次前向 batch 规模不变,推理性能无变化;
|
||
- 响应 JSON 字段结构不变,`pkg/classification/classification.go` 与 `internal/service/clothes.go` 无需改动,完全向后兼容;
|
||
- 大类修复与子类别修复同步完成,一次生效,避免「大类对了但子类错」的二次返工。
|
||
|
||
## 实施细节
|
||
|
||
### 服务重启流程(已实测进程信息)
|
||
|
||
- 当前分类服务 PID 3156827,cwd=/root/zt-closet-backend,启动命令 `thirdparty/matting_server/.venv/bin/python thirdparty/classification_server/main.py`(复用 matting_server 的 .venv,无 systemd 托管;模型在模块 import 时加载,改代码必须重启)。
|
||
- 重启方式:kill 3156827 后,在项目根目录按原解释器与原命令用 nohup 拉起,日志重定向到 `storage/logs/classification.log`;轮询 `curl http://127.0.0.1:8000/healthz` 直至返回 ok(模型重载约 1 分钟)。
|
||
- 严禁误动抠图服务 PID 3144600(cwd=thirdparty/matting_server)。
|
||
- 重启窗口内后端有 retryCall(MaxRetry=3)兜底,短暂不可用影响可控。
|
||
|
||
### 验证与回归
|
||
|
||
- 手表测试图 `/root/zt-closet-backend/0d98288268054879d481a7bb1d2dd7af.jpg`:期望 category_main=配饰、category_sub=手表;
|
||
- 回归图 `resources/微信图片_20260907235100_780_53.jpg`:期望维持 category_main=上装、category_sub=衬衫(当前基线 0.5028/0.5024);
|
||
- 若验证不达标,迭代微调提示词措辞(最多 2~3 轮),每轮重启后重测。
|
||
|
||
### 目录结构
|
||
|
||
```
|
||
/root/zt-closet-backend/
|
||
├── thirdparty/classification_server/
|
||
│ └── main.py # [MODIFY] 修改 CATEGORY_PROMPTS 的「配饰」「鞋」提示词,及 SUBCATEGORY_GROUPS["配饰"] 的「手表」「手链」提示词
|
||
├── storage/logs/classification.log # [NEW] 重启后的分类服务日志(nohup 重定向)
|
||
├── 0d98288268054879d481a7bb1d2dd7af.jpg # [MOVE] 验证通过后移入 resources/ 留作回归样本
|
||
└── resources/
|
||
├── 微信图片_20260907235100_780_53.jpg # [不变] 回归验证用正常衣物图
|
||
└── 0d98288268054879d481a7bb1d2dd7af.jpg # [NEW] 归档的手表测试图
|
||
``` |