--- name: classify-service-align-clothes-model overview: 根据 mysqlmodel.Clothes 的 15 个分类维度字段,全面重构 thirdparty/classification_server/main.py 分类服务:所有维度(含已有)的 prompt 大幅扩充至全面覆盖各种情况,补齐 8 个缺失分类维度,响应字段命名与 model 对齐,并将多次模型前向推理合并为单次批量前向以提升性能。 todos: - id: expand-existing-prompts content: 扩充已有 6 组 prompt:颜色至 30、子类别至约 60、风格至 25、版型加直筒、材质至 17、图案至 19,全部配详细英文视觉描述 status: completed - id: add-new-dimension-prompts content: 新增 7 组维度 prompt(厚度/袖型/衣长/领型/正式度/场合/视觉冲击)、维度适用性映射表与副颜色阈值常量 status: completed dependencies: - expand-existing-prompts - id: implement-batch-forward content: 实现 _classify_all 单次批量前向:按组 softmax、子类别按大类过滤、副颜色 top-2 阈值提取 status: completed dependencies: - add-new-dimension-prompts - id: rewrite-classify-api content: 重写 /classify 接口:响应字段对齐 Clothes 模型命名、不适用维度置空、occasions top-N 逗号连接、formality 与 visual_impact 返回数字加标签 status: completed dependencies: - implement-batch-forward - id: preprocess-verify content: 优化图片预处理(仅透明图合成白底)并运行 Python 语法检查与启动自检验证 status: completed dependencies: - rewrite-classify-api --- ## 产品概述 根据 `mysqlmodel.Clothes` 的 15 个分类维度字段,全面优化 Fashion-CLIP 衣物分类服务(`thirdparty/classification_server/main.py`):不仅补齐缺失维度,所有已有维度的 prompt 也要大幅扩充细化,覆盖各种衣物边界情况(多色拼色、稀有颜色、特殊袖型领型、加厚冬装、各类场合等),同时将推理从逐组多次前向合并为单次批量前向,响应字段与模型命名完全对齐。 ## 核心功能 - **已有 prompt 全面扩充**:颜色扩至 30+(新增玫红/荧光/墨绿/宝蓝/驼色/砖红等),子类别扩至约 60 个(补针织衫/工装裤/喇叭裤/玛丽珍鞋/马丁靴/发带/戒指/胸针/手表等),风格扩至 25 个(补极简/波西米亚/朋克/嘻哈/森系/法式/日系/韩系等),材质扩至 17 个(补天鹅绒/缎面/网纱/羊羔绒/PU皮/磨毛棉),图案扩至 19 个(补千鸟格/菱格纹/人字纹/拼色块/渐变/豹纹/几何/logo等) - **补齐 8 个缺失维度**:副颜色(color_sub,颜色 top-2 阈值提取)、厚度(4 档)、袖型(8 档)、衣长类型(5 档)、领型(10 档)、正式程度(1-5)、适用场合(10 档 top-N)、视觉冲击力(1-5) - **单次批量前向**:约 210 个文本合并为一次模型前向,按组 softmax,推理耗时从 15 次降为 1 次 - **品类适用性控制**:鞋/配饰等品类的不适用维度自动置空,避免不合理标签 - **响应对齐模型**:category_main/category_sub/color_main/color_sub/thickness/version/material/pattern/sleeve_type/clothes_type/neckline_type/formality/occasions/visual_impact,均附 *_confidence,details 保留 Top-5 明细 ## 边界说明 - 改动仅限 `thirdparty/classification_server/main.py` 单文件,Go 侧无消费方,字段改名无破坏风险 - 多色衣物通过 color_sub 副颜色机制表达,颜色组内不放"多色"标签避免抢占主色 - 所有 prompt 沿用"中文标签键 + 详细英文视觉描述值"模式,英文描述包含剪裁、长度、材质视觉特征 ## 技术栈 - 沿用现有:Python 3 + FastAPI + Transformers(patrickjohncyh/fashion-clip)+ PyTorch,不引入新依赖 ## 实现方案 ### 核心策略 1. **Prompt 维度全覆盖**:已有 6 组 prompt 扩充 + 新增 7 组维度 prompt,全部收敛为统一 dict 结构 2. **单次批量前向**:新增 `_classify_all`,全部组(约 210 个文本)拼一个 batch 一次推理,输出 logits 按组 start/end 边界切分后分别 softmax 3. **子类别等价合并**:所有大类子类别合并进同一批前向,大类确定后在其组内取 top1——同组内相对分数不变,argmax 与当前两阶段方案数学等价 4. **适用性映射**:`DIMENSION_APPLICABILITY` 表声明各维度适用的大类,不适用直接返回空字符串 5. **副颜色逻辑**:颜色组 top-2,第二置信度达到阈值(top1 的 40% 与绝对值 0.15 取较低者)才输出 color_sub ```mermaid flowchart LR A[图片上传] --> B[预处理: 仅透明图合成白底] B --> C[一次前向: 全部维度约210文本拼batch] C --> D[按组softmax归一化] D --> E[大类 top1] E --> F[子类别: 大类组内 top1] E --> G[颜色 top1/top2 主色/副色] E --> H[其余维度 top1 或 top-N] H --> I[适用性映射: 不适用置空] F --> J[响应字段对齐 model] G --> J I --> J ``` ### Prompt 扩充清单(各组完整标签与描述规范) **CATEGORY_PROMPTS(6 类,保持)**:上装/下装/连衣裙/外套/鞋/配饰。描述要点:明确穿着部位与廓形边界(如连衣裙强调"从肩到腿一件式",配饰强调"非服装的小件")。 **SUBCATEGORY_GROUPS(约 60 个)** - 上装(10):T恤/衬衫/卫衣/毛衣/针织衫/背心/Polo衫/开衫/吊带衫/打底衫 - 下装(10):牛仔裤/休闲裤/运动裤/短裤/半身裙/阔腿裤/西装裤/鲨鱼裤/工装裤/喇叭裤 - 连衣裙(7):连衣短裙/连衣长裙/吊带裙/衬衫连衣裙/针织连衣裙/雪纺连衣裙/西装连衣裙 - 外套(9):夹克/西装外套/风衣/羽绒服/大衣/马甲/牛仔外套/皮衣/棉服 - 鞋(11):运动鞋/皮鞋/凉鞋/靴子/帆布鞋/高跟鞋/乐福鞋/外穿拖鞋/玛丽珍鞋/洞洞鞋/马丁靴 - 配饰(13):帽子/围巾/腰带/墨镜/项链/手链/包包/耳饰/丝巾/发带/戒指/胸针/手表 描述规范:每条必须包含款式特征词(领型/口袋/闭合方式/鞋面结构等)+ 材质质感词 + 穿着场景词,如针织衫需区分"ribbed knit texture, pullover without buttons"与卫衣的"fleece fabric, hood, kangaroo pocket"。 **COLOR_PROMPTS(30 个)** 原有 20:黑/白/红/绿/黄/粉/紫/灰/棕/橙/卡其/米/杏/焦糖/藏青/天蓝/军绿/酒红/金/银 新增 10:玫红/荧光色/墨绿/宝蓝/浅蓝/粉紫/驼色/砖红/藏蓝/浅灰 描述规范:新增颜色需给出色相 + 明度 + 饱和度描述(如宝蓝"bright vivid royal blue, saturated deep bright blue",浅蓝"light pale blue, soft pastel sky tone");金色/银色强调 metallic 金属光泽;荧光色强调 neon 高饱和度。 **STYLE_PROMPTS(25 个)** 原有 16:休闲/通勤/运动/街头/优雅/甜美/复古/简约/商务正装/轻熟/工装/学院/甜酷/辣妹/度假/新中式 新增 9:极简风/波西米亚风/朋克风/嘻哈风/森系风/法式风/美式复古风/日系风/韩系风 描述规范:每条包含整体气质 + 典型元素(如波西米亚"flowy fabric, fringe, ethnic embroidery, relaxed silhouette";朋克"black leather, studs, ripped details, rebellious look")。 **FIT_PROMPTS(6 个)**:宽松/修身/阔腿/紧身/常规合身/直筒。描述强调廓形与身体关系(hugs body / straight parallel legs / oversized)。 **MATERIAL_PROMPTS(17 个)** 原有 11:牛仔布/针织/皮质/纯棉/羊毛/丝绸/雪纺/麻料/蕾丝/尼龙/灯芯绒 新增 6:天鹅绒/缎面/网纱/羊羔绒/PU皮/磨毛棉 描述规范:强调表面质感特征(如天鹅绒"soft plush velvet surface, rich deep sheen";缎面"smooth glossy satin sheen, silky shine";网纱"sheer mesh tulle";羊羔绒"fluffy fleece";磨毛棉"brushed soft cotton, slightly fuzzy surface"),区分真皮与 PU 皮的光泽差异。 **PATTERN_PROMPTS(19 个)** 原有 10:纯色/条纹/格纹/印花/刺绣/波点/迷彩/扎染/碎花/字母 新增 9:千鸟格/菱格纹/人字纹/拼色块/渐变/豹纹/蕾丝花纹/几何图案/logo图案 描述规范:强调图案构成方式(如千鸟格"houndstooth check, small broken zigzag checks";菱格纹"argyle diamond pattern";人字纹"herringbone zigzag weave";拼色块"color blocking, contrasting solid color panels")。 **新增 THICKNESS_PROMPTS(4 档)**:薄(sheer lightweight summer)/适中(regular medium weight)/厚(thick warm winter)/加厚(heavily padded down, quilted thick insulation)。适用:上装/下装/连衣裙/外套/鞋。 **新增 SLEEVE_TYPE_PROMPTS(8 档)**:无袖/吊带/短袖/中袖/长袖/喇叭袖/泡泡袖/落肩袖。描述强调袖长比例与袖型结构(喇叭袖"flared bell sleeve widening at cuff",泡泡袖"puffed voluminous sleeve with gathered shoulder",落肩袖"dropped shoulder seam, relaxed slouchy sleeve")。适用:上装/连衣裙/外套。 **新增 CLOTHES_TYPE_PROMPTS(5 档)**:短款/常规/中长/长款/超长款。描述以身体参照点界定衣长(短款"ends above waist, cropped";中长"mid-thigh to knee";超长"ankle-length or floor-length, maxi")。适用:上装/下装/连衣裙/外套。 **新增 NECKLINE_PROMPTS(10 档)**:圆领/V领/方领/高领/翻领/立领/一字领/挂脖/连帽/娃娃领。描述强调领口形状与领部结构(方领"square shaped neckline with straight edges",立领"standing band collar, mandarin collar",挂脖"halter neck with straps behind neck",娃娃领"peter pan collar, flat rounded collar")。适用:上装/连衣裙/外套。 **新增 FORMALITY_PROMPTS(5 档)**:标签(非常休闲/休闲/轻正式/商务正式/非常正式)对应等级 1-5,返回 `formality="1"~"5"` 字符串 + `formality_label` 中文标签。描述用场景锚定(如 5"evening gown, tuxedo, ceremonial formal wear";1"sporty gym wear, beach casual")。 **新增 OCCASION_PROMPTS(10 档)**:日常通勤/运动健身/约会聚会/正式商务/居家休闲/度假旅游/户外活动/派对夜店/校园上课/婚礼宴会。取置信度达标的 top-N(如置信度不低于 top1 的 60%)用逗号连接返回 occasions 字符串。 **新增 VISUAL_IMPACT_PROMPTS(5 档)**:标签(低调/平淡/适中/亮眼/高调)对应等级 1-5,返回 `visual_impact="1"~"5"` + `visual_impact_label`。描述锚定视觉特征(如 5"bold neon, glitter, dramatic design";1"plain neutral minimal")。 ### 响应结构(对齐 model) ``` { "category_main": "上装", "category_sub": "针织衫", "style": "韩系风", "color_main": "宝蓝", "color_sub": "白色", "thickness": "适中", "version": "修身", "material": "针织", "pattern": "条纹", "sleeve_type": "长袖", "clothes_type": "常规", "neckline_type": "圆领", "formality": "3", "formality_label": "轻正式", "occasions": "日常通勤,约会聚会", "visual_impact": "3", "visual_impact_label": "适中", "details": { "...各组 Top-5 明细,按新字段命名,含置信度..." } } ``` ### 实现要点 - **性能**:前向 7 次 → 1 次(约 210 文本,CLIP 单 batch 可承受,CPU 场景收益最大);避免每组重复 tokenize 开销 - **等价性**:按组 softmax 与逐组调用结果一致;子类别"组内 top1"与两阶段 argmax 完全一致 - **健壮性**:`_classify_all` 用 start/end 边界切片防顺序错乱;大类不在适用性表中时安全回退(维度置空、子类别为空) - **可维护性**:新增维度只需加 dict 项 + 注册分组,无需改前向逻辑;/healthz 保留;docstring 同步更新 - **预处理**:仅当图片含 alpha 通道(PNG)才合成白底,JPEG 直接转 RGB ## 目录结构 ``` thirdparty/ └── classification_server/ └── main.py # [MODIFY] 唯一改动文件 # 1. 扩充 6 组已有 prompt(颜色30/子类别60/风格25/版型6/材质17/图案19) # 2. 新增 7 组维度 prompt + DIMENSION_APPLICABILITY + 副色阈值常量 # 3. 新增 _classify_all 单次批量前向(替代逐组 _classify_group 循环) # 4. 重写 /classify 接口:批量前向、副色提取、适用性置空、响应对齐 model # 5. 优化图片预处理:检测 alpha 后才合成白底 ```