Files
zt-closet-backend/.codebuddy/plans/修复分类模型手表识别错误_0588c8ee.md
2026-09-11 01:41:52 +08:00

4.8 KiB
Raw Permalink Blame History

name, overview, todos
name overview todos
修复分类模型手表识别错误 优化 Fashion-CLIP 分类服务的零样本提示词(大类「配饰」覆盖手表、强化「手表」子类别特征、纠正与「鞋/手链」的混淆),重启分类服务并用手表测试图验证识别结果。
id content status
tune-prompts 优化 main.py 大类「配饰/鞋」与配饰组「手表/手链」提示词 completed
id content status dependencies
restart-service 重启分类服务进程并轮询健康检查直至恢复 completed
tune-prompts
id content status dependencies
verify-regression 用测试图验证手表识别并回归验证正常衣物分类不受影响 completed
restart-service
id content status dependencies
iterate-archive 按验证结果迭代微调提示词并归档测试图到 resources completed
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] 归档的手表测试图