12 KiB
name, overview, todos
| name | overview | todos | |||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| classify-service-align-clothes-model | 根据 mysqlmodel.Clothes 的 15 个分类维度字段,全面重构 thirdparty/classification_server/main.py 分类服务:所有维度(含已有)的 prompt 大幅扩充至全面覆盖各种情况,补齐 8 个缺失分类维度,响应字段命名与 model 对齐,并将多次模型前向推理合并为单次批量前向以提升性能。 |
|
产品概述
根据 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,不引入新依赖
实现方案
核心策略
- Prompt 维度全覆盖:已有 6 组 prompt 扩充 + 新增 7 组维度 prompt,全部收敛为统一 dict 结构
- 单次批量前向:新增
_classify_all,全部组(约 210 个文本)拼一个 batch 一次推理,输出 logits 按组 start/end 边界切分后分别 softmax - 子类别等价合并:所有大类子类别合并进同一批前向,大类确定后在其组内取 top1——同组内相对分数不变,argmax 与当前两阶段方案数学等价
- 适用性映射:
DIMENSION_APPLICABILITY表声明各维度适用的大类,不适用直接返回空字符串 - 副颜色逻辑:颜色组 top-2,第二置信度达到阈值(top1 的 40% 与绝对值 0.15 取较低者)才输出 color_sub
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 后才合成白底