衣柜 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 恤。