4.8 KiB
4.8 KiB
name, overview, todos
| name | overview | todos | |||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 修复分类模型手表识别错误 | 优化 Fashion-CLIP 分类服务的零样本提示词(大类「配饰」覆盖手表、强化「手表」子类别特征、纠正与「鞋/手链」的混淆),重启分类服务并用手表测试图验证识别结果。 |
|
产品概述
修复衣柜小程序的衣物分类模型无法识别「手表」的问题。实测复现:上传手表图片后,分类服务将手表误识别为「鞋」大类(置信度 0.9471),正确大类「配饰」仅 0.0013,导致子类别轮不到「手表」。
核心功能
- 手表图片分类结果正确:大类输出「配饰」、子类别输出「手表」
- 正常衣物图片分类结果不受影响(回归基线:上装/衬衫)
- 分类服务重启后健康检查恢复,上传→抠图→分类链路保持正常
技术栈
- 分类服务:Python FastAPI + transformers + patrickjohncyh/fashion-clip(零样本 CLIP 分类,端口 8000)
- 修改范围:仅
thirdparty/classification_server/main.py的提示词字典,不改推理逻辑、响应结构、后端 Go 代码
实现方案
采用零样本 CLIP 提示词工程修复,三处针对性调整:
- 大类「配饰」提示词(
CATEGORY_PROMPTS,第 47 行):加入 watch/wristwatch 描述,强化「小而独立的腕部配饰、非衣物主体」语义,补齐手表完全未覆盖的问题。 - 大类「鞋」提示词(第 46 行):补充强视觉特征(成双出现 pair、鞋底 sole、包裹脚的立体鞋型),压低手表白底商品图与「鞋」的相似度;微调幅度保守,避免影响正常鞋类识别。
- 「配饰」组内子类别提示词(
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] 归档的手表测试图