--- 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] 归档的手表测试图 ```