NAS变身AI智能衣柜:零成本打造私人穿搭助理,告别每日搭配烦恼
每天早上打开满满当当的衣柜,你是否也常常陷入“今天穿什么”的灵魂拷问?穿衣选择困难几乎人人都有,衣服越买越多,管理越来越难,翻遍衣架也凑不出一套满意的搭配。如果你正好也有这类烦恼,不妨来看看本期介绍的 AIWardrobe 项目,或许它能成为拯救你早起纠结的贴心助理。

部署和使用过程中若遇到异常,请翻阅文末的常见问题部分,大部分卡点都能迎刃而解。
项目简介
项目全称 leoz9/AIWardrobe,你可以在 GitHub 上直接搜索找到它。
AIWardrobe 是一套开源的 AI 智能衣橱系统,主要能力包括:录入衣物、批量上传衣照、AI 自动识别衣服属性、虚拟衣柜管理,以及结合实时天气和用户场景自动生成穿搭推荐。
核心功能亮点
- 智能图片上传:上传衣服照片后,自动调用 rembg 去掉背景,并由视觉模型识别服装的品类、颜色与风格标签。
- 天气感知穿搭:对接 Open-Meteo 全球免费天气接口,能根据当日天气实时调整搭配建议,让你穿得既得体又应季。
- 虚拟衣橱管理:以卡片或列表形式结构化展示衣橱,支持浏览、搜索和分类检索所有衣物。
- AI 个性推荐:兼容 Gemini 与 OpenAI 风格的接口,可自由选择大模型来生成个性化穿搭方案。
- 全设备适配界面:基于 Tailwind CSS 构建,完美适配桌面、平板和手机等不同尺寸的屏幕。
上手部署
这里以威联通 NAS 为例,直接使用 Docker Compose 一键启动服务。
部署配置参考如下:
services:
aiwardrobe:
image: ghcr.io/leoz9/aiwardrobe:latest
container_name: ai_wardrobe
restart: unless-stopped
ports:
- "8000:8000" # 建议先别改
environment:
DB_FILE_PATH: /app/backend/data/wardrobe.db
# Gemini 可选。如果不用 Gemini,可以先留空。
GEMINI_API_KEY: ""
# 和风天气 API。没有的话可以先留空,但天气相关功能可能不可用。
QWEATHER_API_KEY: ""
QWEATHER_API_HOST: devapi.qweather.com
volumes:
- /share/Container/aiwardrobe/backend/uploads:/app/backend/uploads # 衣物图片目录
- /share/Container/aiwardrobe/backend/data:/app/backend/data # 数据库目录
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
在威联通 Container Station 中新建应用,将上述内容粘贴进去,启动即可。
实际使用体验
部署完成后,在浏览器地址栏输入 NAS_IP:8000 就能进入衣橱界面。随着作者的持续更新,现在的 UI 更偏向移动端交互,用手机打开体验尤其顺畅。

点开右上角设置,先完成 AI 相关配置。这里尤其要注意:模型名称必须选择支持图片输入的视觉模型。纯文本模型或仅支持文本的 OAI-compatible 接口在这里行不通,因为 AIWardrobe 在识别衣物图片时需要将图像内容发送给模型进行理解。

下方的“抠图”配置,默认显示的是第二个选项,但它并没有可用额度。直接切换到“本地离线”模式即可,此处的抠图能力也依赖于前面配置的 AI 模型。

一切准备就绪后,即可挑选衣服图片进行上传。支持一次批量倒入多件,如果你想为每件衣物单独精细化设定标签,那么一张张上传会更可靠。

这里用几张网图来演示效果。

图片上传后会自动完成抠图、命名以及标签分类,整体识别效果相当不错。


在“随机穿搭”模块,还可以查看系统自动组合出的搭配方案。

首页信息概览会展示衣橱的统计数据和天气概况。

到了最核心的 AI 穿搭推荐部分,只需输入你期望的穿着场景,系统就会综合实时天气、衣橱里的衣物、场景需求以及你的“幸运色”等多维信息,为你分析出一套有板有眼的搭配方案。

