衣柜 AI 化,真能省事?

每天早上手忙脚乱找衣服?tandpfun/wardrobe 用 gpt-image 把你的衣柜一键抠图归档,1206 star 不是白来的,但本地部署的坑真不少。

源仓库: tandpfun/wardrobe

一夜爆火的衣柜革命,到底在干啥

tandpfun/wardrobe 在 2026 年 7 月 21 日登上 GitHub Trending,拿下 1206 颗 star。它的核心卖点只有一句话:拍一张衣柜照片,让 gpt-image 自动把每件衣服抠出来,按品类、颜色、季节归档。背后用的不是传统 CV pipeline,而是 OpenAI 的 gpt-image-1 多模态识别能力,模型既能理解”这是件亚麻衬衫”,也能输出带透明背景的 PNG 切片。

为什么现在火?因为 GPT-4o 的图像理解接口开放后,“非结构化图片 → 结构化数据”的门槛瞬间降到零。以前要写 YOLO + CLIP + 人工分类三件套,现在一句 prompt 就能拿到 JSON 标注。开发者圈炸锅的不是项目本身,而是”还能这么玩”的范式冲击——下一个被改造的会是什么?

开发者真正在问的几个问题

Q1:gpt-image 抠图准确度到底行不行?

现象:很多人上传杂乱堆叠的衣物,识别结果把袖子和裤腿连成一片,或者把衣架当成衣服。

根因:gpt-image-1 偏语义理解,对像素级分割并不擅长,复杂遮挡下召回率掉到 60% 左右。

解法:项目里用两段式 prompt,第一段先让模型列出”看到的衣物清单 + 边界框坐标”,第二段再按 bbox 单独抠图:

from openai import OpenAI
client = OpenAI()

# 第一步:检测
detection = client.responses.create(
    model="gpt-image-1",
    input=[{
        "role": "user",
        "content": [{"type": "input_image", "image_url": img_url},
                    {"type": "input_text",
                     "text": "List every garment with a JSON bbox [y1,x1,y2,x2] in 0-1000 normalized coords."}]
    }],
    modalities=["text"]
).output_text

# 第二步:逐件抠图
for item in json.loads(detection)["garments"]:
    cropped = client.images.edit(
        model="gpt-image-1",
        image=open("closet.jpg", "rb"),
        mask=make_mask(item["bbox"]),
        prompt="Cut out only this garment on transparent background"
    )

Q2:批量处理几十张图,API 配额扛不住?

现象:full closet 扫描一次调几十次接口,月费轻松破百刀。

根因:每次抠图都是一次独立推理,没有利用上下文复用。

解法:仓库的 batch_pipeline.py 用了”先全图枚举、再异步并发”策略,把 detection 调用降到 1 次:

import asyncio
from wardrobe.batch import process_basket

async def main():
    jobs = ["hangers/" + f for f in os.listdir("hangers")]
    results = await asyncio.gather(*[process_basket(p) for p in jobs])
    save_index(results)

asyncio.run(main())

省钱诀窍是只对检测阶段用 gpt-image-1,分类阶段降级到 gpt-4o-mini,成本直降 80%。

Q3:本地没 OpenAI key 怎么办?

现象:很多用户想完全离线跑,但项目默认强依赖云端。

根因:作者把 gpt-image 当作”质量锚点”,本地模型兜不住边缘 case。

解法:fork 后可换成 InternVL2.5 或 Qwen2.5-VL 做 detection,再调用 SAM2 做 mask,社区已经出了 PR 把接口抽象成 Backend 类:

# config.yaml
backend:
  detector: "internvl"
  segmenter: "sam2"
  fallback: "gpt-image-1"

混合模式即本地跑 90%,剩下的 10% 模糊样本走云端兜底。

Q4:分类体系怎么定义?季节风格谁说了算?

现象:默认分类只有 top/bottom/outerwear 三类,没法区分正装和运动。

根因:分类 schema 写死在 prompt 里,扩展需要改代码。

解法:自定义 schema 注入 system prompt 即可:

schema = {
    "category": ["shirt","pants","dress","knit","activewear"],
    "formality": ["casual","business","formal"],
    "season": ["spring","summer","fall","winter","all"]
}
prompt = f"Classify each garment using this schema: {schema}. Return JSON."

Q5:识别结果怎么变成可消费的数据?

现象:很多人卡在”识别完了,然后呢?”。

根因:仓库只到 JSON 落盘,没有下游应用。

解法:导出 SQLite + CLIP embedding,配一个简单的 outfit recommender:

import sqlite3, clip, torch
con = sqlite3.connect("closet.db")
model, preprocess = clip.load("ViT-B/32")
for row in con.execute("SELECT id, path FROM items"):
    img = preprocess(Image.open(row[1])).unsqueeze(0)
    emb = model.encode_image(img).detach().numpy()
    con.execute("UPDATE items SET emb=? WHERE id=?", (emb.tobytes(), row[0]))

拿到 embedding 后,向量检索就能根据天气、活动推荐搭配。

写在最后

wardrobe 项目的爆火印证了一个趋势:当多模态大模型把”看见”这件事变得免费,剩下的想象空间就完全看开发者怎么接。作者很克制,没有做电商导购、没有做 OOTD 社交,只是把基础设施做到位。这种”少即是多”的开源姿态,正是它能在 Trending 上站住脚的原因。准备动手的同学,先从十件衬衫开始,别一上来就扫整个衣柜——你会发现,“整理衣服”这件事最难的不是 AI,而是你自己到底有几件白 T 恤。