AI 给出的分析结果头头是道,看起来还真像那么回事,有趣又实用。


常见问题与排错
这些也是我自己踩过的坑,图片相关的问题已在前面顺带交代,这里再补充两个高频卡点。
端口改动建议
端口映射建议直接保持 8000:8000,不要轻易改成 8008:8000 之类的自定义映射。
如果确实有修改端口的需要,你必须将项目文件 git clone 到本地,然后编辑 frontend/src/utils/api.js,将:
export const API_ORIGIN = `http://${window.location.hostname}:8000`
修改为:
export const API_ORIGIN = window.location.origin
保存后自行构建镜像进行部署,才能让前端正确调用后端接口。
穿搭推荐无法生成
有时页面能正常打开,天气和衣橱数据也能顺利加载,但点击“生成今日穿搭推荐”后没有任何反应。查看后端日志会发现推荐接口返回 500 错误,核心报错为 NameError: name 'build_color_tokens' is not defined。这属于代码只调用了函数却缺少函数定义的临时 bug,我们可以手动打一个补丁。
通过 SSH 登录 NAS,执行下面这段命令,执行完重启容器即可(首次执行会自动备份原始文件):
docker exec -i ai_wardrobe python - <<'PY'
from pathlib import Path
path = Path("/app/backend/services/recommendation.py")
text = path.read_text(encoding="utf-8")
backup = Path("/app/backend/services/recommendation.py.bak")
if not backup.exists():
backup.write_text(text, encoding="utf-8")
patch = r'''
COLOR_ALIASES = {
"黑": {"黑", "黑色", "black", "dark"},
"白": {"白", "白色", "white", "ivory", "米白"},
"灰": {"灰", "灰色", "gray", "grey"},
"蓝": {"蓝", "蓝色", "blue", "navy", "藏青", "牛仔"},
"红": {"红", "红色", "red", "wine", "酒红"},
"粉": {"粉", "粉色", "pink"},
"紫": {"紫", "紫色", "purple", "violet"},
"绿": {"绿", "绿色", "green", "olive", "军绿"},
"黄": {"黄", "黄色", "yellow"},
"橙": {"橙", "橙色", "orange"},
"棕": {"棕", "棕色", "brown", "咖啡", "卡其", "khaki"},
"米": {"米", "米色", "beige", "cream"},
"金": {"金", "金色", "gold"},
"银": {"银", "银色", "silver"},
}
ACCESSORY_KEYWORDS = {
"帽", "帽子", "围巾", "手套", "腰带", "皮带", "包", "背包", "项链",
"手链", "耳环", "耳饰", "戒指", "手表", "眼镜", "墨镜", "accessory",
"hat", "scarf", "belt", "bag", "watch", "necklace", "bracelet",
"ring", "glasses", "sunglasses"
}
def build_color_tokens(lucky_color: str) -> set[str]:
raw = (lucky_color or "").strip().lower()
if not raw:
return set()
tokens = {raw}
for canonical, aliases in COLOR_ALIASES.items():
alias_set = {str(alias).strip().lower() for alias in aliases}
if raw in alias_set or canonical in raw or any(alias in raw for alias in alias_set):
tokens.update(alias_set)
tokens.add(canonical)
return {token for token in tokens if token}
'''
if "def build_color_tokens" not in text:
marker = "def score_item("
if marker not in text:
raise SystemExit("没有找到 def score_item,未修改文件")
text = text.replace(marker, patch + "\n" + marker, 1)
if "ACCESSORY_KEYWORDS" not in text:
marker = "def extract_wardrobe_accessories("
if marker in text:
text = text.replace(marker, "ACCESSORY_KEYWORDS = set()\n\n" + marker, 1)
path.write_text(text, encoding="utf-8")
print("patched")
PY
打完补丁后重启容器,推荐功能应当恢复正常。
结语
AI 的能力正在向日常生活深处渗透,越来越多的实用小项目也在社区中涌现。希望未来能看到更多像 AIWardrobe 这样接地气又有趣的开源作品,让技术真正为生活带来便利与乐趣。